diff --git a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp --- a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp @@ -1033,13 +1033,15 @@ } IRBuilder<> IRB(&I); Value *CondShadow = getShadow(Condition); + CallInst *CI; if (DFS.shouldTrackOrigins()) { Value *CondOrigin = getOrigin(Condition); - IRB.CreateCall(DFS.DFSanConditionalCallbackOriginFn, - {CondShadow, CondOrigin}); + CI = IRB.CreateCall(DFS.DFSanConditionalCallbackOriginFn, + {CondShadow, CondOrigin}); } else { - IRB.CreateCall(DFS.DFSanConditionalCallbackFn, {CondShadow}); + CI = IRB.CreateCall(DFS.DFSanConditionalCallbackFn, {CondShadow}); } + CI->addParamAttr(0, Attribute::ZExt); } void DFSanFunction::addReachesFunctionCallbacksIfEnabled(IRBuilder<> &IRB, @@ -1078,6 +1080,7 @@ args = { DataShadow, FilePathPtr, CILine, FunctionNamePtr }; CB = IRB.CreateCall(DFS.DFSanReachesFunctionCallbackFn, args); } + CB->addParamAttr(0, Attribute::ZExt); CB->setDebugLoc(dbgloc); } @@ -1413,25 +1416,53 @@ // Initializes event callback functions and declare them in the module void DataFlowSanitizer::initializeCallbackFunctions(Module &M) { - DFSanLoadCallbackFn = Mod->getOrInsertFunction("__dfsan_load_callback", - DFSanLoadStoreCallbackFnTy); - DFSanStoreCallbackFn = Mod->getOrInsertFunction("__dfsan_store_callback", - DFSanLoadStoreCallbackFnTy); + { + AttributeList AL; + AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt); + DFSanLoadCallbackFn = Mod->getOrInsertFunction( + "__dfsan_load_callback", DFSanLoadStoreCallbackFnTy, AL); + } + { + AttributeList AL; + AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt); + DFSanStoreCallbackFn = Mod->getOrInsertFunction( + "__dfsan_store_callback", DFSanLoadStoreCallbackFnTy, AL); + } DFSanMemTransferCallbackFn = Mod->getOrInsertFunction( "__dfsan_mem_transfer_callback", DFSanMemTransferCallbackFnTy); - DFSanCmpCallbackFn = - Mod->getOrInsertFunction("__dfsan_cmp_callback", DFSanCmpCallbackFnTy); - - DFSanConditionalCallbackFn = Mod->getOrInsertFunction( - "__dfsan_conditional_callback", DFSanConditionalCallbackFnTy); - DFSanConditionalCallbackOriginFn = - Mod->getOrInsertFunction("__dfsan_conditional_callback_origin", - DFSanConditionalCallbackOriginFnTy); - DFSanReachesFunctionCallbackFn = Mod->getOrInsertFunction( - "__dfsan_reaches_function_callback", DFSanReachesFunctionCallbackFnTy); - DFSanReachesFunctionCallbackOriginFn = - Mod->getOrInsertFunction("__dfsan_reaches_function_callback_origin", - DFSanReachesFunctionCallbackOriginFnTy); + { + AttributeList AL; + AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt); + DFSanCmpCallbackFn = Mod->getOrInsertFunction("__dfsan_cmp_callback", + DFSanCmpCallbackFnTy, AL); + } + { + AttributeList AL; + AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt); + DFSanConditionalCallbackFn = Mod->getOrInsertFunction( + "__dfsan_conditional_callback", DFSanConditionalCallbackFnTy, AL); + } + { + AttributeList AL; + AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt); + DFSanConditionalCallbackOriginFn = + Mod->getOrInsertFunction("__dfsan_conditional_callback_origin", + DFSanConditionalCallbackOriginFnTy, AL); + } + { + AttributeList AL; + AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt); + DFSanReachesFunctionCallbackFn = + Mod->getOrInsertFunction("__dfsan_reaches_function_callback", + DFSanReachesFunctionCallbackFnTy, AL); + } + { + AttributeList AL; + AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt); + DFSanReachesFunctionCallbackOriginFn = + Mod->getOrInsertFunction("__dfsan_reaches_function_callback_origin", + DFSanReachesFunctionCallbackOriginFnTy, AL); + } } void DataFlowSanitizer::injectMetadataGlobals(Module &M) { @@ -2403,7 +2434,9 @@ if (ClEventCallbacks) { IRBuilder<> IRB(Pos); Value *Addr8 = IRB.CreateBitCast(LI.getPointerOperand(), DFSF.DFS.Int8Ptr); - IRB.CreateCall(DFSF.DFS.DFSanLoadCallbackFn, {PrimitiveShadow, Addr8}); + CallInst *CI = + IRB.CreateCall(DFSF.DFS.DFSanLoadCallbackFn, {PrimitiveShadow, Addr8}); + CI->addParamAttr(0, Attribute::ZExt); } IRBuilder<> IRB(AfterLi); @@ -2663,7 +2696,9 @@ if (ClEventCallbacks) { IRBuilder<> IRB(&SI); Value *Addr8 = IRB.CreateBitCast(SI.getPointerOperand(), DFSF.DFS.Int8Ptr); - IRB.CreateCall(DFSF.DFS.DFSanStoreCallbackFn, {PrimitiveShadow, Addr8}); + CallInst *CI = + IRB.CreateCall(DFSF.DFS.DFSanStoreCallbackFn, {PrimitiveShadow, Addr8}); + CI->addParamAttr(0, Attribute::ZExt); } } @@ -2725,7 +2760,9 @@ if (ClEventCallbacks) { IRBuilder<> IRB(&CI); Value *CombinedShadow = DFSF.getShadow(&CI); - IRB.CreateCall(DFSF.DFS.DFSanCmpCallbackFn, CombinedShadow); + CallInst *CallI = + IRB.CreateCall(DFSF.DFS.DFSanCmpCallbackFn, CombinedShadow); + CallI->addParamAttr(0, Attribute::ZExt); } } diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/callback.ll b/llvm/test/Instrumentation/DataFlowSanitizer/callback.ll --- a/llvm/test/Instrumentation/DataFlowSanitizer/callback.ll +++ b/llvm/test/Instrumentation/DataFlowSanitizer/callback.ll @@ -6,7 +6,7 @@ ; CHECK: @__dfsan_shadow_width_bytes = weak_odr constant i32 [[#SBYTES:]] define i8 @load8(ptr %p) { - ; CHECK: call void @__dfsan_load_callback(i[[#SBITS]] %[[LABEL:.*]], ptr %p) + ; CHECK: call void @__dfsan_load_callback(i[[#SBITS]] zeroext %[[LABEL:.*]], ptr %p) ; CHECK: %a = load i8, ptr %p ; CHECK: store i[[#SBITS]] %[[LABEL]], ptr @__dfsan_retval_tls @@ -16,7 +16,7 @@ define void @store8(ptr %p, i8 %a) { ; CHECK: store i[[#SBITS]] %[[LABEL:.*]], ptr %{{.*}} - ; CHECK: call void @__dfsan_store_callback(i[[#SBITS]] %[[LABEL]], ptr %p) + ; CHECK: call void @__dfsan_store_callback(i[[#SBITS]] zeroext %[[LABEL]], ptr %p) ; CHECK: store i8 %a, ptr %p store i8 %a, ptr %p @@ -24,10 +24,19 @@ } define i1 @cmp(i8 %a, i8 %b) { - ; CHECK: call void @__dfsan_cmp_callback(i[[#SBITS]] %[[CMPLABEL:.*]]) + ; CHECK: call void @__dfsan_cmp_callback(i[[#SBITS]] zeroext %[[CMPLABEL:.*]]) ; CHECK: %c = icmp ne i8 %a, %b ; CHECK: store i[[#SBITS]] %[[CMPLABEL]], ptr @__dfsan_retval_tls %c = icmp ne i8 %a, %b ret i1 %c -} \ No newline at end of file +} + +; CHECK: declare void @__dfsan_load_callback(i[[#SBITS]] zeroext, ptr) +; CHECK: declare void @__dfsan_store_callback(i[[#SBITS]] zeroext, ptr) +; CHECK: declare void @__dfsan_mem_transfer_callback(ptr, i64) +; CHECK: declare void @__dfsan_cmp_callback(i[[#SBITS]] zeroext) +; CHECK: declare void @__dfsan_conditional_callback(i[[#SBITS]] zeroext) +; CHECK: declare void @__dfsan_conditional_callback_origin(i[[#SBITS]] zeroext, i32) +; CHECK: declare void @__dfsan_reaches_function_callback(i[[#SBITS]] zeroext, ptr, i32, ptr) +; CHECK: declare void @__dfsan_reaches_function_callback_origin(i[[#SBITS]] zeroext, i32, ptr, i32, ptr)