================
@@ -11494,70 +11496,100 @@ bool SystemZTargetLowering::isInternal(const
Function *Fn) const {
return Itr->second;
}
-void SystemZTargetLowering::
-verifyNarrowIntegerArgs_Call(const SmallVectorImpl<ISD::OutputArg> &Outs,
- const Function *F, SDValue Callee) const {
- // Temporarily only do the check when explicitly requested, until it can be
- // enabled by default.
- if (!EnableIntArgExtCheck)
- return;
+bool SystemZTargetLowering::enableNarrowIntArgsVerification() const {
+ if (!Subtarget.isTargetELF())
+ return false;
+
+ if (EnableIntArgExtCheck.getNumOccurrences())
+ return EnableIntArgExtCheck;
+
+#ifdef NDEBUG
+ return false;
+#endif
+
+ return getTargetMachine().Options.VerifyArgABICompliance;
+}
+void SystemZTargetLowering::verifyNarrowIntegerArgs_Call(
+ CallLoweringInfo &CLI, const SmallVectorImpl<ISD::OutputArg> &Outs,
+ const Function *F, SDValue Callee) const {
+ if (!enableNarrowIntArgsVerification())
+ return;
bool IsInternal = false;
const Function *CalleeFn = nullptr;
if (auto *G = dyn_cast<GlobalAddressSDNode>(Callee))
if ((CalleeFn = dyn_cast<Function>(G->getGlobal())))
IsInternal = isInternal(CalleeFn);
- if (!IsInternal && !verifyNarrowIntegerArgs(Outs)) {
- errs() << "ERROR: Missing extension attribute of passed "
- << "value in call to function:\n" << "Callee: ";
+ bool C_ABI = CLI.CallConv == CallingConv::C && !IsInternal;
+ if (!verifyNarrowIntegerArgs(C_ABI, Outs, CalleeFn, /*IsRet=*/false)) {
+ errs() << "Callee: ";
if (CalleeFn != nullptr)
printFunctionArgExts(CalleeFn, errs());
else
errs() << "-\n";
- errs() << "Caller: ";
+ errs() << "Caller: ";
printFunctionArgExts(F, errs());
+ if (CLI.CB)
+ errs() << " " << *CLI.CB;
llvm_unreachable("");
}
+ LLVM_DEBUG(dbgs() << "Outgoing call arguments verified as ABI compliant: ";
+ if (CalleeFn != nullptr) printFunctionArgExts(CalleeFn, dbgs());
+ else dbgs() << "-\n";);
}
-void SystemZTargetLowering::
-verifyNarrowIntegerArgs_Ret(const SmallVectorImpl<ISD::OutputArg> &Outs,
- const Function *F) const {
- // Temporarily only do the check when explicitly requested, until it can be
- // enabled by default.
- if (!EnableIntArgExtCheck)
+void SystemZTargetLowering::verifyNarrowIntegerArgs_Ret(
+ CallingConv::ID CallConv, const SmallVectorImpl<ISD::OutputArg> &Outs,
+ const Function *F) const {
+ if (!enableNarrowIntArgsVerification())
return;
-
- if (!isInternal(F) && !verifyNarrowIntegerArgs(Outs)) {
- errs() << "ERROR: Missing extension attribute of returned "
- << "value from function:\n";
+ bool C_ABI = CallConv == CallingConv::C && !isInternal(F);
+ if (!verifyNarrowIntegerArgs(C_ABI, Outs, F, /*IsRet=*/true)) {
+ errs() << "Returning from function: ";
printFunctionArgExts(F, errs());
llvm_unreachable("");
}
+ LLVM_DEBUG(dbgs() << "Return argument verified as ABI compliant : ";
+ printFunctionArgExts(F, dbgs()));
}
-// Verify that narrow integer arguments are extended as required by the ABI.
-// Return false if an error is found.
+// Verify that narrow integer arguments are extended according to the
+// function header (calllee for a call, containing function for a ret).
+// If C_ABI is true, an extension attribute must be present.
bool SystemZTargetLowering::verifyNarrowIntegerArgs(
- const SmallVectorImpl<ISD::OutputArg> &Outs) const {
- if (!Subtarget.isTargetELF())
- return true;
-
- if (EnableIntArgExtCheck.getNumOccurrences()) {
- if (!EnableIntArgExtCheck)
- return true;
- } else if (!getTargetMachine().Options.VerifyArgABICompliance)
+ bool C_ABI, const SmallVectorImpl<ISD::OutputArg> &Outs,
+ const Function *FunHeader, bool IsRet) const {
+ if (IsRet && Outs.size() != 1)
return true;
for (unsigned i = 0; i < Outs.size(); ++i) {
- MVT VT = Outs[i].VT;
+ EVT OrigArgVT = Outs[i].ArgVT;
+ if (!OrigArgVT.isInteger() || OrigArgVT.getSizeInBits() >= 64)
+ continue;
+ assert(Outs[i].VT == MVT::i32 && "Unexpected integer argument VT.");
ISD::ArgFlagsTy Flags = Outs[i].Flags;
- if (VT.isInteger()) {
- assert((VT == MVT::i32 || VT.getSizeInBits() >= 64) &&
- "Unexpected integer argument VT.");
- if (VT == MVT::i32 &&
- !Flags.isSExt() && !Flags.isZExt() && !Flags.isNoExt())
+ unsigned OrigIdx = Outs[i].OrigArgIndex;
+
+ // Per the C ABI there must be an extension.
+ if (C_ABI && !Flags.isSExt() && !Flags.isZExt() && !Flags.isNoExt()) {
+ errs() << "ERROR: (C ABI violation) missing extension attribute on arg "
----------------
uweigand wrote:
Shouldn't have two spaces after "ERROR:"
https://github.com/llvm/llvm-project/pull/223755
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits