mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
DataFlowSanitizer: wrappers of functions with local linkage should have the same linkage as the function being wrapped
This patch resolves link errors when the address of a static function is taken, and that function is uninstrumented by DFSan. This change resolves bug 36314. Patch by Sam Kerner! Differential Revision: https://reviews.llvm.org/D44784 llvm-svn: 328890
This commit is contained in:
parent
262cfa2993
commit
b46b507da2
@ -859,9 +859,17 @@ bool DataFlowSanitizer::runOnModule(Module &M) {
|
||||
FunctionType *NewFT = getInstrumentedABI() == IA_Args
|
||||
? getArgsFunctionType(FT)
|
||||
: FT;
|
||||
|
||||
// If the function being wrapped has local linkage, then preserve the
|
||||
// function's linkage in the wrapper function.
|
||||
GlobalValue::LinkageTypes wrapperLinkage =
|
||||
F.hasLocalLinkage()
|
||||
? F.getLinkage()
|
||||
: GlobalValue::LinkOnceODRLinkage;
|
||||
|
||||
Function *NewF = buildWrapperFunction(
|
||||
&F, std::string("dfsw$") + std::string(F.getName()),
|
||||
GlobalValue::LinkOnceODRLinkage, NewFT);
|
||||
wrapperLinkage, NewFT);
|
||||
if (getInstrumentedABI() == IA_TLS)
|
||||
NewF->removeAttributes(AttributeList::FunctionIndex, ReadOnlyNoneAttrs);
|
||||
|
||||
|
@ -6,3 +6,5 @@ fun:functional=functional
|
||||
|
||||
fun:custom*=uninstrumented
|
||||
fun:custom*=custom
|
||||
|
||||
fun:uninstrumented*=uninstrumented
|
||||
|
@ -0,0 +1,24 @@
|
||||
; RUN: opt < %s -dfsan -dfsan-args-abi -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s
|
||||
; RUN: opt < %s -dfsan -dfsan-abilist=%S/Inputs/abilist.txt -S | FileCheck %s
|
||||
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
define internal i8 @uninstrumented_internal_fun(i8 %in) {
|
||||
ret i8 %in
|
||||
}
|
||||
|
||||
define i8 @call_uninstrumented_internal_fun(i8 %in) {
|
||||
%call = call i8 @uninstrumented_internal_fun(i8 %in)
|
||||
ret i8 %call
|
||||
}
|
||||
; CHECK: define internal {{(i8|{ i8, i16 })}} @"dfsw$uninstrumented_internal_fun"
|
||||
|
||||
define private i8 @uninstrumented_private_fun(i8 %in) {
|
||||
ret i8 %in
|
||||
}
|
||||
|
||||
define i8 @call_uninstrumented_private_fun(i8 %in) {
|
||||
%call = call i8 @uninstrumented_private_fun(i8 %in)
|
||||
ret i8 %call
|
||||
}
|
||||
; CHECK: define private {{(i8|{ i8, i16 })}} @"dfsw$uninstrumented_private_fun"
|
Loading…
x
Reference in New Issue
Block a user