Set dso_local on cfi_slowpath.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@328836 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2018-03-29 22:08:01 +00:00
parent d05cde1c10
commit c828ac533b
2 changed files with 10 additions and 4 deletions

View File

@ -2975,6 +2975,7 @@ void CodeGenFunction::EmitCfiSlowPathCheck(
bool WithDiag = !CGM.getCodeGenOpts().SanitizeTrap.has(Kind);
llvm::CallInst *CheckCall;
llvm::Constant *SlowPathFn;
if (WithDiag) {
llvm::Constant *Info = llvm::ConstantStruct::getAnon(StaticArgs);
auto *InfoPtr =
@ -2983,20 +2984,20 @@ void CodeGenFunction::EmitCfiSlowPathCheck(
InfoPtr->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
CGM.getSanitizerMetadata()->disableSanitizerForGlobal(InfoPtr);
llvm::Constant *SlowPathDiagFn = CGM.getModule().getOrInsertFunction(
SlowPathFn = CGM.getModule().getOrInsertFunction(
"__cfi_slowpath_diag",
llvm::FunctionType::get(VoidTy, {Int64Ty, Int8PtrTy, Int8PtrTy},
false));
CheckCall = Builder.CreateCall(
SlowPathDiagFn,
{TypeId, Ptr, Builder.CreateBitCast(InfoPtr, Int8PtrTy)});
SlowPathFn, {TypeId, Ptr, Builder.CreateBitCast(InfoPtr, Int8PtrTy)});
} else {
llvm::Constant *SlowPathFn = CGM.getModule().getOrInsertFunction(
SlowPathFn = CGM.getModule().getOrInsertFunction(
"__cfi_slowpath",
llvm::FunctionType::get(VoidTy, {Int64Ty, Int8PtrTy}, false));
CheckCall = Builder.CreateCall(SlowPathFn, {TypeId, Ptr});
}
CGM.setDSOLocal(cast<llvm::GlobalValue>(SlowPathFn->stripPointerCasts()));
CheckCall->setDoesNotThrow();
EmitBlock(Cont);

View File

@ -39,6 +39,11 @@
// MS-DIAG: call void @__cfi_slowpath_diag(i64 4195979634929632483, i8* %{{.*}}, {{.*}}@[[DATA]]{{.*}}) {{.*}}, !nosanitize
// MS-TRAP: call void @__cfi_slowpath(i64 4195979634929632483, i8* %{{.*}}) {{.*}}, !nosanitize
// ITANIUM-DIAG: declare void @__cfi_slowpath_diag(
// ITANIUM-TRAP: declare void @__cfi_slowpath(
// MS-DIAG: declare dso_local void @__cfi_slowpath_diag(
// MS-TRAP: declare dso_local void @__cfi_slowpath(
void caller(void (*f)()) {
f();
}