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

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 23 11:30:18 PDT 2017


If you are not particularly interested in doing it yourself, I can do that
for you based on your patch.

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/e4828ed5/attachment.html>


More information about the llvm-commits mailing list