diff options
author | Bob Haarman <llvm@inglorion.net> | 2019-05-08 22:11:02 +0000 |
---|---|---|
committer | Bob Haarman <llvm@inglorion.net> | 2019-05-08 22:11:02 +0000 |
commit | f3fb7fac3232a661ed914f796eb029cc5ce2e3e4 (patch) | |
tree | 8989d4a60b3fcf03177c663c0d798857dd11a0b1 | |
parent | 462403a5c8c67896648c70d3393a2d548b60bff4 (diff) | |
download | bcm5719-llvm-f3fb7fac3232a661ed914f796eb029cc5ce2e3e4.tar.gz bcm5719-llvm-f3fb7fac3232a661ed914f796eb029cc5ce2e3e4.zip |
[lld-link] initialize targets and asmparsers before invoking lib
Summary:
When using lld-link to build static libraries containing object files
with module assembly, the program would crash with "Assertion `T &&
T->hasMCAsmParser()' failed". This change causes the code in lld-link
that initialized Targets, TargetInfos, and AsmParsers (which already
existed) to be run before entering the lib building path (which needs
it). This avoids the error (and is what llvm-lib and llvm-ar do, too).
Fixes PR41803.
Reviewers: ruiu, rnk, hans
Reviewed By: ruiu
Subscribers: llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D61699
llvm-svn: 360295
-rw-r--r-- | lld/COFF/Driver.cpp | 14 | ||||
-rw-r--r-- | lld/test/COFF/lib-module-asm.ll | 21 |
2 files changed, 28 insertions, 7 deletions
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index ef0c4a91168..807bd6f71c9 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -975,6 +975,13 @@ void LinkerDriver::maybeExportMinGWSymbols(const opt::InputArgList &Args) { } void LinkerDriver::link(ArrayRef<const char *> ArgsArr) { + // Needed for LTO. + InitializeAllTargetInfos(); + InitializeAllTargets(); + InitializeAllTargetMCs(); + InitializeAllAsmParsers(); + InitializeAllAsmPrinters(); + // If the first command line argument is "/lib", link.exe acts like lib.exe. // We call our own implementation of lib.exe that understands bitcode files. if (ArgsArr.size() > 1 && StringRef(ArgsArr[1]).equals_lower("/lib")) { @@ -983,13 +990,6 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) { return; } - // Needed for LTO. - InitializeAllTargetInfos(); - InitializeAllTargets(); - InitializeAllTargetMCs(); - InitializeAllAsmParsers(); - InitializeAllAsmPrinters(); - // Parse command line options. ArgParser Parser; opt::InputArgList Args = Parser.parseLINK(ArgsArr); diff --git a/lld/test/COFF/lib-module-asm.ll b/lld/test/COFF/lib-module-asm.ll new file mode 100644 index 00000000000..2b2beba3aef --- /dev/null +++ b/lld/test/COFF/lib-module-asm.ll @@ -0,0 +1,21 @@ +; PR41803: llvm-link /lib on object with module asm crashes +; RUN: rm -f %t.lib +; RUN: llvm-as -o %t.obj %s +; RUN: lld-link /lib /out:%t.lib %t.obj +; RUN: llvm-nm -M %t.lib | FileCheck %s + +target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" +target triple = "i386-pc-windows-msvc19.11.0" + +module asm ".global global_asm_sym" +module asm "global_asm_sym:" +module asm "local_asm_sym:" +module asm ".long undef_asm_sym" + +; CHECK: Archive map +; CHECK-NEXT: global_asm_sym in {{.*}}lib-module-asm.ll.tmp.obj + +; CHECK: lib-module-asm.ll.tmp.obj:{{$}} +; CHECK-NEXT: T global_asm_sym +; CHECK-NEXT: t local_asm_sym +; CHECK-NEXT: U undef_asm_sym |