[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