1
0
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:
Peter Collingbourne 2018-03-30 18:37:55 +00:00
parent 262cfa2993
commit b46b507da2
3 changed files with 35 additions and 1 deletions

View File

@ -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);

View File

@ -6,3 +6,5 @@ fun:functional=functional
fun:custom*=uninstrumented
fun:custom*=custom
fun:uninstrumented*=uninstrumented

View File

@ -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"