This is an archive of the discontinued LLVM Phabricator instance.

[LLD] [COFF] Fix up missing stdcall decorations in MinGW mode
ClosedPublic

Authored by mstorsjo on Jun 18 2021, 6:08 AM.

Details

Summary

If linking directly against a DLL without an import library, the
DLL export symbols might not contain stdcall decorations.

If we have an undefined symbol with decoration, and we happen to have
a matching undecorated symbol (which either is lazy and can be loaded,
or already defined), then alias it against that instead.

This matches what's done in reverse, when we have a def file
declaring to export a symbol without decoration, but we only have
a defined decorated symbol. In that case we do a fuzzy match
(SymbolTable::findMangle). This case is more straightforward; if we
have a decorated undefined symbol, just strip the decoration and look
for the corresponding undecorated symbol name.

Add warnings and options for either silencing the warning or disabling
the whole feature, corresponding to how ld.bfd does it.

(This feature works for any symbol decoration mismatch, not only when
linking against a DLL directly; ld.bfd also tolerates it anywhere,
and also fixes up mismatches in the other direction, like
SymbolTable::findMangle, for any symbol, not only exports. But in
practice, at least for lld, it would primarily end up used for linking
against DLLs.)

Diff Detail

Event Timeline

mstorsjo created this revision.Jun 18 2021, 6:08 AM
mstorsjo requested review of this revision.Jun 18 2021, 6:08 AM
Herald added a project: Restricted Project. · View Herald TranscriptJun 18 2021, 6:08 AM
mstorsjo updated this revision to Diff 353173.Jun 18 2021, 11:57 PM

Updated to rerun CI after fixing a test in the base patch

rnk accepted this revision.Jul 1 2021, 1:53 PM

lgtm

lld/test/COFF/link-dll-stdcall.s
80

Test case looks good, thanks!

This revision is now accepted and ready to land.Jul 1 2021, 1:53 PM
This revision was landed with ongoing or failed builds.Jul 1 2021, 11:49 PM
This revision was automatically updated to reflect the committed changes.