mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-01 14:58:18 +00:00
[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
This commit is contained in:
parent
462403a5c8
commit
f3fb7fac32
@ -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);
|
||||
|
21
lld/test/COFF/lib-module-asm.ll
Normal file
21
lld/test/COFF/lib-module-asm.ll
Normal file
@ -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
|
Loading…
x
Reference in New Issue
Block a user