[llvm] [DataFlowSanitizer] Properly add ext attributes on arguments as needed. (PR #225443)
Jonas Paulsson via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 23 02:21:56 PDT 2026
https://github.com/JonPsson1 updated https://github.com/llvm/llvm-project/pull/225443
>From 79a1b69a13efc9e6b3977b98efb54255120266ff Mon Sep 17 00:00:00 2001
From: Jonas Paulsson <paulson1 at linux.ibm.com>
Date: Tue, 22 Sep 2026 17:39:12 +0200
Subject: [PATCH 1/3] [DataFlowSanitizer] Properly add ext attributes on
arguments where needed.
---
.../Instrumentation/DataFlowSanitizer.cpp | 48 +++++++++++++++++--
.../DataFlowSanitizer/abilist.ll | 8 ++--
.../DataFlowSanitizer/abilist_aggregate.ll | 8 ++--
.../DataFlowSanitizer/callback.ll | 6 +--
.../instrumented-args-exts.ll | 9 ++++
.../DataFlowSanitizer/origin_abilist.ll | 12 ++---
.../DataFlowSanitizer/reaches_function.ll | 2 +-
.../DataFlowSanitizer/shadow-args-zext.ll | 12 ++---
8 files changed, 76 insertions(+), 29 deletions(-)
create mode 100644 llvm/test/Instrumentation/DataFlowSanitizer/instrumented-args-exts.ll
diff --git a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
index 866622a2db8fb9..33879efa1d3e65 100644
--- a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
@@ -1107,11 +1107,15 @@ void DFSanFunction::addReachesFunctionCallbacksIfEnabled(IRBuilder<> &IRB,
Value *DataOrigin = getOrigin(Data);
args = { DataShadow, DataOrigin, FilePathPtr, CILine, FunctionNamePtr };
CB = IRB.CreateCall(DFS.DFSanReachesFunctionCallbackOriginFn, args);
+ CB->addParamAttr(0, Attribute::ZExt);
+ CB->addParamAttr(1, Attribute::ZExt);
+ CB->addParamAttr(3, Attribute::ZExt);
} else {
args = { DataShadow, FilePathPtr, CILine, FunctionNamePtr };
CB = IRB.CreateCall(DFS.DFSanReachesFunctionCallbackFn, args);
+ CB->addParamAttr(0, Attribute::ZExt);
+ CB->addParamAttr(2, Attribute::ZExt);
}
- CB->addParamAttr(0, Attribute::ZExt);
CB->setDebugLoc(dbgloc);
}
@@ -1405,9 +1409,13 @@ void DataFlowSanitizer::initializeRuntimeFunctions(Module &M) {
DFSanMemShadowOriginTransferFn = Mod->getOrInsertFunction(
"__dfsan_mem_shadow_origin_transfer", DFSanMemShadowOriginTransferFnTy);
- DFSanMemShadowOriginConditionalExchangeFn =
+ {
+ AttributeList AL;
+ AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
+ DFSanMemShadowOriginConditionalExchangeFn =
Mod->getOrInsertFunction("__dfsan_mem_shadow_origin_conditional_exchange",
- DFSanMemShadowOriginConditionalExchangeFnTy);
+ DFSanMemShadowOriginConditionalExchangeFnTy, AL);
+ }
{
AttributeList AL;
@@ -1493,6 +1501,7 @@ void DataFlowSanitizer::initializeCallbackFunctions(Module &M) {
{
AttributeList AL;
AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
+ AL = AL.addParamAttribute(M.getContext(), 1, Attribute::ZExt);
DFSanConditionalCallbackOriginFn =
Mod->getOrInsertFunction("__dfsan_conditional_callback_origin",
DFSanConditionalCallbackOriginFnTy, AL);
@@ -1500,6 +1509,7 @@ void DataFlowSanitizer::initializeCallbackFunctions(Module &M) {
{
AttributeList AL;
AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
+ AL = AL.addParamAttribute(M.getContext(), 2, Attribute::ZExt);
DFSanReachesFunctionCallbackFn =
Mod->getOrInsertFunction("__dfsan_reaches_function_callback",
DFSanReachesFunctionCallbackFnTy, AL);
@@ -1507,6 +1517,8 @@ void DataFlowSanitizer::initializeCallbackFunctions(Module &M) {
{
AttributeList AL;
AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
+ AL = AL.addParamAttribute(M.getContext(), 1, Attribute::ZExt);
+ AL = AL.addParamAttribute(M.getContext(), 3, Attribute::ZExt);
DFSanReachesFunctionCallbackOriginFn =
Mod->getOrInsertFunction("__dfsan_reaches_function_callback_origin",
DFSanReachesFunctionCallbackOriginFnTy, AL);
@@ -3138,6 +3150,22 @@ bool DFSanVisitor::visitWrappedCallBase(Function &F, CallBase &CB) {
if (Function *CustomFn = dyn_cast<Function>(CustomF.getCallee())) {
CustomFn->copyAttributesFrom(&F);
+ // Ensure all narrow integer arguments (both original and added
+ // shadow/origin) have an extension attribute on the function
+ // declaration. If none is present, add ZExt as all DFSan args are
+ // unsigned. TODO: Avoid getting here with missing attributes in the
+ // first place (use TLI/emitLibFunc()?).
+ for (unsigned I = 0, E = CustomFn->arg_size(); I < E; ++I) {
+ Type *ParamTy = CustomFn->getFunctionType()->getParamType(I);
+ if (ParamTy->isIntegerTy() && ParamTy->getIntegerBitWidth() <= 32) {
+ if (!CustomFn->hasParamAttribute(I, Attribute::ZExt) &&
+ !CustomFn->hasParamAttribute(I, Attribute::SExt) &&
+ !CustomFn->hasParamAttribute(I, Attribute::NoExt)) {
+ CustomFn->addParamAttr(I, Attribute::ZExt);
+ }
+ }
+ }
+
// Custom functions returning non-void will write to the return label.
if (!FT->getReturnType()->isVoidTy()) {
CustomFn->removeFnAttrs(DFSF.DFS.ReadOnlyNoneAttrs);
@@ -3164,10 +3192,18 @@ bool DFSanVisitor::visitWrappedCallBase(Function &F, CallBase &CB) {
// Adds variable arguments.
append_range(Args, drop_begin(CB.args(), FT->getNumParams()));
+ // Combine CallSite attributes with Function declaration attributes.
+ AttributeList CombinedAttrs = CI->getAttributes();
+ for (unsigned I = 0; I < FT->getNumParams(); ++I) {
+ AttrBuilder AttrB(CI->getContext(), F.getAttributes().getParamAttrs(I));
+ if (AttrB.hasAttributes())
+ CombinedAttrs = CombinedAttrs.addParamAttributes(CI->getContext(), I,
+ AttrB);
+ }
CallInst *CustomCI = IRB.CreateCall(CustomF, Args);
CustomCI->setCallingConv(CI->getCallingConv());
CustomCI->setAttributes(transformFunctionAttributes(
- CustomFn, CI->getContext(), CI->getAttributes()));
+ CustomFn, CI->getContext(), CombinedAttrs));
// Update the parameter attributes of the custom call instruction to
// zero extend the shadow parameters. This is required for targets
@@ -3331,10 +3367,12 @@ void DFSanVisitor::visitLibAtomicCompareExchange(CallBase &CB) {
// If original call returned true, copy Desired to Target.
// If original call returned false, copy Target to Expected.
- NextIRB.CreateCall(DFSF.DFS.DFSanMemShadowOriginConditionalExchangeFn,
+ CallInst *CI = NextIRB.CreateCall(
+ DFSF.DFS.DFSanMemShadowOriginConditionalExchangeFn,
{NextIRB.CreateIntCast(&CB, NextIRB.getInt8Ty(), false),
TargetPtr, ExpectedPtr, DesiredPtr,
NextIRB.CreateIntCast(Size, DFSF.DFS.IntptrTy, false)});
+ CI->addParamAttr(0, Attribute::ZExt);
}
void DFSanVisitor::visitCallBase(CallBase &CB) {
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/abilist.ll b/llvm/test/Instrumentation/DataFlowSanitizer/abilist.ll
index 61621ab3a6d719..d58c541bc6e8c6 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/abilist.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/abilist.ll
@@ -88,8 +88,8 @@ define ptr @g(i32) {
; CHECK: define linkonce_odr i32 @"dfsw$custom4"(i32 %0, ...)
-; CHECK: declare void @__dfsw_custom1(i32, i32, i8, i8)
-; CHECK: declare i32 @__dfsw_custom2(i32, i32, i8, i8, ptr)
+; CHECK: declare void @__dfsw_custom1(i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext)
+; CHECK: declare i32 @__dfsw_custom2(i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, ptr)
-; CHECK: declare void @__dfsw_custom3(i32, i8, ptr, ...)
-; CHECK: declare i32 @__dfsw_custom4(i32, i8, ptr, ptr, ...)
+; CHECK: declare void @__dfsw_custom3(i32 zeroext, i8 zeroext, ptr, ...)
+; CHECK: declare i32 @__dfsw_custom4(i32 zeroext, i8 zeroext, ptr, ptr, ...)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/abilist_aggregate.ll b/llvm/test/Instrumentation/DataFlowSanitizer/abilist_aggregate.ll
index 3cab62b02efc28..8308e38f0b359d 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/abilist_aggregate.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/abilist_aggregate.ll
@@ -241,8 +241,8 @@ define void @custom_varg({i32, i1} %a, ...) {
ret void
}
-; CHECK: declare { i1, i7 } @__dfsw_custom_with_ret({ i32, i1 }, [2 x i7], i8, i8, ptr)
-; CHECK: declare void @__dfsw_custom_without_ret({ i32, i1 }, [2 x i7], i8, i8)
-; CHECK: declare void @__dfsw_custom_varg({ i32, i1 }, i8, ptr, ...)
+; CHECK: declare { i1, i7 } @__dfsw_custom_with_ret({ i32, i1 }, [2 x i7], i8 zeroext, i8 zeroext, ptr)
+; CHECK: declare void @__dfsw_custom_without_ret({ i32, i1 }, [2 x i7], i8 zeroext, i8 zeroext)
+; CHECK: declare void @__dfsw_custom_varg({ i32, i1 }, i8 zeroext, ptr, ...)
-; CHECK: declare { i1, i7 } @__dfsw_custom_cb(ptr, { i32, i1 }, [2 x i7], i8, i8, i8, ptr)
+; CHECK: declare { i1, i7 } @__dfsw_custom_cb(ptr, { i32, i1 }, [2 x i7], i8 zeroext, i8 zeroext, i8 zeroext, ptr)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/callback.ll b/llvm/test/Instrumentation/DataFlowSanitizer/callback.ll
index a499ec934d9fea..b4f4f7c67b0169 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/callback.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/callback.ll
@@ -34,6 +34,6 @@ define i1 @cmp(i8 %a, i8 %b) {
; CHECK: declare void @__dfsan_mem_transfer_callback(ptr, i64)
; CHECK: declare void @__dfsan_cmp_callback(i8 zeroext)
; CHECK: declare void @__dfsan_conditional_callback(i8 zeroext)
-; CHECK: declare void @__dfsan_conditional_callback_origin(i8 zeroext, i32)
-; CHECK: declare void @__dfsan_reaches_function_callback(i8 zeroext, ptr, i32, ptr)
-; CHECK: declare void @__dfsan_reaches_function_callback_origin(i8 zeroext, i32, ptr, i32, ptr)
+; CHECK: declare void @__dfsan_conditional_callback_origin(i8 zeroext, i32 zeroext)
+; CHECK: declare void @__dfsan_reaches_function_callback(i8 zeroext, ptr, i32 zeroext, ptr)
+; CHECK: declare void @__dfsan_reaches_function_callback_origin(i8 zeroext, i32 zeroext, ptr, i32 zeroext, ptr)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/instrumented-args-exts.ll b/llvm/test/Instrumentation/DataFlowSanitizer/instrumented-args-exts.ll
new file mode 100644
index 00000000000000..9e9c1bd0fdbdc1
--- /dev/null
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/instrumented-args-exts.ll
@@ -0,0 +1,9 @@
+; Test extensions of arguments to instrumented function.
+;
+; RUN: opt -passes='dfsan' -mtriple=s390x-unknown-linux -S %s | FileCheck %s
+
+define void @fun() {
+ ret void
+}
+
+; CHECK: declare void @__dfsan_mem_shadow_origin_conditional_exchange(i8 zeroext, ptr, ptr, ptr, i64)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/origin_abilist.ll b/llvm/test/Instrumentation/DataFlowSanitizer/origin_abilist.ll
index fbcdb3d50afae3..8a66b44982b1c9 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/origin_abilist.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/origin_abilist.ll
@@ -281,14 +281,14 @@ define void @call_custom_cb_without_ret(i32 %a, i32 %b) {
; CHECK-NEXT: call void @__dfso_custom_cb_without_ret(ptr %0, i32 %1, i32 %2, i8 zeroext [[CS]], i8 zeroext [[AS]], i8 zeroext [[BS]], i32 zeroext [[CO]], i32 zeroext [[AO]], i32 zeroext [[BO]])
; CHECK-NEXT: ret void
-; CHECK: declare void @__dfso_custom_without_ret(i32, i32, i8, i8, i32, i32)
+; CHECK: declare void @__dfso_custom_without_ret(i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, i32 zeroext, i32 zeroext)
-; CHECK: declare i32 @__dfso_custom_with_ret(i32, i32, i8, i8, ptr, i32, i32, ptr)
+; CHECK: declare i32 @__dfso_custom_with_ret(i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, ptr, i32 zeroext, i32 zeroext, ptr)
-; CHECK: declare i32 @__dfso_custom_cb_with_ret(ptr, i32, i32, i8, i8, i8, ptr, i32, i32, i32, ptr)
+; CHECK: declare i32 @__dfso_custom_cb_with_ret(ptr, i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, i8 zeroext, ptr, i32 zeroext, i32 zeroext, i32 zeroext, ptr)
-; CHECK: declare void @__dfso_custom_cb_without_ret(ptr, i32, i32, i8, i8, i8, i32, i32, i32)
+; CHECK: declare void @__dfso_custom_cb_without_ret(ptr, i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, i8 zeroext, i32 zeroext, i32 zeroext, i32 zeroext)
-; CHECK: declare void @__dfso_custom_varg_without_ret(i32, i32, i8, i8, ptr, i32, i32, ptr, ...)
+; CHECK: declare void @__dfso_custom_varg_without_ret(i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, ptr, i32 zeroext, i32 zeroext, ptr, ...)
-; CHECK: declare i32 @__dfso_custom_varg_with_ret(i32, i32, i8, i8, ptr, ptr, i32, i32, ptr, ptr, ...)
+; CHECK: declare i32 @__dfso_custom_varg_with_ret(i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, ptr, ptr, i32 zeroext, i32 zeroext, ptr, ptr, ...)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/reaches_function.ll b/llvm/test/Instrumentation/DataFlowSanitizer/reaches_function.ll
index 9e47795e1ba62f..1917bcc7be08fd 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/reaches_function.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/reaches_function.ll
@@ -26,4 +26,4 @@ define void @call() {
ret void
}
-; CHECK-LABEL: @__dfsan_reaches_function_callback(i8 zeroext, ptr, i32, ptr)
+; CHECK-LABEL: @__dfsan_reaches_function_callback(i8 zeroext, ptr, i32 zeroext, ptr)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll b/llvm/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll
index e338976dca0935..333f1e45fb2df1 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll
@@ -36,17 +36,17 @@ entry:
declare zeroext i16 @dfsan_get_label(i64 signext)
; CHECK-LABEL: @"dfsw$dfsan_get_label"
-; CHECK: %{{.*}} = call i16 @__dfsw_dfsan_get_label(i64 %0, i8 zeroext %1, ptr %{{.*}})
+; CHECK: %{{.*}} = call i16 @__dfsw_dfsan_get_label(i64 signext %0, i8 zeroext %1, ptr %{{.*}})
declare zeroext i16 @k2(i64 signext, i64 signext)
; CHECK-LABEL: @"dfsw$k2"
-; CHECK: %{{.*}} = call i16 @__dfsw_k2(i64 %{{.*}}, i64 %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, ptr %{{.*}})
+; CHECK: %{{.*}} = call i16 @__dfsw_k2(i64 signext %{{.*}}, i64 signext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, ptr %{{.*}})
declare zeroext i16 @k4(i64 signext, i64 signext, i64 signext, i64 signext)
; CHECK-LABEL: @"dfsw$k4"
-; CHECK: %{{.*}} = call i16 @__dfsw_k4(i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}}, i64 %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, ptr %{{.*}})
+; CHECK: %{{.*}} = call i16 @__dfsw_k4(i64 signext %{{.*}}, i64 signext %{{.*}}, i64 signext %{{.*}}, i64 signext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, ptr %{{.*}})
-; CHECK: declare zeroext i16 @__dfsw_dfsan_get_label(i64 signext, i8, ptr)
-; CHECK: declare zeroext i16 @__dfsw_k2(i64 signext, i64 signext, i8, i8, ptr)
-; CHECK: declare zeroext i16 @__dfsw_k4(i64 signext, i64 signext, i64 signext, i64 signext, i8, i8, i8, i8, ptr)
+; CHECK: declare zeroext i16 @__dfsw_dfsan_get_label(i64 signext, i8 zeroext, ptr)
+; CHECK: declare zeroext i16 @__dfsw_k2(i64 signext, i64 signext, i8 zeroext, i8 zeroext, ptr)
+; CHECK: declare zeroext i16 @__dfsw_k4(i64 signext, i64 signext, i64 signext, i64 signext, i8 zeroext, i8 zeroext, i8 zeroext, i8 zeroext, ptr)
>From d7d91173fee9b362041bfd09f8f9854ba8572281 Mon Sep 17 00:00:00 2001
From: Jonas Paulsson <Jonas.Paulsson2 at ibm.com>
Date: Tue, 22 Sep 2026 18:33:01 +0200
Subject: [PATCH 2/3] clang-format
---
.../Instrumentation/DataFlowSanitizer.cpp | 22 +++++++++----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
index 33879efa1d3e65..42b16b7f8b1731 100644
--- a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
@@ -1412,9 +1412,9 @@ void DataFlowSanitizer::initializeRuntimeFunctions(Module &M) {
{
AttributeList AL;
AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
- DFSanMemShadowOriginConditionalExchangeFn =
- Mod->getOrInsertFunction("__dfsan_mem_shadow_origin_conditional_exchange",
- DFSanMemShadowOriginConditionalExchangeFnTy, AL);
+ DFSanMemShadowOriginConditionalExchangeFn = Mod->getOrInsertFunction(
+ "__dfsan_mem_shadow_origin_conditional_exchange",
+ DFSanMemShadowOriginConditionalExchangeFnTy, AL);
}
{
@@ -3197,13 +3197,13 @@ bool DFSanVisitor::visitWrappedCallBase(Function &F, CallBase &CB) {
for (unsigned I = 0; I < FT->getNumParams(); ++I) {
AttrBuilder AttrB(CI->getContext(), F.getAttributes().getParamAttrs(I));
if (AttrB.hasAttributes())
- CombinedAttrs = CombinedAttrs.addParamAttributes(CI->getContext(), I,
- AttrB);
+ CombinedAttrs =
+ CombinedAttrs.addParamAttributes(CI->getContext(), I, AttrB);
}
CallInst *CustomCI = IRB.CreateCall(CustomF, Args);
CustomCI->setCallingConv(CI->getCallingConv());
- CustomCI->setAttributes(transformFunctionAttributes(
- CustomFn, CI->getContext(), CombinedAttrs));
+ CustomCI->setAttributes(
+ transformFunctionAttributes(CustomFn, CI->getContext(), CombinedAttrs));
// Update the parameter attributes of the custom call instruction to
// zero extend the shadow parameters. This is required for targets
@@ -3368,10 +3368,10 @@ void DFSanVisitor::visitLibAtomicCompareExchange(CallBase &CB) {
// If original call returned true, copy Desired to Target.
// If original call returned false, copy Target to Expected.
CallInst *CI = NextIRB.CreateCall(
- DFSF.DFS.DFSanMemShadowOriginConditionalExchangeFn,
- {NextIRB.CreateIntCast(&CB, NextIRB.getInt8Ty(), false),
- TargetPtr, ExpectedPtr, DesiredPtr,
- NextIRB.CreateIntCast(Size, DFSF.DFS.IntptrTy, false)});
+ DFSF.DFS.DFSanMemShadowOriginConditionalExchangeFn,
+ {NextIRB.CreateIntCast(&CB, NextIRB.getInt8Ty(), false), TargetPtr,
+ ExpectedPtr, DesiredPtr,
+ NextIRB.CreateIntCast(Size, DFSF.DFS.IntptrTy, false)});
CI->addParamAttr(0, Attribute::ZExt);
}
>From f8114bb7f1d360ed6d370864c4db076567a4e84c Mon Sep 17 00:00:00 2001
From: Jonas Paulsson <paulson1 at linux.ibm.com>
Date: Wed, 23 Sep 2026 10:21:19 +0200
Subject: [PATCH 3/3] Compute attributes with TLI.getExtAttrForI32Param().
---
llvm/include/llvm/IR/InstrTypes.h | 6 ++
.../Instrumentation/DataFlowSanitizer.cpp | 77 +++++++++++--------
.../DataFlowSanitizer/abilist.ll | 18 ++---
.../DataFlowSanitizer/abilist_aggregate.ll | 22 +++---
.../DataFlowSanitizer/array.ll | 8 +-
.../DataFlowSanitizer/basic.ll | 14 ++--
.../DataFlowSanitizer/callback.ll | 20 ++---
.../instrumented-args-exts.ll | 33 +++++++-
.../DataFlowSanitizer/origin_abilist.ll | 32 ++++----
.../DataFlowSanitizer/reaches_function.ll | 2 +-
.../DataFlowSanitizer/shadow-args-zext.ll | 37 ++++++---
.../DataFlowSanitizer/struct.ll | 4 +-
12 files changed, 167 insertions(+), 106 deletions(-)
diff --git a/llvm/include/llvm/IR/InstrTypes.h b/llvm/include/llvm/IR/InstrTypes.h
index 5f7df6a4eb6f8c..61f5d05240b3a6 100644
--- a/llvm/include/llvm/IR/InstrTypes.h
+++ b/llvm/include/llvm/IR/InstrTypes.h
@@ -1589,6 +1589,12 @@ class CallBase : public Instruction {
Attrs = Attrs.addParamAttributes(getContext(), ArgNo, B);
}
+ /// Adds the attribute to the indicated argument
+ void maybeAddParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) {
+ assert(ArgNo < arg_size() && "Out of bounds");
+ Attrs = Attrs.maybeAddParamAttribute(getContext(), ArgNo, Kind);
+ }
+
/// removes the attribute from the list of attributes.
void removeAttributeAtIndex(unsigned i, Attribute::AttrKind Kind) {
Attrs = Attrs.removeAttributeAtIndex(getContext(), i, Kind);
diff --git a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
index 42b16b7f8b1731..8aa3803ea6be5a 100644
--- a/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
@@ -1073,7 +1073,7 @@ void DFSanFunction::addConditionalCallbacksIfEnabled(Instruction &I,
} else {
CI = IRB.CreateCall(DFS.DFSanConditionalCallbackFn, {CondShadow});
}
- CI->addParamAttr(0, Attribute::ZExt);
+ CI->maybeAddParamAttr(0, TLI.getExtAttrForI32Param(/*Signed=*/false));
}
void DFSanFunction::addReachesFunctionCallbacksIfEnabled(IRBuilder<> &IRB,
@@ -1103,18 +1103,20 @@ void DFSanFunction::addReachesFunctionCallbacksIfEnabled(IRBuilder<> &IRB,
CallInst *CB;
std::vector<Value *> args;
+ Attribute::AttrKind ParamExtAttr =
+ TLI.getExtAttrForI32Param(/*Signed=*/false);
if (DFS.shouldTrackOrigins()) {
Value *DataOrigin = getOrigin(Data);
args = { DataShadow, DataOrigin, FilePathPtr, CILine, FunctionNamePtr };
CB = IRB.CreateCall(DFS.DFSanReachesFunctionCallbackOriginFn, args);
- CB->addParamAttr(0, Attribute::ZExt);
- CB->addParamAttr(1, Attribute::ZExt);
- CB->addParamAttr(3, Attribute::ZExt);
+ CB->maybeAddParamAttr(0, ParamExtAttr);
+ CB->maybeAddParamAttr(1, ParamExtAttr);
+ CB->maybeAddParamAttr(3, ParamExtAttr);
} else {
args = { DataShadow, FilePathPtr, CILine, FunctionNamePtr };
CB = IRB.CreateCall(DFS.DFSanReachesFunctionCallbackFn, args);
- CB->addParamAttr(0, Attribute::ZExt);
- CB->addParamAttr(2, Attribute::ZExt);
+ CB->maybeAddParamAttr(0, ParamExtAttr);
+ CB->maybeAddParamAttr(2, ParamExtAttr);
}
CB->setDebugLoc(dbgloc);
}
@@ -1355,6 +1357,8 @@ DataFlowSanitizer::buildWrapperFunction(Function *F, StringRef NewFName,
// Initialize DataFlowSanitizer runtime functions and declare them in the module
void DataFlowSanitizer::initializeRuntimeFunctions(Module &M) {
LLVMContext &C = M.getContext();
+ Attribute::AttrKind ParamExtAttr = TargetLibraryInfo::getExtAttrForI32Param(
+ M.getTargetTriple(), /*Signed=*/false);
{
AttributeList AL;
AL = AL.addFnAttribute(C, Attribute::NoUnwind);
@@ -1379,8 +1383,8 @@ void DataFlowSanitizer::initializeRuntimeFunctions(Module &M) {
"__dfsan_wrapper_extern_weak_null", DFSanWrapperExternWeakNullFnTy);
{
AttributeList AL;
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
- AL = AL.addParamAttribute(M.getContext(), 1, Attribute::ZExt);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 0, ParamExtAttr);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 1, ParamExtAttr);
DFSanSetLabelFn =
Mod->getOrInsertFunction("__dfsan_set_label", DFSanSetLabelFnTy, AL);
}
@@ -1390,15 +1394,15 @@ void DataFlowSanitizer::initializeRuntimeFunctions(Module &M) {
DFSanVarargWrapperFnTy);
{
AttributeList AL;
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 0, ParamExtAttr);
AL = AL.addRetAttribute(M.getContext(), Attribute::ZExt);
DFSanChainOriginFn = Mod->getOrInsertFunction("__dfsan_chain_origin",
DFSanChainOriginFnTy, AL);
}
{
AttributeList AL;
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
- AL = AL.addParamAttribute(M.getContext(), 1, Attribute::ZExt);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 0, ParamExtAttr);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 1, ParamExtAttr);
AL = AL.addRetAttribute(M.getContext(), Attribute::ZExt);
DFSanChainOriginIfTaintedFn = Mod->getOrInsertFunction(
"__dfsan_chain_origin_if_tainted", DFSanChainOriginIfTaintedFnTy, AL);
@@ -1411,7 +1415,7 @@ void DataFlowSanitizer::initializeRuntimeFunctions(Module &M) {
{
AttributeList AL;
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 0, ParamExtAttr);
DFSanMemShadowOriginConditionalExchangeFn = Mod->getOrInsertFunction(
"__dfsan_mem_shadow_origin_conditional_exchange",
DFSanMemShadowOriginConditionalExchangeFnTy, AL);
@@ -1419,8 +1423,8 @@ void DataFlowSanitizer::initializeRuntimeFunctions(Module &M) {
{
AttributeList AL;
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
- AL = AL.addParamAttribute(M.getContext(), 3, Attribute::ZExt);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 0, ParamExtAttr);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 3, ParamExtAttr);
DFSanMaybeStoreOriginFn = Mod->getOrInsertFunction(
"__dfsan_maybe_store_origin", DFSanMaybeStoreOriginFnTy, AL);
}
@@ -1472,15 +1476,17 @@ void DataFlowSanitizer::initializeRuntimeFunctions(Module &M) {
// Initializes event callback functions and declare them in the module
void DataFlowSanitizer::initializeCallbackFunctions(Module &M) {
+ Attribute::AttrKind ParamExtAttr = TargetLibraryInfo::getExtAttrForI32Param(
+ M.getTargetTriple(), /*Signed=*/false);
{
AttributeList AL;
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 0, ParamExtAttr);
DFSanLoadCallbackFn = Mod->getOrInsertFunction(
"__dfsan_load_callback", DFSanLoadStoreCallbackFnTy, AL);
}
{
AttributeList AL;
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 0, ParamExtAttr);
DFSanStoreCallbackFn = Mod->getOrInsertFunction(
"__dfsan_store_callback", DFSanLoadStoreCallbackFnTy, AL);
}
@@ -1488,37 +1494,37 @@ void DataFlowSanitizer::initializeCallbackFunctions(Module &M) {
"__dfsan_mem_transfer_callback", DFSanMemTransferCallbackFnTy);
{
AttributeList AL;
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 0, ParamExtAttr);
DFSanCmpCallbackFn = Mod->getOrInsertFunction("__dfsan_cmp_callback",
DFSanCmpCallbackFnTy, AL);
}
{
AttributeList AL;
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 0, ParamExtAttr);
DFSanConditionalCallbackFn = Mod->getOrInsertFunction(
"__dfsan_conditional_callback", DFSanConditionalCallbackFnTy, AL);
}
{
AttributeList AL;
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
- AL = AL.addParamAttribute(M.getContext(), 1, Attribute::ZExt);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 0, ParamExtAttr);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 1, ParamExtAttr);
DFSanConditionalCallbackOriginFn =
Mod->getOrInsertFunction("__dfsan_conditional_callback_origin",
DFSanConditionalCallbackOriginFnTy, AL);
}
{
AttributeList AL;
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
- AL = AL.addParamAttribute(M.getContext(), 2, Attribute::ZExt);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 0, ParamExtAttr);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 2, ParamExtAttr);
DFSanReachesFunctionCallbackFn =
Mod->getOrInsertFunction("__dfsan_reaches_function_callback",
DFSanReachesFunctionCallbackFnTy, AL);
}
{
AttributeList AL;
- AL = AL.addParamAttribute(M.getContext(), 0, Attribute::ZExt);
- AL = AL.addParamAttribute(M.getContext(), 1, Attribute::ZExt);
- AL = AL.addParamAttribute(M.getContext(), 3, Attribute::ZExt);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 0, ParamExtAttr);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 1, ParamExtAttr);
+ AL = AL.maybeAddParamAttribute(M.getContext(), 3, ParamExtAttr);
DFSanReachesFunctionCallbackOriginFn =
Mod->getOrInsertFunction("__dfsan_reaches_function_callback_origin",
DFSanReachesFunctionCallbackOriginFnTy, AL);
@@ -2482,7 +2488,7 @@ void DFSanVisitor::visitLoadInst(LoadInst &LI) {
Value *Addr = LI.getPointerOperand();
CallInst *CI =
IRB.CreateCall(DFSF.DFS.DFSanLoadCallbackFn, {PrimitiveShadow, Addr});
- CI->addParamAttr(0, Attribute::ZExt);
+ CI->maybeAddParamAttr(0, DFSF.TLI.getExtAttrForI32Param(/*Signed=*/false));
}
IRBuilder<> IRB(AfterLi->getParent(), AfterLi);
@@ -2740,7 +2746,7 @@ void DFSanVisitor::visitStoreInst(StoreInst &SI) {
Value *Addr = SI.getPointerOperand();
CallInst *CI =
IRB.CreateCall(DFSF.DFS.DFSanStoreCallbackFn, {PrimitiveShadow, Addr});
- CI->addParamAttr(0, Attribute::ZExt);
+ CI->maybeAddParamAttr(0, DFSF.TLI.getExtAttrForI32Param(/*Signed=*/false));
}
}
@@ -2804,7 +2810,8 @@ void DFSanVisitor::visitCmpInst(CmpInst &CI) {
Value *CombinedShadow = DFSF.getShadow(&CI);
CallInst *CallI =
IRB.CreateCall(DFSF.DFS.DFSanCmpCallbackFn, CombinedShadow);
- CallI->addParamAttr(0, Attribute::ZExt);
+ CallI->maybeAddParamAttr(0,
+ DFSF.TLI.getExtAttrForI32Param(/*Signed=*/false));
}
}
@@ -3111,6 +3118,8 @@ void DFSanVisitor::addOriginArguments(Function &F, CallBase &CB,
}
bool DFSanVisitor::visitWrappedCallBase(Function &F, CallBase &CB) {
+ Attribute::AttrKind ParamExtAttr =
+ DFSF.TLI.getExtAttrForI32Param(/*Signed=*/false);
IRBuilder<> IRB(&CB);
switch (DFSF.DFS.getWrapperKind(&F)) {
case DataFlowSanitizer::WK_Warning:
@@ -3158,10 +3167,11 @@ bool DFSanVisitor::visitWrappedCallBase(Function &F, CallBase &CB) {
for (unsigned I = 0, E = CustomFn->arg_size(); I < E; ++I) {
Type *ParamTy = CustomFn->getFunctionType()->getParamType(I);
if (ParamTy->isIntegerTy() && ParamTy->getIntegerBitWidth() <= 32) {
- if (!CustomFn->hasParamAttribute(I, Attribute::ZExt) &&
+ if (ParamExtAttr != Attribute::AttrKind::None &&
+ !CustomFn->hasParamAttribute(I, Attribute::ZExt) &&
!CustomFn->hasParamAttribute(I, Attribute::SExt) &&
!CustomFn->hasParamAttribute(I, Attribute::NoExt)) {
- CustomFn->addParamAttr(I, Attribute::ZExt);
+ CustomFn->addParamAttr(I, ParamExtAttr);
}
}
}
@@ -3212,12 +3222,13 @@ bool DFSanVisitor::visitWrappedCallBase(Function &F, CallBase &CB) {
const unsigned ArgNo = ShadowArgStart + N;
if (CustomCI->getArgOperand(ArgNo)->getType() ==
DFSF.DFS.PrimitiveShadowTy)
- CustomCI->addParamAttr(ArgNo, Attribute::ZExt);
+ CustomCI->maybeAddParamAttr(ArgNo, ParamExtAttr);
+
if (ShouldTrackOrigins) {
const unsigned OriginArgNo = OriginArgStart + N;
if (CustomCI->getArgOperand(OriginArgNo)->getType() ==
DFSF.DFS.OriginTy)
- CustomCI->addParamAttr(OriginArgNo, Attribute::ZExt);
+ CustomCI->maybeAddParamAttr(OriginArgNo, ParamExtAttr);
}
}
@@ -3372,7 +3383,7 @@ void DFSanVisitor::visitLibAtomicCompareExchange(CallBase &CB) {
{NextIRB.CreateIntCast(&CB, NextIRB.getInt8Ty(), false), TargetPtr,
ExpectedPtr, DesiredPtr,
NextIRB.CreateIntCast(Size, DFSF.DFS.IntptrTy, false)});
- CI->addParamAttr(0, Attribute::ZExt);
+ CI->maybeAddParamAttr(0, DFSF.TLI.getExtAttrForI32Param(/*Signed=*/false));
}
void DFSanVisitor::visitCallBase(CallBase &CB) {
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/abilist.ll b/llvm/test/Instrumentation/DataFlowSanitizer/abilist.ll
index d58c541bc6e8c6..d61d6538183785 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/abilist.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/abilist.ll
@@ -33,13 +33,13 @@ define void @f(i32 %x) {
; CHECK: %[[LABELVA1:.*]] = alloca [2 x i8]
; CHECK: %[[LABELRETURN:.*]] = alloca i8
- ; CHECK: call void @__dfsw_custom1(i32 1, i32 2, i8 zeroext 0, i8 zeroext 0)
+ ; CHECK: call void @__dfsw_custom1(i32 1, i32 2, i8 0, i8 0)
call void @custom1(i32 1, i32 2)
- ; CHECK: call i32 @__dfsw_custom2(i32 1, i32 2, i8 zeroext 0, i8 zeroext 0, ptr %[[LABELRETURN]])
+ ; CHECK: call i32 @__dfsw_custom2(i32 1, i32 2, i8 0, i8 0, ptr %[[LABELRETURN]])
call i32 @custom2(i32 1, i32 2)
- ; CHECK: call void @__dfsw_customcb({{.*}} @cb.dfsan, i8 zeroext 0)
+ ; CHECK: call void @__dfsw_customcb({{.*}} @cb.dfsan, i8 0)
call void @customcb(ptr @cb)
; CHECK: %[[LABELVA1_0:.*]] = getelementptr inbounds nuw [2 x i8], ptr %[[LABELVA1]], i32 0, i32 0
@@ -47,13 +47,13 @@ define void @f(i32 %x) {
; CHECK: %[[LABELVA1_1:.*]] = getelementptr inbounds nuw [2 x i8], ptr %[[LABELVA1]], i32 0, i32 1
; CHECK: store i8 %{{.*}}, ptr %[[LABELVA1_1]]
; CHECK: %[[LABELVA1_0A:.*]] = getelementptr inbounds nuw [2 x i8], ptr %[[LABELVA1]], i32 0, i32 0
- ; CHECK: call void (i32, i8, ptr, ...) @__dfsw_custom3(i32 1, i8 zeroext 0, ptr %[[LABELVA1_0A]], i32 2, i32 %{{.*}})
+ ; CHECK: call void (i32, i8, ptr, ...) @__dfsw_custom3(i32 1, i8 0, ptr %[[LABELVA1_0A]], i32 2, i32 %{{.*}})
call void (i32, ...) @custom3(i32 1, i32 2, i32 %x)
; CHECK: %[[LABELVA2_0:.*]] = getelementptr inbounds nuw [2 x i8], ptr %[[LABELVA2]], i32 0, i32 0
; CHECK: %[[LABELVA2_0A:.*]] = getelementptr inbounds nuw [2 x i8], ptr %[[LABELVA2]], i32 0, i32 0
- ; CHECK: call i32 (i32, i8, ptr, ptr, ...) @__dfsw_custom4(i32 1, i8 zeroext 0, ptr %[[LABELVA2_0A]], ptr %[[LABELRETURN]], i32 2, i32 3)
+ ; CHECK: call i32 (i32, i8, ptr, ptr, ...) @__dfsw_custom4(i32 1, i8 0, ptr %[[LABELVA2_0A]], ptr %[[LABELRETURN]], i32 2, i32 3)
call i32 (i32, ...) @custom4(i32 1, i32 2, i32 3)
ret void
@@ -88,8 +88,8 @@ define ptr @g(i32) {
; CHECK: define linkonce_odr i32 @"dfsw$custom4"(i32 %0, ...)
-; CHECK: declare void @__dfsw_custom1(i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext)
-; CHECK: declare i32 @__dfsw_custom2(i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, ptr)
+; CHECK: declare void @__dfsw_custom1(i32, i32, i8, i8)
+; CHECK: declare i32 @__dfsw_custom2(i32, i32, i8, i8, ptr)
-; CHECK: declare void @__dfsw_custom3(i32 zeroext, i8 zeroext, ptr, ...)
-; CHECK: declare i32 @__dfsw_custom4(i32 zeroext, i8 zeroext, ptr, ptr, ...)
+; CHECK: declare void @__dfsw_custom3(i32, i8, ptr, ...)
+; CHECK: declare i32 @__dfsw_custom4(i32, i8, ptr, ptr, ...)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/abilist_aggregate.ll b/llvm/test/Instrumentation/DataFlowSanitizer/abilist_aggregate.ll
index 8308e38f0b359d..14d7153e8b2aec 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/abilist_aggregate.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/abilist_aggregate.ll
@@ -76,7 +76,7 @@ define {i1, i7} @call_custom_with_ret({i32, i1} %a, [2 x i7] %b) {
; CHECK: [[B0:%.*]] = extractvalue [2 x i8] [[B]], 0
; CHECK: [[B1:%.*]] = extractvalue [2 x i8] [[B]], 1
; CHECK: [[B01:%.*]] = or i8 [[B0]], [[B1]]
- ; CHECK: [[R:%.*]] = call { i1, i7 } @__dfsw_custom_with_ret({ i32, i1 } %a, [2 x i7] %b, i8 zeroext [[A01]], i8 zeroext [[B01]], ptr %labelreturn)
+ ; CHECK: [[R:%.*]] = call { i1, i7 } @__dfsw_custom_with_ret({ i32, i1 } %a, [2 x i7] %b, i8 [[A01]], i8 [[B01]], ptr %labelreturn)
; CHECK: [[RE:%.*]] = load i8, ptr %labelreturn, align 1
; CHECK: [[RS0:%.*]] = insertvalue { i8, i8 } undef, i8 [[RE]], 0
; CHECK: [[RS1:%.*]] = insertvalue { i8, i8 } [[RS0]], i8 [[RE]], 1
@@ -97,7 +97,7 @@ define void @call_custom_without_ret({i32, i1} %a, [2 x i7] %b) {
; CHECK: [[B0:%.*]] = extractvalue [2 x i8] [[B]], 0
; CHECK: [[B1:%.*]] = extractvalue [2 x i8] [[B]], 1
; CHECK: [[B01:%.*]] = or i8 [[B0]], [[B1]]
- ; CHECK: call void @__dfsw_custom_without_ret({ i32, i1 } %a, [2 x i7] %b, i8 zeroext [[A01]], i8 zeroext [[B01]])
+ ; CHECK: call void @__dfsw_custom_without_ret({ i32, i1 } %a, [2 x i7] %b, i8 [[A01]], i8 [[B01]])
call void @custom_without_ret({i32, i1} %a, [2 x i7] %b)
ret void
@@ -117,7 +117,7 @@ define void @call_custom_varg({i32, i1} %a, [2 x i7] %b) {
; CHECK: [[B01:%.*]] = or i8 [[B0]], [[B1]]
; CHECK: store i8 [[B01]], ptr [[V0]], align 1
; CHECK: [[V:%.*]] = getelementptr inbounds nuw [1 x i8], ptr %labelva, i32 0, i32 0
- ; CHECK: call void ({ i32, i1 }, i8, ptr, ...) @__dfsw_custom_varg({ i32, i1 } %a, i8 zeroext [[A01]], ptr [[V]], [2 x i7] %b)
+ ; CHECK: call void ({ i32, i1 }, i8, ptr, ...) @__dfsw_custom_varg({ i32, i1 } %a, i8 [[A01]], ptr [[V]], [2 x i7] %b)
call void ({i32, i1}, ...) @custom_varg({i32, i1} %a, [2 x i7] %b)
ret void
@@ -134,7 +134,7 @@ define {i1, i7} @call_custom_cb({i32, i1} %a, [2 x i7] %b) {
; CHECK: [[B0:%.*]] = extractvalue [2 x i8] [[B]], 0
; CHECK: [[B1:%.*]] = extractvalue [2 x i8] [[B]], 1
; CHECK: [[B01:%.*]] = or i8 [[B0]], [[B1]]
- ; CHECK: [[R:%.*]] = call { i1, i7 } @__dfsw_custom_cb(ptr @cb.dfsan, { i32, i1 } %a, [2 x i7] %b, i8 zeroext 0, i8 zeroext [[A01]], i8 zeroext [[B01]], ptr %labelreturn)
+ ; CHECK: [[R:%.*]] = call { i1, i7 } @__dfsw_custom_cb(ptr @cb.dfsan, { i32, i1 } %a, [2 x i7] %b, i8 0, i8 [[A01]], i8 [[B01]], ptr %labelreturn)
; CHECK: [[RE:%.*]] = load i8, ptr %labelreturn, align 1
; CHECK: [[RS0:%.*]] = insertvalue { i8, i8 } undef, i8 [[RE]], 0
; CHECK: [[RS1:%.*]] = insertvalue { i8, i8 } [[RS0]], i8 [[RE]], 1
@@ -189,7 +189,7 @@ define ptr @ret_custom() {
; CHECK: [[B0:%.*]] = extractvalue [2 x i8] [[B]], 0
; CHECK: [[B1:%.*]] = extractvalue [2 x i8] [[B]], 1
; CHECK: [[B01:%.*]] = or i8 [[B0]], [[B1]]
-; CHECK: [[R:%.*]] = call { i1, i7 } @__dfsw_custom_cb(ptr %0, { i32, i1 } %1, [2 x i7] %2, i8 zeroext [[CB]], i8 zeroext [[A01]], i8 zeroext [[B01]], ptr %labelreturn)
+; CHECK: [[R:%.*]] = call { i1, i7 } @__dfsw_custom_cb(ptr %0, { i32, i1 } %1, [2 x i7] %2, i8 [[CB]], i8 [[A01]], i8 [[B01]], ptr %labelreturn)
; CHECK: [[RE:%.*]] = load i8, ptr %labelreturn, align 1
; CHECK: [[RS0:%.*]] = insertvalue { i8, i8 } undef, i8 [[RE]], 0
; CHECK: [[RS1:%.*]] = insertvalue { i8, i8 } [[RS0]], i8 [[RE]], 1
@@ -206,7 +206,7 @@ define {i1, i7} @custom_with_ret({i32, i1} %a, [2 x i7] %b) {
; CHECK: [[B0:%.*]] = extractvalue [2 x i8] [[B]], 0
; CHECK: [[B1:%.*]] = extractvalue [2 x i8] [[B]], 1
; CHECK: [[B01:%.*]] = or i8 [[B0]], [[B1]]
- ; CHECK: [[R:%.*]] = call { i1, i7 } @__dfsw_custom_with_ret({ i32, i1 } %0, [2 x i7] %1, i8 zeroext [[A01]], i8 zeroext [[B01]], ptr %labelreturn)
+ ; CHECK: [[R:%.*]] = call { i1, i7 } @__dfsw_custom_with_ret({ i32, i1 } %0, [2 x i7] %1, i8 [[A01]], i8 [[B01]], ptr %labelreturn)
; CHECK: [[RE:%.*]] = load i8, ptr %labelreturn, align 1
; CHECK: [[RS0:%.*]] = insertvalue { i8, i8 } undef, i8 [[RE]], 0
; CHECK: [[RS1:%.*]] = insertvalue { i8, i8 } [[RS0]], i8 [[RE]], 1
@@ -229,7 +229,7 @@ define void @custom_without_ret({i32, i1} %a, [2 x i7] %b) {
; CHECK: [[B0:%.*]] = extractvalue [2 x i8] [[B]], 0
; CHECK: [[B1:%.*]] = extractvalue [2 x i8] [[B]], 1
; CHECK: [[B01:%.*]] = or i8 [[B0]], [[B1]]
- ; CHECK: call void @__dfsw_custom_without_ret({ i32, i1 } %0, [2 x i7] %1, i8 zeroext [[A01]], i8 zeroext [[B01]])
+ ; CHECK: call void @__dfsw_custom_without_ret({ i32, i1 } %0, [2 x i7] %1, i8 [[A01]], i8 [[B01]])
; CHECK: ret
ret void
}
@@ -241,8 +241,8 @@ define void @custom_varg({i32, i1} %a, ...) {
ret void
}
-; CHECK: declare { i1, i7 } @__dfsw_custom_with_ret({ i32, i1 }, [2 x i7], i8 zeroext, i8 zeroext, ptr)
-; CHECK: declare void @__dfsw_custom_without_ret({ i32, i1 }, [2 x i7], i8 zeroext, i8 zeroext)
-; CHECK: declare void @__dfsw_custom_varg({ i32, i1 }, i8 zeroext, ptr, ...)
+; CHECK: declare { i1, i7 } @__dfsw_custom_with_ret({ i32, i1 }, [2 x i7], i8, i8, ptr)
+; CHECK: declare void @__dfsw_custom_without_ret({ i32, i1 }, [2 x i7], i8, i8)
+; CHECK: declare void @__dfsw_custom_varg({ i32, i1 }, i8, ptr, ...)
-; CHECK: declare { i1, i7 } @__dfsw_custom_cb(ptr, { i32, i1 }, [2 x i7], i8 zeroext, i8 zeroext, i8 zeroext, ptr)
+; CHECK: declare { i1, i7 } @__dfsw_custom_cb(ptr, { i32, i1 }, [2 x i7], i8, i8, i8, ptr)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/array.ll b/llvm/test/Instrumentation/DataFlowSanitizer/array.ll
index 14468c18ca201b..1214bf627c1c40 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/array.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/array.ll
@@ -78,7 +78,7 @@ define [1 x i1] @load_array1(ptr %p) {
; EVENT_CALLBACKS: @load_array1.dfsan
; EVENT_CALLBACKS: [[L:%.*]] = or i8
- ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 zeroext [[L]], ptr {{.*}})
+ ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 [[L]], ptr {{.*}})
; FAST: @load_array1.dfsan
; FAST: [[P:%.*]] = load i8, ptr @__dfsan_arg_tls, align [[ALIGN:2]]
@@ -104,7 +104,7 @@ define [2 x i1] @load_array2(ptr %p) {
; EVENT_CALLBACKS: @load_array2.dfsan
; EVENT_CALLBACKS: [[O1:%.*]] = or i8
; EVENT_CALLBACKS: [[O2:%.*]] = or i8 [[O1]]
- ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 zeroext [[O2]], ptr {{.*}})
+ ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 [[O2]], ptr {{.*}})
; FAST: @load_array2.dfsan
; FAST: [[P:%.*]] = load i8, ptr @__dfsan_arg_tls, align [[ALIGN:2]]
@@ -131,7 +131,7 @@ define [4 x i1] @load_array4(ptr %p) {
; EVENT_CALLBACKS: [[O1:%.*]] = or i32 [[O0]]
; EVENT_CALLBACKS: [[O2:%.*]] = trunc i32 [[O1]] to i8
; EVENT_CALLBACKS: [[O3:%.*]] = or i8 [[O2]]
- ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 zeroext [[O3]], ptr {{.*}})
+ ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 [[O3]], ptr {{.*}})
; FAST: @load_array4.dfsan
; FAST: [[T:%.*]] = trunc i32 {{.*}} to i8
@@ -193,7 +193,7 @@ define void @store_zero_array(ptr %p) {
define void @store_array2([2 x i1] %a, ptr %p) {
; EVENT_CALLBACKS: @store_array2.dfsan
; EVENT_CALLBACKS: [[E12:%.*]] = or i8
- ; EVENT_CALLBACKS: call void @__dfsan_store_callback(i8 zeroext [[E12]], ptr %p)
+ ; EVENT_CALLBACKS: call void @__dfsan_store_callback(i8 [[E12]], ptr %p)
; FAST: @store_array2.dfsan
; FAST: [[S:%.*]] = load [2 x i8], ptr @__dfsan_arg_tls, align [[ALIGN:2]]
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/basic.ll b/llvm/test/Instrumentation/DataFlowSanitizer/basic.ll
index fa8c9267bba599..3ccf0b5f70ad66 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/basic.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/basic.ll
@@ -27,10 +27,10 @@ define void @store(ptr %p) {
ret void
}
-; CHECK: declare void @__dfsan_load_callback(i8 zeroext, ptr)
-; CHECK: declare void @__dfsan_store_callback(i8 zeroext, ptr)
+; CHECK: declare void @__dfsan_load_callback(i8, ptr)
+; CHECK: declare void @__dfsan_store_callback(i8, ptr)
; CHECK: declare void @__dfsan_mem_transfer_callback(ptr, i64)
-; CHECK: declare void @__dfsan_cmp_callback(i8 zeroext)
+; CHECK: declare void @__dfsan_cmp_callback(i8)
; CHECK: ; Function Attrs: nounwind memory(read)
; CHECK-NEXT: declare zeroext i8 @__dfsan_union_load(ptr, i64)
@@ -39,10 +39,10 @@ define void @store(ptr %p) {
; CHECK-NEXT: declare zeroext i64 @__dfsan_load_label_and_origin(ptr, i64)
; CHECK: declare void @__dfsan_unimplemented(ptr)
-; CHECK: declare void @__dfsan_set_label(i8 zeroext, i32 zeroext, ptr, i64)
+; CHECK: declare void @__dfsan_set_label(i8, i32, ptr, i64)
; CHECK: declare void @__dfsan_nonzero_label()
; CHECK: declare void @__dfsan_vararg_wrapper(ptr)
-; CHECK: declare zeroext i32 @__dfsan_chain_origin(i32 zeroext)
-; CHECK: declare zeroext i32 @__dfsan_chain_origin_if_tainted(i8 zeroext, i32 zeroext)
+; CHECK: declare zeroext i32 @__dfsan_chain_origin(i32)
+; CHECK: declare zeroext i32 @__dfsan_chain_origin_if_tainted(i8, i32)
; CHECK: declare void @__dfsan_mem_origin_transfer(ptr, ptr, i64)
-; CHECK: declare void @__dfsan_maybe_store_origin(i8 zeroext, ptr, i64, i32 zeroext)
+; CHECK: declare void @__dfsan_maybe_store_origin(i8, ptr, i64, i32)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/callback.ll b/llvm/test/Instrumentation/DataFlowSanitizer/callback.ll
index b4f4f7c67b0169..0eeb57bda81b3c 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/callback.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/callback.ll
@@ -3,7 +3,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
target triple = "x86_64-unknown-linux-gnu"
define i8 @load8(ptr %p) {
- ; CHECK: call void @__dfsan_load_callback(i8 zeroext %[[LABEL:.*]], ptr %p)
+ ; CHECK: call void @__dfsan_load_callback(i8 %[[LABEL:.*]], ptr %p)
; CHECK: %a = load i8, ptr %p
; CHECK: store i8 %[[LABEL]], ptr @__dfsan_retval_tls
@@ -13,7 +13,7 @@ define i8 @load8(ptr %p) {
define void @store8(ptr %p, i8 %a) {
; CHECK: store i8 %[[LABEL:.*]], ptr %{{.*}}
- ; CHECK: call void @__dfsan_store_callback(i8 zeroext %[[LABEL]], ptr %p)
+ ; CHECK: call void @__dfsan_store_callback(i8 %[[LABEL]], ptr %p)
; CHECK: store i8 %a, ptr %p
store i8 %a, ptr %p
@@ -21,7 +21,7 @@ define void @store8(ptr %p, i8 %a) {
}
define i1 @cmp(i8 %a, i8 %b) {
- ; CHECK: call void @__dfsan_cmp_callback(i8 zeroext %[[CMPLABEL:.*]])
+ ; CHECK: call void @__dfsan_cmp_callback(i8 %[[CMPLABEL:.*]])
; CHECK: %c = icmp ne i8 %a, %b
; CHECK: store i8 %[[CMPLABEL]], ptr @__dfsan_retval_tls
@@ -29,11 +29,11 @@ define i1 @cmp(i8 %a, i8 %b) {
ret i1 %c
}
-; CHECK: declare void @__dfsan_load_callback(i8 zeroext, ptr)
-; CHECK: declare void @__dfsan_store_callback(i8 zeroext, ptr)
+; CHECK: declare void @__dfsan_load_callback(i8, ptr)
+; CHECK: declare void @__dfsan_store_callback(i8, ptr)
; CHECK: declare void @__dfsan_mem_transfer_callback(ptr, i64)
-; CHECK: declare void @__dfsan_cmp_callback(i8 zeroext)
-; CHECK: declare void @__dfsan_conditional_callback(i8 zeroext)
-; CHECK: declare void @__dfsan_conditional_callback_origin(i8 zeroext, i32 zeroext)
-; CHECK: declare void @__dfsan_reaches_function_callback(i8 zeroext, ptr, i32 zeroext, ptr)
-; CHECK: declare void @__dfsan_reaches_function_callback_origin(i8 zeroext, i32 zeroext, ptr, i32 zeroext, ptr)
+; CHECK: declare void @__dfsan_cmp_callback(i8)
+; CHECK: declare void @__dfsan_conditional_callback(i8)
+; CHECK: declare void @__dfsan_conditional_callback_origin(i8, i32)
+; CHECK: declare void @__dfsan_reaches_function_callback(i8, ptr, i32, ptr)
+; CHECK: declare void @__dfsan_reaches_function_callback_origin(i8, i32, ptr, i32, ptr)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/instrumented-args-exts.ll b/llvm/test/Instrumentation/DataFlowSanitizer/instrumented-args-exts.ll
index 9e9c1bd0fdbdc1..abe7eb3c4801d0 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/instrumented-args-exts.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/instrumented-args-exts.ll
@@ -1,9 +1,36 @@
-; Test extensions of arguments to instrumented function.
+; Test extensions of arguments to instrumented functions.
;
-; RUN: opt -passes='dfsan' -mtriple=s390x-unknown-linux -S %s | FileCheck %s
+; RUN: opt -passes='dfsan' -mtriple=x86_64-unknown-linux-gnu -S %s | FileCheck %s
+; RUN: opt -passes='dfsan' -mtriple=s390x-unknown-linux -S %s | FileCheck %s --check-prefix=SYSTEMZ
define void @fun() {
ret void
}
-; CHECK: declare void @__dfsan_mem_shadow_origin_conditional_exchange(i8 zeroext, ptr, ptr, ptr, i64)
+
+; CHECK: declare void @__dfsan_load_callback(i8, ptr)
+; CHECK: declare void @__dfsan_store_callback(i8, ptr)
+; CHECK: declare void @__dfsan_cmp_callback(i8)
+; CHECK: declare void @__dfsan_conditional_callback(i8)
+; CHECK: declare void @__dfsan_conditional_callback_origin(i8, i32)
+; CHECK: declare void @__dfsan_reaches_function_callback(i8, ptr, i32, ptr)
+; CHECK: declare void @__dfsan_reaches_function_callback_origin(i8, i32, ptr, i32, ptr)
+; CHECK: declare void @__dfsan_set_label(i8, i32, ptr, i64)
+; CHECK: declare zeroext i32 @__dfsan_chain_origin(i32)
+; CHECK: declare zeroext i32 @__dfsan_chain_origin_if_tainted(i8, i32)
+; CHECK: declare void @__dfsan_mem_shadow_origin_conditional_exchange(i8, ptr, ptr, ptr, i64)
+; CHECK: declare void @__dfsan_maybe_store_origin(i8, ptr, i64, i32)
+
+; SYSTEMZ: declare void @__dfsan_load_callback(i8 zeroext, ptr)
+; SYSTEMZ: declare void @__dfsan_store_callback(i8 zeroext, ptr)
+; SYSTEMZ: declare void @__dfsan_cmp_callback(i8 zeroext)
+; SYSTEMZ: declare void @__dfsan_conditional_callback(i8 zeroext)
+; SYSTEMZ: declare void @__dfsan_conditional_callback_origin(i8 zeroext, i32 zeroext)
+; SYSTEMZ: declare void @__dfsan_reaches_function_callback(i8 zeroext, ptr, i32 zeroext, ptr)
+; SYSTEMZ: declare void @__dfsan_reaches_function_callback_origin(i8 zeroext, i32 zeroext, ptr, i32 zeroext, ptr)
+; SYSTEMZ: declare void @__dfsan_set_label(i8 zeroext, i32 zeroext, ptr, i64)
+; SYSTEMZ: declare zeroext i32 @__dfsan_chain_origin(i32 zeroext)
+; SYSTEMZ: declare zeroext i32 @__dfsan_chain_origin_if_tainted(i8 zeroext, i32 zeroext)
+; SYSTEMZ: declare void @__dfsan_mem_shadow_origin_conditional_exchange(i8 zeroext, ptr, ptr, ptr, i64)
+; SYSTEMZ: declare void @__dfsan_maybe_store_origin(i8 zeroext, ptr, i64, i32 zeroext)
+
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/origin_abilist.ll b/llvm/test/Instrumentation/DataFlowSanitizer/origin_abilist.ll
index 8a66b44982b1c9..e5a78e0aaab425 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/origin_abilist.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/origin_abilist.ll
@@ -116,7 +116,7 @@ define void @call_custom_without_ret(i32 %a, i32 %b) {
; CHECK: [[AO:%.*]] = load i32, ptr @__dfsan_arg_origin_tls, align 4
; CHECK: [[BS:%.*]] = load i8, ptr getelementptr (i8, ptr @__dfsan_arg_tls, i64 2), align 2
; CHECK: [[AS:%.*]] = load i8, ptr @__dfsan_arg_tls, align 2
- ; CHECK: call void @__dfso_custom_without_ret(i32 %a, i32 %b, i8 zeroext [[AS]], i8 zeroext [[BS]], i32 zeroext [[AO]], i32 zeroext [[BO]])
+ ; CHECK: call void @__dfso_custom_without_ret(i32 %a, i32 %b, i8 [[AS]], i8 [[BS]], i32 [[AO]], i32 [[BO]])
; CHECK-NEXT: ret void
call void @custom_without_ret(i32 %a, i32 %b)
@@ -131,7 +131,7 @@ define i32 @call_custom_with_ret(i32 %a, i32 %b) {
; CHECK: %labelreturn = alloca i8, align 1
; CHECK: [[BS:%.*]] = load i8, ptr getelementptr (i8, ptr @__dfsan_arg_tls, i64 2), align 2
; CHECK: [[AS:%.*]] = load i8, ptr @__dfsan_arg_tls, align 2
- ; CHECK: {{.*}} = call i32 @__dfso_custom_with_ret(i32 %a, i32 %b, i8 zeroext [[AS]], i8 zeroext [[BS]], ptr %labelreturn, i32 zeroext [[AO]], i32 zeroext [[BO]], ptr %originreturn)
+ ; CHECK: {{.*}} = call i32 @__dfso_custom_with_ret(i32 %a, i32 %b, i8 [[AS]], i8 [[BS]], ptr %labelreturn, i32 [[AO]], i32 [[BO]], ptr %originreturn)
; CHECK: [[RS:%.*]] = load i8, ptr %labelreturn, align 1
; CHECK: [[RO:%.*]] = load i32, ptr %originreturn, align 4
; CHECK: store i8 [[RS]], ptr @__dfsan_retval_tls, align 2
@@ -155,7 +155,7 @@ define void @call_custom_varg_without_ret(i32 %a, i32 %b) {
; CHECK: [[VO0:%.*]] = getelementptr inbounds nuw [1 x i32], ptr %originva, i32 0, i32 0
; CHECK: store i32 [[AO]], ptr [[VO0]], align 4
; CHECK: [[VO0:%.*]] = getelementptr inbounds nuw [1 x i32], ptr %originva, i32 0, i32 0
- ; CHECK: call void (i32, i32, i8, i8, ptr, i32, i32, ptr, ...) @__dfso_custom_varg_without_ret(i32 %a, i32 %b, i8 zeroext [[AS]], i8 zeroext [[BS]], ptr [[VS0]], i32 zeroext [[AO]], i32 zeroext [[BO]], ptr [[VO0]], i32 %a)
+ ; CHECK: call void (i32, i32, i8, i8, ptr, i32, i32, ptr, ...) @__dfso_custom_varg_without_ret(i32 %a, i32 %b, i8 [[AS]], i8 [[BS]], ptr [[VS0]], i32 [[AO]], i32 [[BO]], ptr [[VO0]], i32 %a)
; CHECK-NEXT: ret void
call void (i32, i32, ...) @custom_varg_without_ret(i32 %a, i32 %b, i32 %a)
@@ -178,7 +178,7 @@ define i32 @call_custom_varg_with_ret(i32 %a, i32 %b) {
; CHECK: [[VO0:%.*]] = getelementptr inbounds nuw [1 x i32], ptr %originva, i32 0, i32 0
; CHECK: store i32 [[BO]], ptr [[VO0]], align 4
; CHECK: [[VO0:%.*]] = getelementptr inbounds nuw [1 x i32], ptr %originva, i32 0, i32 0
- ; CHECK: {{.*}} = call i32 (i32, i32, i8, i8, ptr, ptr, i32, i32, ptr, ptr, ...) @__dfso_custom_varg_with_ret(i32 %a, i32 %b, i8 zeroext [[AS]], i8 zeroext [[BS]], ptr [[VS0]], ptr %labelreturn, i32 zeroext [[AO]], i32 zeroext [[BO]], ptr [[VO0]], ptr %originreturn, i32 %b)
+ ; CHECK: {{.*}} = call i32 (i32, i32, i8, i8, ptr, ptr, i32, i32, ptr, ptr, ...) @__dfso_custom_varg_with_ret(i32 %a, i32 %b, i8 [[AS]], i8 [[BS]], ptr [[VS0]], ptr %labelreturn, i32 [[AO]], i32 [[BO]], ptr [[VO0]], ptr %originreturn, i32 %b)
; CHECK: [[RS:%.*]] = load i8, ptr %labelreturn, align 1
; CHECK: [[RO:%.*]] = load i32, ptr %originreturn, align 4
; CHECK: store i8 [[RS]], ptr @__dfsan_retval_tls, align 2
@@ -196,7 +196,7 @@ define i32 @call_custom_cb_with_ret(i32 %a, i32 %b) {
; CHECK: %labelreturn = alloca i8, align 1
; CHECK: [[BS:%.*]] = load i8, ptr getelementptr (i8, ptr @__dfsan_arg_tls, i64 2), align 2
; CHECK: [[AS:%.*]] = load i8, ptr @__dfsan_arg_tls, align 2
- ; CHECK: {{.*}} = call i32 @__dfso_custom_cb_with_ret(ptr @cb_with_ret.dfsan, i32 %a, i32 %b, i8 zeroext 0, i8 zeroext [[AS]], i8 zeroext [[BS]], ptr %labelreturn, i32 zeroext 0, i32 zeroext [[AO]], i32 zeroext [[BO]], ptr %originreturn)
+ ; CHECK: {{.*}} = call i32 @__dfso_custom_cb_with_ret(ptr @cb_with_ret.dfsan, i32 %a, i32 %b, i8 0, i8 [[AS]], i8 [[BS]], ptr %labelreturn, i32 0, i32 [[AO]], i32 [[BO]], ptr %originreturn)
; CHECK: [[RS:%.*]] = load i8, ptr %labelreturn, align 1
; CHECK: [[RO:%.*]] = load i32, ptr %originreturn, align 4
; CHECK: store i8 [[RS]], ptr @__dfsan_retval_tls, align 2
@@ -212,7 +212,7 @@ define void @call_custom_cb_without_ret(i32 %a, i32 %b) {
; CHECK: [[AO:%.*]] = load i32, ptr @__dfsan_arg_origin_tls, align 4
; CHECK: [[BS:%.*]] = load i8, ptr getelementptr (i8, ptr @__dfsan_arg_tls, i64 2), align 2
; CHECK: [[AS:%.*]] = load i8, ptr @__dfsan_arg_tls, align 2
- ; CHECK: call void @__dfso_custom_cb_without_ret(ptr @cb_without_ret.dfsan, i32 %a, i32 %b, i8 zeroext 0, i8 zeroext [[AS]], i8 zeroext [[BS]], i32 zeroext 0, i32 zeroext [[AO]], i32 zeroext [[BO]])
+ ; CHECK: call void @__dfso_custom_cb_without_ret(ptr @cb_without_ret.dfsan, i32 %a, i32 %b, i8 0, i8 [[AS]], i8 [[BS]], i32 0, i32 [[AO]], i32 [[BO]])
; CHECK-NEXT: ret void
call void @custom_cb_without_ret(ptr @cb_without_ret, i32 %a, i32 %b)
@@ -230,7 +230,7 @@ define void @call_custom_cb_without_ret(i32 %a, i32 %b) {
; CHECK-NEXT: [[AO:%.*]] = load i32, ptr @__dfsan_arg_origin_tls, align 4
; CHECK-NEXT: [[BS:%.*]] = load i8, ptr getelementptr (i8, ptr @__dfsan_arg_tls, i64 2), align 2
; CHECK-NEXT: [[AS:%.*]] = load i8, ptr @__dfsan_arg_tls, align 2
-; CHECK-NEXT: call void @__dfso_custom_without_ret(i32 %0, i32 %1, i8 zeroext [[AS]], i8 zeroext [[BS]], i32 zeroext [[AO]], i32 zeroext [[BO]])
+; CHECK-NEXT: call void @__dfso_custom_without_ret(i32 %0, i32 %1, i8 [[AS]], i8 [[BS]], i32 [[AO]], i32 [[BO]])
; CHECK-NEXT: ret void
; CHECK: define linkonce_odr i32 @"dfso$custom_with_ret"(i32 %0, i32 %1)
@@ -240,7 +240,7 @@ define void @call_custom_cb_without_ret(i32 %a, i32 %b) {
; CHECK-NEXT: %labelreturn = alloca i8, align 1
; CHECK-NEXT: [[BS:%.*]] = load i8, ptr getelementptr (i8, ptr @__dfsan_arg_tls, i64 2), align 2
; CHECK-NEXT: [[AS:%.*]] = load i8, ptr @__dfsan_arg_tls, align 2
-; CHECK-NEXT: [[R:%.*]] = call i32 @__dfso_custom_with_ret(i32 %0, i32 %1, i8 zeroext [[AS]], i8 zeroext [[BS]], ptr %labelreturn, i32 zeroext [[AO]], i32 zeroext [[BO]], ptr %originreturn)
+; CHECK-NEXT: [[R:%.*]] = call i32 @__dfso_custom_with_ret(i32 %0, i32 %1, i8 [[AS]], i8 [[BS]], ptr %labelreturn, i32 [[AO]], i32 [[BO]], ptr %originreturn)
; CHECK-NEXT: [[RS:%.*]] = load i8, ptr %labelreturn, align 1
; CHECK-NEXT: [[RO:%.*]] = load i32, ptr %originreturn, align 4
; CHECK-NEXT: store i8 [[RS]], ptr @__dfsan_retval_tls, align 2
@@ -264,7 +264,7 @@ define void @call_custom_cb_without_ret(i32 %a, i32 %b) {
; CHECK-NEXT: [[BS:%.*]] = load i8, ptr getelementptr (i8, ptr @__dfsan_arg_tls, i64 4), align 2
; CHECK-NEXT: [[AS:%.*]] = load i8, ptr getelementptr (i8, ptr @__dfsan_arg_tls, i64 2), align 2
; CHECK-NEXT: [[CS:%.*]] = load i8, ptr @__dfsan_arg_tls, align 2
-; CHECK-NEXT: [[R:%.*]] = call i32 @__dfso_custom_cb_with_ret(ptr %0, i32 %1, i32 %2, i8 zeroext [[CS]], i8 zeroext [[AS]], i8 zeroext [[BS]], ptr %labelreturn, i32 zeroext [[CO]], i32 zeroext [[AO]], i32 zeroext [[BO]], ptr %originreturn)
+; CHECK-NEXT: [[R:%.*]] = call i32 @__dfso_custom_cb_with_ret(ptr %0, i32 %1, i32 %2, i8 [[CS]], i8 [[AS]], i8 [[BS]], ptr %labelreturn, i32 [[CO]], i32 [[AO]], i32 [[BO]], ptr %originreturn)
; CHECK-NEXT: [[RS:%.*]] = load i8, ptr %labelreturn, align 1
; CHECK-NEXT: [[RO:%.*]] = load i32, ptr %originreturn, align 4
; CHECK-NEXT: store i8 [[RS]], ptr @__dfsan_retval_tls, align 2
@@ -278,17 +278,17 @@ define void @call_custom_cb_without_ret(i32 %a, i32 %b) {
; CHECK-NEXT: [[BS:%.*]] = load i8, ptr getelementptr (i8, ptr @__dfsan_arg_tls, i64 4), align 2
; CHECK-NEXT: [[AS:%.*]] = load i8, ptr getelementptr (i8, ptr @__dfsan_arg_tls, i64 2), align 2
; CHECK-NEXT: [[CS:%.*]] = load i8, ptr @__dfsan_arg_tls, align 2
-; CHECK-NEXT: call void @__dfso_custom_cb_without_ret(ptr %0, i32 %1, i32 %2, i8 zeroext [[CS]], i8 zeroext [[AS]], i8 zeroext [[BS]], i32 zeroext [[CO]], i32 zeroext [[AO]], i32 zeroext [[BO]])
+; CHECK-NEXT: call void @__dfso_custom_cb_without_ret(ptr %0, i32 %1, i32 %2, i8 [[CS]], i8 [[AS]], i8 [[BS]], i32 [[CO]], i32 [[AO]], i32 [[BO]])
; CHECK-NEXT: ret void
-; CHECK: declare void @__dfso_custom_without_ret(i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, i32 zeroext, i32 zeroext)
+; CHECK: declare void @__dfso_custom_without_ret(i32, i32, i8, i8, i32, i32)
-; CHECK: declare i32 @__dfso_custom_with_ret(i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, ptr, i32 zeroext, i32 zeroext, ptr)
+; CHECK: declare i32 @__dfso_custom_with_ret(i32, i32, i8, i8, ptr, i32, i32, ptr)
-; CHECK: declare i32 @__dfso_custom_cb_with_ret(ptr, i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, i8 zeroext, ptr, i32 zeroext, i32 zeroext, i32 zeroext, ptr)
+; CHECK: declare i32 @__dfso_custom_cb_with_ret(ptr, i32, i32, i8, i8, i8, ptr, i32, i32, i32, ptr)
-; CHECK: declare void @__dfso_custom_cb_without_ret(ptr, i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, i8 zeroext, i32 zeroext, i32 zeroext, i32 zeroext)
+; CHECK: declare void @__dfso_custom_cb_without_ret(ptr, i32, i32, i8, i8, i8, i32, i32, i32)
-; CHECK: declare void @__dfso_custom_varg_without_ret(i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, ptr, i32 zeroext, i32 zeroext, ptr, ...)
+; CHECK: declare void @__dfso_custom_varg_without_ret(i32, i32, i8, i8, ptr, i32, i32, ptr, ...)
-; CHECK: declare i32 @__dfso_custom_varg_with_ret(i32 zeroext, i32 zeroext, i8 zeroext, i8 zeroext, ptr, ptr, i32 zeroext, i32 zeroext, ptr, ptr, ...)
+; CHECK: declare i32 @__dfso_custom_varg_with_ret(i32, i32, i8, i8, ptr, ptr, i32, i32, ptr, ptr, ...)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/reaches_function.ll b/llvm/test/Instrumentation/DataFlowSanitizer/reaches_function.ll
index 1917bcc7be08fd..654696833a6710 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/reaches_function.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/reaches_function.ll
@@ -26,4 +26,4 @@ define void @call() {
ret void
}
-; CHECK-LABEL: @__dfsan_reaches_function_callback(i8 zeroext, ptr, i32 zeroext, ptr)
+; CHECK-LABEL: @__dfsan_reaches_function_callback(i8, ptr, i32, ptr)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll b/llvm/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll
index 333f1e45fb2df1..78e8d84675e394 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/shadow-args-zext.ll
@@ -1,12 +1,16 @@
; RUN: opt -mtriple=x86_64-unknown-linux-gnu < %s -passes=dfsan -S --dfsan-abilist=%S/Inputs/shadow-args-abilist.txt | FileCheck %s
+; RUN: opt -mtriple=s390x-unknown-linux < %s -passes=dfsan -S --dfsan-abilist=%S/Inputs/shadow-args-abilist.txt \
+; RUN: | FileCheck %s --check-prefix=SYSTEMZ
-; REQUIRES: x86-registered-target
+; REQUIRES: x86-registered-target, systemz-registered-target
; Test that the custom abi marks shadow parameters as zero extended.
define i32 @m() {
; CHECK-LABEL: @m.dfsan
- ; CHECK: %{{.*}} = call zeroext i16 @__dfsw_dfsan_get_label(i64 signext 56, i8 zeroext 0, ptr %{{.*}})
+ ; CHECK: %{{.*}} = call zeroext i16 @__dfsw_dfsan_get_label(i64 signext 56, i8 0, ptr %{{.*}})
+ ; SYSTEMZ-LABEL: @m.dfsan
+ ; SYSTEMZ: %{{.*}} = call zeroext i16 @__dfsw_dfsan_get_label(i64 signext 56, i8 zeroext 0, ptr %{{.*}})
entry:
%call = call zeroext i16 @dfsan_get_label(i64 signext 56)
@@ -16,7 +20,9 @@ entry:
define i32 @k() {
; CHECK-LABEL: @k.dfsan
- ; CHECK: %{{.*}} = call zeroext i16 @__dfsw_k2(i64 signext 56, i64 signext 67, i8 zeroext {{.*}}, i8 zeroext {{.*}}, ptr %{{.*}})
+ ; CHECK: %{{.*}} = call zeroext i16 @__dfsw_k2(i64 signext 56, i64 signext 67, i8 {{.*}}, i8 {{.*}}, ptr %{{.*}})
+ ; SYSTEMZ-LABEL: @k.dfsan
+ ; SYSTEMZ: %{{.*}} = call zeroext i16 @__dfsw_k2(i64 signext 56, i64 signext 67, i8 zeroext {{.*}}, i8 zeroext {{.*}}, ptr %{{.*}})
entry:
%call = call zeroext i16 @k2(i64 signext 56, i64 signext 67)
@@ -26,7 +32,9 @@ entry:
define i32 @k3() {
; CHECK-LABEL: @k3.dfsan
- ; CHECK: %{{.*}} = call zeroext i16 @__dfsw_k4(i64 signext 56, i64 signext 67, i64 signext 78, i64 signext 89, i8 zeroext {{.*}}, i8 zeroext {{.*}}, i8 zeroext {{.*}}, i8 zeroext {{.*}}, ptr %{{.*}})
+ ; CHECK: %{{.*}} = call zeroext i16 @__dfsw_k4(i64 signext 56, i64 signext 67, i64 signext 78, i64 signext 89, i8 {{.*}}, i8 {{.*}}, i8 {{.*}}, i8 {{.*}}, ptr %{{.*}})
+ ; SYSTEMZ-LABEL: @k3.dfsan
+ ; SYSTEMZ: %{{.*}} = call zeroext i16 @__dfsw_k4(i64 signext 56, i64 signext 67, i64 signext 78, i64 signext 89, i8 zeroext {{.*}}, i8 zeroext {{.*}}, i8 zeroext {{.*}}, i8 zeroext {{.*}}, ptr %{{.*}})
entry:
%call = call zeroext i16 @k4(i64 signext 56, i64 signext 67, i64 signext 78, i64 signext 89)
@@ -36,17 +44,26 @@ entry:
declare zeroext i16 @dfsan_get_label(i64 signext)
; CHECK-LABEL: @"dfsw$dfsan_get_label"
-; CHECK: %{{.*}} = call i16 @__dfsw_dfsan_get_label(i64 signext %0, i8 zeroext %1, ptr %{{.*}})
+; CHECK: %{{.*}} = call i16 @__dfsw_dfsan_get_label(i64 signext %0, i8 %1, ptr %{{.*}})
+; SYSTEMZ-LABEL: @"dfsw$dfsan_get_label"
+; SYSTEMZ: %{{.*}} = call i16 @__dfsw_dfsan_get_label(i64 signext %0, i8 zeroext %1, ptr %{{.*}})
declare zeroext i16 @k2(i64 signext, i64 signext)
; CHECK-LABEL: @"dfsw$k2"
-; CHECK: %{{.*}} = call i16 @__dfsw_k2(i64 signext %{{.*}}, i64 signext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, ptr %{{.*}})
+; CHECK: %{{.*}} = call i16 @__dfsw_k2(i64 signext %{{.*}}, i64 signext %{{.*}}, i8 %{{.*}}, i8 %{{.*}}, ptr %{{.*}})
+; SYSTEMZ-LABEL: @"dfsw$k2"
+; SYSTEMZ: %{{.*}} = call i16 @__dfsw_k2(i64 signext %{{.*}}, i64 signext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, ptr %{{.*}})
declare zeroext i16 @k4(i64 signext, i64 signext, i64 signext, i64 signext)
; CHECK-LABEL: @"dfsw$k4"
-; CHECK: %{{.*}} = call i16 @__dfsw_k4(i64 signext %{{.*}}, i64 signext %{{.*}}, i64 signext %{{.*}}, i64 signext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, ptr %{{.*}})
+; CHECK: %{{.*}} = call i16 @__dfsw_k4(i64 signext %{{.*}}, i64 signext %{{.*}}, i64 signext %{{.*}}, i64 signext %{{.*}}, i8 %{{.*}}, i8 %{{.*}}, i8 %{{.*}}, i8 %{{.*}}, ptr %{{.*}})
+; SYSTEMZ-LABEL: @"dfsw$k4"
+; SYSTEMZ: %{{.*}} = call i16 @__dfsw_k4(i64 signext %{{.*}}, i64 signext %{{.*}}, i64 signext %{{.*}}, i64 signext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, i8 zeroext %{{.*}}, ptr %{{.*}})
-; CHECK: declare zeroext i16 @__dfsw_dfsan_get_label(i64 signext, i8 zeroext, ptr)
-; CHECK: declare zeroext i16 @__dfsw_k2(i64 signext, i64 signext, i8 zeroext, i8 zeroext, ptr)
-; CHECK: declare zeroext i16 @__dfsw_k4(i64 signext, i64 signext, i64 signext, i64 signext, i8 zeroext, i8 zeroext, i8 zeroext, i8 zeroext, ptr)
+; CHECK: declare zeroext i16 @__dfsw_dfsan_get_label(i64 signext, i8, ptr)
+; CHECK: declare zeroext i16 @__dfsw_k2(i64 signext, i64 signext, i8, i8, ptr)
+; CHECK: declare zeroext i16 @__dfsw_k4(i64 signext, i64 signext, i64 signext, i64 signext, i8, i8, i8, i8, ptr)
+; SYSTEMZ: declare zeroext i16 @__dfsw_dfsan_get_label(i64 signext, i8 zeroext, ptr)
+; SYSTEMZ: declare zeroext i16 @__dfsw_k2(i64 signext, i64 signext, i8 zeroext, i8 zeroext, ptr)
+; SYSTEMZ: declare zeroext i16 @__dfsw_k4(i64 signext, i64 signext, i64 signext, i64 signext, i8 zeroext, i8 zeroext, i8 zeroext, i8 zeroext, ptr)
diff --git a/llvm/test/Instrumentation/DataFlowSanitizer/struct.ll b/llvm/test/Instrumentation/DataFlowSanitizer/struct.ll
index 9b4a35005a1421..7ac0af121d64e0 100644
--- a/llvm/test/Instrumentation/DataFlowSanitizer/struct.ll
+++ b/llvm/test/Instrumentation/DataFlowSanitizer/struct.ll
@@ -130,7 +130,7 @@ define {i1, i1} @load_struct(ptr %p) {
; EVENT_CALLBACKS: [[OL0:%.*]] = or i8
; EVENT_CALLBACKS: [[OL1:%.*]] = or i8 [[OL0]],
; EVENT_CALLBACKS: [[S0:%.*]] = insertvalue { i8, i8 } undef, i8 [[OL1]], 0
- ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 zeroext [[OL1]]
+ ; EVENT_CALLBACKS: call void @__dfsan_load_callback(i8 [[OL1]]
%s = load {i1, i1}, ptr %p
ret {i1, i1} %s
@@ -149,7 +149,7 @@ define void @store_struct(ptr %p, {i1, i1} %s) {
; EVENT_CALLBACKS: @store_struct.dfsan
; EVENT_CALLBACKS: [[OL:%.*]] = or i8
- ; EVENT_CALLBACKS: call void @__dfsan_store_callback(i8 zeroext [[OL]]
+ ; EVENT_CALLBACKS: call void @__dfsan_store_callback(i8 [[OL]]
; COMBINE_STORE_PTR: @store_struct.dfsan
; COMBINE_STORE_PTR: [[PL:%.*]] = load i8, ptr @__dfsan_arg_tls, align [[ALIGN:2]]
More information about the llvm-commits
mailing list