summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBob Haarman <llvm@inglorion.net>2019-05-08 22:11:02 +0000
committerBob Haarman <llvm@inglorion.net>2019-05-08 22:11:02 +0000
commitf3fb7fac3232a661ed914f796eb029cc5ce2e3e4 (patch)
tree8989d4a60b3fcf03177c663c0d798857dd11a0b1
parent462403a5c8c67896648c70d3393a2d548b60bff4 (diff)
downloadbcm5719-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.cpp14
-rw-r--r--lld/test/COFF/lib-module-asm.ll21
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
OpenPOWER on IntegriCloud