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

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 21 16:40:15 PDT 2017


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


More information about the llvm-commits mailing list