mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 22:00:10 +00:00
ThinLTO: Fix inline assembly references to static functions with CFI
Create an internal alias with the original name for static functions that are renamed in promoteInternals to avoid breaking inline assembly references to them. Relands700d07f8ce
with -msvc targets fixed. Link: https://github.com/ClangBuiltLinux/linux/issues/1354 Reviewed By: nickdesaulniers, pcc Differential Revision: https://reviews.llvm.org/D104058 (cherry picked from commit7ce1c4da77
)
This commit is contained in:
parent
7161e4f334
commit
1828e57eb5
@ -33,6 +33,19 @@ using namespace llvm;
|
||||
|
||||
namespace {
|
||||
|
||||
// Determine if a promotion alias should be created for a symbol name.
|
||||
static bool allowPromotionAlias(const std::string &Name) {
|
||||
// Promotion aliases are used only in inline assembly. It's safe to
|
||||
// simply skip unusual names. Subset of MCAsmInfo::isAcceptableChar()
|
||||
// and MCAsmInfoXCOFF::isAcceptableChar().
|
||||
for (const char &C : Name) {
|
||||
if (isAlnum(C) || C == '_' || C == '.')
|
||||
continue;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Promote each local-linkage entity defined by ExportM and used by ImportM by
|
||||
// changing visibility and appending the given ModuleId.
|
||||
void promoteInternals(Module &ExportM, Module &ImportM, StringRef ModuleId,
|
||||
@ -55,6 +68,7 @@ void promoteInternals(Module &ExportM, Module &ImportM, StringRef ModuleId,
|
||||
}
|
||||
}
|
||||
|
||||
std::string OldName = Name.str();
|
||||
std::string NewName = (Name + ModuleId).str();
|
||||
|
||||
if (const auto *C = ExportGV.getComdat())
|
||||
@ -69,6 +83,13 @@ void promoteInternals(Module &ExportM, Module &ImportM, StringRef ModuleId,
|
||||
ImportGV->setName(NewName);
|
||||
ImportGV->setVisibility(GlobalValue::HiddenVisibility);
|
||||
}
|
||||
|
||||
if (isa<Function>(&ExportGV) && allowPromotionAlias(OldName)) {
|
||||
// Create a local alias with the original name to avoid breaking
|
||||
// references from inline assembly.
|
||||
std::string Alias = ".set " + OldName + "," + NewName + "\n";
|
||||
ExportM.appendModuleInlineAsm(Alias);
|
||||
}
|
||||
}
|
||||
|
||||
if (!RenamedComdats.empty())
|
||||
|
@ -131,10 +131,12 @@
|
||||
; RUN: -r=%t1.o,_ZN1D1mEi, \
|
||||
; RUN: -r=%t1.o,test2, \
|
||||
; RUN: -r=%t2.o,_ZN1A1nEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1A1nEi, \
|
||||
; RUN: -r=%t2.o,_ZN1B1fEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1C1fEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1D1mEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1E1mEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1E1mEi, \
|
||||
; RUN: -r=%t2.o,_ZTV1B, \
|
||||
; RUN: -r=%t2.o,_ZTV1C, \
|
||||
; RUN: -r=%t2.o,_ZTV1D, \
|
||||
@ -167,10 +169,12 @@
|
||||
; RUN: -r=%t1.o,_ZN1D1mEi, \
|
||||
; RUN: -r=%t1.o,test2, \
|
||||
; RUN: -r=%t2.o,_ZN1A1nEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1A1nEi, \
|
||||
; RUN: -r=%t2.o,_ZN1B1fEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1C1fEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1D1mEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1E1mEi,p \
|
||||
; RUN: -r=%t2.o,_ZN1E1mEi, \
|
||||
; RUN: -r=%t2.o,_ZTV1B, \
|
||||
; RUN: -r=%t2.o,_ZTV1C, \
|
||||
; RUN: -r=%t2.o,_ZTV1D, \
|
||||
|
@ -0,0 +1,22 @@
|
||||
; REQUIRES: x86-registered-target
|
||||
; RUN: opt -thinlto-bc -thinlto-split-lto-unit -o - %s | llvm-modextract -b -n 0 -o - | llvm-dis | FileCheck %s
|
||||
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
; CHECK: module asm ".set a,a.[[HASH:[0-9a-f]+]]"
|
||||
|
||||
define void @b() {
|
||||
%f = alloca void ()*, align 8
|
||||
; CHECK: store{{.*}} @a.[[HASH]],{{.*}} %f
|
||||
store void ()* @a, void ()** %f, align 8
|
||||
; CHECK: %1 = call void ()* asm sideeffect "leaq a(%rip)
|
||||
%1 = call void ()* asm sideeffect "leaq a(%rip), $0\0A\09", "=r,~{dirflag},~{fpsr},~{flags}"()
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: define{{.*}} @a.[[HASH]](){{.*}} !type
|
||||
define internal void @a() !type !0 {
|
||||
ret void
|
||||
}
|
||||
|
||||
!0 = !{i64 0, !"typeid1"}
|
@ -1,3 +1,4 @@
|
||||
; REQUIRES: x86-registered-target
|
||||
; RUN: opt -thinlto-bc -thinlto-split-lto-unit -o %t %s
|
||||
; RUN: llvm-modextract -b -n 0 -o %t0 %t
|
||||
; RUN: llvm-modextract -b -n 1 -o %t1 %t
|
||||
@ -7,6 +8,8 @@
|
||||
; RUN: llvm-bcanalyzer -dump %t0 | FileCheck --check-prefix=BCA0 %s
|
||||
; RUN: llvm-bcanalyzer -dump %t1 | FileCheck --check-prefix=BCA1 %s
|
||||
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
; ERROR: llvm-modextract: error: module index out of range; bitcode file contains 2 module(s)
|
||||
|
||||
; BCA0: <GLOBALVAL_SUMMARY_BLOCK
|
||||
|
@ -1,7 +1,10 @@
|
||||
; REQUIRES: x86-registered-target
|
||||
; RUN: opt -thinlto-bc -thinlto-split-lto-unit -o %t %s
|
||||
; RUN: llvm-modextract -b -n 0 -o - %t | llvm-dis | FileCheck --check-prefix=M0 %s
|
||||
; RUN: llvm-modextract -b -n 1 -o - %t | llvm-dis | FileCheck --check-prefix=M1 %s
|
||||
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
define [1 x i8*]* @source() {
|
||||
ret [1 x i8*]* @g
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user