[PATCH] ldd::COFF: better behavior when using as a library

Andrew Kelley via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 23 12:00:44 PDT 2017


On Mon, Oct 23, 2017 at 2:48 PM, Rui Ueyama <ruiu at google.com> wrote:

> I just wanted to help you because it seems easy for me to make a change
> because I know a lot about lld, and you seems to be busy on Zig language
> itself. I'll update your patch and send it to you for review.
>

Thanks Rui, I appreciate that very much.


>
> On Mon, Oct 23, 2017 at 11:40 AM, Andrew Kelley <superjoe30 at gmail.com>
> wrote:
>
>>
>>
>> On Mon, Oct 23, 2017 at 2:30 PM, Rui Ueyama <ruiu at google.com> wrote:
>>
>>> If you are not particularly interested in doing it yourself, I can do
>>> that for you based on your patch.
>>>
>>
>> Sorry for the delay. I've been trying to get a moment to test and submit
>> the revision.
>>
>> If you're willing to do it, that's easiest for me.
>>
>>
>>>
>>> On Oct 21, 2017 4:40 PM, "Rui Ueyama" <ruiu at google.com> wrote:
>>>
>>>> Thank you for doing this.
>>>>
>>>> Can you take a look at ELF/Driver.cpp? elf::link has `CanExitEarly`
>>>> parameter. We should add the same parameter to coff::link so that two
>>>> functions have the same interface.
>>>>
>>>> On Sat, Oct 21, 2017 at 12:45 PM, Andrew Kelley via llvm-commits <
>>>> llvm-commits at lists.llvm.org> wrote:
>>>>
>>>>> Previously, the COFF driver would call exit(0) when called as
>>>>> a library. Now there is a global function setLibraryMode()
>>>>> which causes link() to return on success.
>>>>>
>>>>> Furthermore, link() calls freeArena() before returning, to
>>>>> clean up resources.
>>>>> ---
>>>>>  lld/COFF/Driver.cpp | 27 +++++++++++++++++++++++----
>>>>>  lld/COFF/Driver.h   |  2 ++
>>>>>  2 files changed, 25 insertions(+), 4 deletions(-)
>>>>>
>>>>>
>>>>> diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
>>>>> index c039740715c..a769196e8b8 100644
>>>>> --- a/lld/COFF/Driver.cpp
>>>>> +++ b/lld/COFF/Driver.cpp
>>>>> @@ -46,6 +46,12 @@ using llvm::sys::Process;
>>>>>  namespace lld {
>>>>>  namespace coff {
>>>>>
>>>>> +
>>>>> +static bool IsLibraryMode = false;
>>>>> +void setLibraryMode(void) {
>>>>> +  IsLibraryMode = true;
>>>>> +}
>>>>> +
>>>>>  Configuration *Config;
>>>>>  LinkerDriver *Driver;
>>>>>
>>>>> @@ -65,6 +71,7 @@ bool link(ArrayRef<const char *> Args, raw_ostream
>>>>> &Diag) {
>>>>>
>>>>>    Driver = make<LinkerDriver>();
>>>>>    Driver->link(Args);
>>>>> +  freeArena();
>>>>>    return !ErrorCount;
>>>>>  }
>>>>>
>>>>> @@ -1077,7 +1084,11 @@ void LinkerDriver::link(ArrayRef<const char *>
>>>>> ArgsArr) {
>>>>>    if (!Args.hasArg(OPT_INPUT)) {
>>>>>      fixupExports();
>>>>>      createImportLibrary(/*AsLib=*/true);
>>>>> -    exit(0);
>>>>> +    if (IsLibraryMode) {
>>>>> +      return;
>>>>> +    } else {
>>>>> +      exit(0);
>>>>> +    }
>>>>>    }
>>>>>
>>>>>    // Handle /delayload
>>>>> @@ -1169,7 +1180,11 @@ void LinkerDriver::link(ArrayRef<const char *>
>>>>> ArgsArr) {
>>>>>    // This is useful because MSVC link.exe can generate complete PDBs.
>>>>>    if (Args.hasArg(OPT_msvclto)) {
>>>>>      invokeMSVC(Args);
>>>>> -    exit(0);
>>>>> +    if (IsLibraryMode) {
>>>>> +      return;
>>>>> +    } else {
>>>>> +      exit(0);
>>>>> +    }
>>>>>    }
>>>>>
>>>>>    // Do LTO by compiling bitcode input files to a set of native COFF
>>>>> files then
>>>>> @@ -1267,8 +1282,12 @@ void LinkerDriver::link(ArrayRef<const char *>
>>>>> ArgsArr) {
>>>>>    if (ErrorCount)
>>>>>      return;
>>>>>
>>>>> -  // Call exit to avoid calling destructors.
>>>>> -  exit(0);
>>>>> +  if (IsLibraryMode) {
>>>>> +    return
>>>>> +  } else {
>>>>> +    // Call exit to avoid calling destructors.
>>>>> +    exit(0);
>>>>> +  }
>>>>>  }
>>>>>
>>>>>  } // namespace coff
>>>>> diff --git a/lld/COFF/Driver.h b/lld/COFF/Driver.h
>>>>> index df54fc1e45e..c1c0f36b011 100644
>>>>> --- a/lld/COFF/Driver.h
>>>>> +++ b/lld/COFF/Driver.h
>>>>> @@ -35,6 +35,8 @@ using llvm::COFF::MachineTypes;
>>>>>  using llvm::COFF::WindowsSubsystem;
>>>>>  using llvm::Optional;
>>>>>
>>>>> +void setLibraryMode(void);
>>>>> +
>>>>>  // Implemented in MarkLive.cpp.
>>>>>  void markLive(const std::vector<Chunk *> &Chunks);
>>>>>
>>>>> _______________________________________________
>>>>> 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/20171023/905dbdd9/attachment.html>


More information about the llvm-commits mailing list