[lld] r327561 - [COFF] Add support for the GNU ld flag --kill-at

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 14 14:18:13 PDT 2018


Ah, I didn't notice that you've already fix it in r327567.


On Wed, Mar 14, 2018 at 2:13 PM Rui Ueyama <ruiu at google.com> wrote:

> Let me roll this back to fix the build. Feel free to re-submit after
> fixing the issue.
>
>
> On Wed, Mar 14, 2018 at 2:11 PM Rui Ueyama <ruiu at google.com> wrote:
>
>> Looks like a new test is failing. This is a log on my machine.
>>
>> Command Output (stderr):
>> --
>> /ssd/b/bin/lld-link: error: could not open
>> /ssd/b/tools/lld/test/COFF/Output/def-export-stdcall.s.tmp.deco-mingw.def:
>> No such file or directory
>>
>>
>> On Wed, Mar 14, 2018 at 1:19 PM Martin Storsjo via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Author: mstorsjo
>>> Date: Wed Mar 14 13:17:16 2018
>>> New Revision: 327561
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=327561&view=rev
>>> Log:
>>> [COFF] Add support for the GNU ld flag --kill-at
>>>
>>> GNU ld has got a number of different flags for adjusting how to
>>> behave around stdcall functions. The --kill-at flag strips the
>>> trailing sdcall suffix from exported functions (which otherwise
>>> is included by default in MinGW setups).
>>>
>>> This also strips it from the corresponding import library though.
>>> That makes it hard to link to such an import library from code
>>> that calls the functions - but this matches what GNU ld does with
>>> this flag. Therefore, this flag is probably not sensibly used
>>> together with import libraries, but probably mostly when creating
>>> some sort of plugin, or if creating the import library separately
>>> with dlltool.
>>>
>>> Differential Revision: https://reviews.llvm.org/D44292
>>>
>>> Modified:
>>>     lld/trunk/COFF/Config.h
>>>     lld/trunk/COFF/Driver.cpp
>>>     lld/trunk/COFF/DriverUtils.cpp
>>>     lld/trunk/COFF/Options.td
>>>     lld/trunk/test/COFF/def-export-stdcall.s
>>>
>>> Modified: lld/trunk/COFF/Config.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.h?rev=327561&r1=327560&r2=327561&view=diff
>>>
>>> ==============================================================================
>>> --- lld/trunk/COFF/Config.h (original)
>>> +++ lld/trunk/COFF/Config.h Wed Mar 14 13:17:16 2018
>>> @@ -190,6 +190,7 @@ struct Configuration {
>>>    bool WarnMissingOrderSymbol = true;
>>>    bool WarnLocallyDefinedImported = true;
>>>    bool Incremental = true;
>>> +  bool KillAt = false;
>>>  };
>>>
>>>  extern Configuration *Config;
>>>
>>> Modified: lld/trunk/COFF/Driver.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=327561&r1=327560&r2=327561&view=diff
>>>
>>> ==============================================================================
>>> --- lld/trunk/COFF/Driver.cpp (original)
>>> +++ lld/trunk/COFF/Driver.cpp Wed Mar 14 13:17:16 2018
>>> @@ -1073,6 +1073,10 @@ void LinkerDriver::link(ArrayRef<const c
>>>    if (Args.hasArg(OPT_lldsavetemps))
>>>      Config->SaveTemps = true;
>>>
>>> +  // Handle /kill-at
>>> +  if (Args.hasArg(OPT_kill_at))
>>> +    Config->KillAt = true;
>>> +
>>>    // Handle /lldltocache
>>>    if (auto *Arg = Args.getLastArg(OPT_lldltocache))
>>>      Config->LTOCache = Arg->getValue();
>>>
>>> Modified: lld/trunk/COFF/DriverUtils.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/DriverUtils.cpp?rev=327561&r1=327560&r2=327561&view=diff
>>>
>>> ==============================================================================
>>> --- lld/trunk/COFF/DriverUtils.cpp (original)
>>> +++ lld/trunk/COFF/DriverUtils.cpp Wed Mar 14 13:17:16 2018
>>> @@ -582,6 +582,26 @@ static StringRef undecorate(StringRef Sy
>>>    return Sym.startswith("_") ? Sym.substr(1) : Sym;
>>>  }
>>>
>>> +// Convert stdcall/fastcall style symbols into unsuffixed symbols,
>>> +// with or without a leading underscore. (MinGW specific.)
>>> +static StringRef killAt(StringRef Sym, bool Prefix) {
>>> +  if (Sym.empty())
>>> +    return Sym;
>>> +  // Strip any trailing stdcall suffix
>>> +  Sym = Sym.substr(0, Sym.find('@', 1));
>>> +  if (!Sym.startswith("@")) {
>>> +    if (Prefix && !Sym.startswith("_"))
>>> +      return Saver.save("_" + Sym);
>>> +    return Sym;
>>> +  }
>>> +  // For fastcall, remove the leading @ and replace it with an
>>> +  // underscore, if prefixes are used.
>>> +  Sym = Sym.substr(1);
>>> +  if (Prefix)
>>> +    Sym = Saver.save("_" + Sym);
>>> +  return Sym;
>>> +}
>>> +
>>>  // Performs error checking on all /export arguments.
>>>  // It also sets ordinals.
>>>  void fixupExports() {
>>> @@ -614,6 +634,15 @@ void fixupExports() {
>>>      }
>>>    }
>>>
>>> +  if (Config->KillAt && Config->Machine == I386) {
>>> +    for (Export &E : Config->Exports) {
>>> +      E.Name = killAt(E.Name, true);
>>> +      E.ExportName = killAt(E.ExportName, false);
>>> +      E.ExtName = killAt(E.ExtName, true);
>>> +      E.SymbolName = killAt(E.SymbolName, true);
>>> +    }
>>> +  }
>>> +
>>>    // Uniquefy by name.
>>>    DenseMap<StringRef, Export *> Map(Config->Exports.size());
>>>    std::vector<Export> V;
>>>
>>> Modified: lld/trunk/COFF/Options.td
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Options.td?rev=327561&r1=327560&r2=327561&view=diff
>>>
>>> ==============================================================================
>>> --- lld/trunk/COFF/Options.td (original)
>>> +++ lld/trunk/COFF/Options.td Wed Mar 14 13:17:16 2018
>>> @@ -126,6 +126,7 @@ def help_q : Flag<["/?", "-?"], "">, Ali
>>>  def debug_ghash : F<"debug:ghash">;
>>>  def debug_dwarf : F<"debug:dwarf">;
>>>  def export_all_symbols : F<"export-all-symbols">;
>>> +def kill_at : F<"kill-at">;
>>>  def lldmingw : F<"lldmingw">;
>>>  def msvclto : F<"msvclto">;
>>>  def output_def : Joined<["/", "-"], "output-def:">;
>>>
>>> Modified: lld/trunk/test/COFF/def-export-stdcall.s
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/def-export-stdcall.s?rev=327561&r1=327560&r2=327561&view=diff
>>>
>>> ==============================================================================
>>> --- lld/trunk/test/COFF/def-export-stdcall.s (original)
>>> +++ lld/trunk/test/COFF/def-export-stdcall.s Wed Mar 14 13:17:16 2018
>>> @@ -44,7 +44,8 @@
>>>  # DECORATED-EXPORTS: Name: vectorcall@@8
>>>
>>>
>>> -# RUN: echo -e "LIBRARY foo\nEXPORTS\n  stdcall at 8\n  @fastcall at 8" >
>>> %t.def
>>> +# GNU tools don't support vectorcall at the moment, but test it for
>>> completeness.
>>> +# RUN: echo -e "LIBRARY foo\nEXPORTS\n  stdcall at 8\n  @fastcall at 8\n
>>> vectorcall@@8" > %t.def
>>>  # RUN: lld-link -lldmingw -entry:dllmain -dll -def:%t.def %t.obj
>>> -out:%t.dll -implib:%t.lib
>>>  # RUN: llvm-readobj %t.lib | FileCheck -check-prefix
>>> DECORATED-MINGW-IMPLIB %s
>>>  # RUN: llvm-readobj -coff-exports %t.dll | FileCheck -check-prefix
>>> DECORATED-MINGW-EXPORTS %s
>>> @@ -55,9 +56,39 @@
>>>  # DECORATED-MINGW-IMPLIB: Name type: noprefix
>>>  # DECORATED-MINGW-IMPLIB-NEXT: __imp__stdcall at 8
>>>  # DECORATED-MINGW-IMPLIB-NEXT: _stdcall at 8
>>> +# GNU tools don't support vectorcall, but this test is just to track
>>> that
>>> +# lld's behaviour remains consistent over time.
>>> +# DECORATED-MINGW-IMPLIB: Name type: name
>>> +# DECORATED-MINGW-IMPLIB-NEXT: __imp_vectorcall@@8
>>> +# DECORATED-MINGW-IMPLIB-NEXT: vectorcall@@8
>>>
>>>  # DECORATED-MINGW-EXPORTS: Name: @fastcall at 8
>>>  # DECORATED-MINGW-EXPORTS: Name: stdcall at 8
>>> +# DECORATED-MINGW-EXPORTS: Name: vectorcall@@8
>>> +
>>> +# RUN: lld-link -lldmingw -kill-at -entry:dllmain -dll
>>> -def:%t.deco-mingw.def %t.obj -out:%t.dll -implib:%t.lib
>>> +# RUN: llvm-readobj %t.lib | FileCheck -check-prefix
>>> MINGW-KILL-AT-IMPLIB %s
>>> +# RUN: llvm-readobj -coff-exports %t.dll | FileCheck -check-prefix
>>> MINGW-KILL-AT-EXPORTS %s
>>> +
>>> +# RUN: lld-link -lldmingw -kill-at -entry:dllmain -dll %t.obj
>>> -out:%t.dll -implib:%t.lib
>>> +# RUN: llvm-readobj %t.lib | FileCheck -check-prefix
>>> MINGW-KILL-AT-IMPLIB %s
>>> +# RUN: llvm-readobj -coff-exports %t.dll | FileCheck -check-prefix
>>> MINGW-KILL-AT-EXPORTS %s
>>> +
>>> +# MINGW-KILL-AT-IMPLIB: Name type: noprefix
>>> +# MINGW-KILL-AT-IMPLIB: __imp__fastcall
>>> +# MINGW-KILL-AT-IMPLIB-NEXT: _fastcall
>>> +# MINGW-KILL-AT-IMPLIB: Name type: noprefix
>>> +# MINGW-KILL-AT-IMPLIB-NEXT: __imp__stdcall
>>> +# MINGW-KILL-AT-IMPLIB-NEXT: _stdcall
>>> +# GNU tools don't support vectorcall, but this test is just to track
>>> that
>>> +# lld's behaviour remains consistent over time.
>>> +# MINGW-KILL-AT-IMPLIB: Name type: noprefix
>>> +# MINGW-KILL-AT-IMPLIB-NEXT: __imp__vectorcall
>>> +# MINGW-KILL-AT-IMPLIB-NEXT: _vectorcall
>>> +
>>> +# MINGW-KILL-AT-EXPORTS: Name: fastcall
>>> +# MINGW-KILL-AT-EXPORTS: Name: stdcall
>>> +# MINGW-KILL-AT-EXPORTS: Name: vectorcall
>>>
>>>
>>>          .def     _stdcall at 8;
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180314/c86d0c13/attachment.html>


More information about the llvm-commits mailing list