[llvm] r310990 - [llvm-dlltool] Fix creating stdcall/fastcall import libraries for i386

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 21 16:27:12 PDT 2017


Merged to 5.0 in r311408.

On Tue, Aug 15, 2017 at 10:18 PM, Martin Storsjo via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: mstorsjo
> Date: Tue Aug 15 22:18:36 2017
> New Revision: 310990
>
> URL: http://llvm.org/viewvc/llvm-project?rev=310990&view=rev
> Log:
> [llvm-dlltool] Fix creating stdcall/fastcall import libraries for i386
>
> Hook up the -k option (that in the original GNU dlltool removes the
> @n suffix from the symbol that the final executable ends up linked to).
>
> In llvm-dlltool, make sure that functions end up with the undecorate
> name type if this option is set and they are decorated. In mingw, when
> creating import libraries from def files instead of creating an import
> library as a side effect of linking a DLL, the symbol names in the def
> contain the stdcall/fastcall decoration (but no leading underscore).
>
> By setting the undecorate name type, a linker linking to the import
> library will omit the decoration from the DLL import entry.
>
> With this in place, mingw-w64 for i386 built with llvm-dlltool/clang
> produces import libraries that actually work.
>
> Differential Revision: https://reviews.llvm.org/D36548
>
> Added:
>     llvm/trunk/test/DllTool/coff-decorated.def
> Modified:
>     llvm/trunk/lib/Object/COFFModuleDefinition.cpp
>     llvm/trunk/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp
>     llvm/trunk/lib/ToolDrivers/llvm-dlltool/Options.td
>
> Modified: llvm/trunk/lib/Object/COFFModuleDefinition.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFModuleDefinition.cpp?rev=310990&r1=310989&r2=310990&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Object/COFFModuleDefinition.cpp (original)
> +++ llvm/trunk/lib/Object/COFFModuleDefinition.cpp Tue Aug 15 22:18:36 2017
> @@ -232,7 +232,13 @@ private:
>      for (;;) {
>        read();
>        if (Tok.K == Identifier && Tok.Value[0] == '@') {
> -        Tok.Value.drop_front().getAsInteger(10, E.Ordinal);
> +        if (Tok.Value.drop_front().getAsInteger(10, E.Ordinal)) {
> +          // Not an ordinal modifier at all, but the next export (fastcall
> +          // decorated) - complete the current one.
> +          unget();
> +          Info.Exports.push_back(E);
> +          return Error::success();
> +        }
>          read();
>          if (Tok.K == KwNoname) {
>            E.Noname = true;
>
> Modified: llvm/trunk/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp?rev=310990&r1=310989&r2=310990&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp (original)
> +++ llvm/trunk/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp Tue Aug 15 22:18:36 2017
> @@ -155,6 +155,22 @@ int llvm::dlltoolDriverMain(llvm::ArrayR
>    if (Path.empty())
>      Path = getImplibPath(Def->OutputFile);
>
> +  if (Machine == IMAGE_FILE_MACHINE_I386 && Args.getLastArg(OPT_k)) {
> +    for (COFFShortExport& E : Def->Exports) {
> +      if (E.isWeak() || (!E.Name.empty() && E.Name[0] == '?'))
> +        continue;
> +      E.SymbolName = E.Name;
> +      // Trim off the trailing decoration. Symbols will always have a
> +      // starting prefix here (either _ for cdecl/stdcall, @ for fastcall
> +      // or ? for C++ functions). (Vectorcall functions also will end up having
> +      // a prefix here, even if they shouldn't.)
> +      E.Name = E.Name.substr(0, E.Name.find('@', 1));
> +      // By making sure E.SymbolName != E.Name for decorated symbols,
> +      // writeImportLibrary writes these symbols with the type
> +      // IMPORT_NAME_UNDECORATE.
> +    }
> +  }
> +
>    if (writeImportLibrary(Def->OutputFile, Path, Def->Exports, Machine))
>      return 1;
>    return 0;
>
> Modified: llvm/trunk/lib/ToolDrivers/llvm-dlltool/Options.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ToolDrivers/llvm-dlltool/Options.td?rev=310990&r1=310989&r2=310990&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ToolDrivers/llvm-dlltool/Options.td (original)
> +++ llvm/trunk/lib/ToolDrivers/llvm-dlltool/Options.td Tue Aug 15 22:18:36 2017
> @@ -12,13 +12,13 @@ def D_long : JoinedOrSeparate<["--"], "d
>  def d: JoinedOrSeparate<["-"], "d">, HelpText<"Input .def File">;
>  def d_long : JoinedOrSeparate<["--"], "input-def">, Alias<d>;
>
> +def k: Flag<["-"], "k">, HelpText<"Kill @n Symbol from export">;
> +def k_alias: Flag<["--"], "kill-at">, Alias<k>;
> +
>  //==============================================================================
>  // The flags below do nothing. They are defined only for dlltool compatibility.
>  //==============================================================================
>
> -def k: Flag<["-"], "k">, HelpText<"Kill @n Symbol from export">;
> -def k_alias: Flag<["--"], "kill-at">, Alias<k>;
> -
>  def S: JoinedOrSeparate<["-"], "S">, HelpText<"Assembler">;
>  def S_alias: JoinedOrSeparate<["--"], "as">, Alias<S>;
>
>
> Added: llvm/trunk/test/DllTool/coff-decorated.def
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DllTool/coff-decorated.def?rev=310990&view=auto
> ==============================================================================
> --- llvm/trunk/test/DllTool/coff-decorated.def (added)
> +++ llvm/trunk/test/DllTool/coff-decorated.def Tue Aug 15 22:18:36 2017
> @@ -0,0 +1,26 @@
> +; RUN: llvm-dlltool -k -m i386 --input-def %s --output-lib %t.a
> +; RUN: llvm-readobj %t.a | FileCheck %s
> +; RUN: llvm-nm %t.a | FileCheck %s -check-prefix=CHECK-NM
> +
> +LIBRARY test.dll
> +EXPORTS
> +CdeclFunction
> +StdcallFunction at 4
> + at FastcallFunction@4
> +StdcallAlias at 4=StdcallFunction at 4
> +??_7exception@@6B@
> +
> +; CHECK: Name type: noprefix
> +; CHECK: Symbol: __imp__CdeclFunction
> +; CHECK: Symbol: _CdeclFunction
> +; CHECK: Name type: undecorate
> +; CHECK: Symbol: __imp__StdcallFunction at 4
> +; CHECK: Symbol: _StdcallFunction at 4
> +; CHECK: Name type: undecorate
> +; CHECK: Symbol: __imp_ at FastcallFunction@4
> +; CHECK: Symbol: @FastcallFunction at 4
> +; CHECK: Name type: name
> +; CHECK: Symbol: __imp_??_7exception@@6B@
> +; CHECK: Symbol: ??_7exception@@6B@
> +; CHECK-NM: w _StdcallAlias at 4
> +; CHECK-NM: U _StdcallFunction at 4
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list