summaryrefslogtreecommitdiff
path: root/lib/IR/Verifier.cpp
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-05-15 23:58:57 +0000
committerReid Kleckner <reid@kleckner.net>2014-05-15 23:58:57 +0000
commita9f15ce71f107768f25958e721008034398d6a3e (patch)
tree1d9c61b6dbe91fa054f7d84af0313800d7d2f2c1 /lib/IR/Verifier.cpp
parentd5db8765d61ca77a55867cf1f39aecb8cae3a6cd (diff)
downloadllvm-a9f15ce71f107768f25958e721008034398d6a3e.tar.gz
llvm-a9f15ce71f107768f25958e721008034398d6a3e.tar.bz2
llvm-a9f15ce71f107768f25958e721008034398d6a3e.tar.xz
musttail: Fix the verification of alignment attributes
Previously this would fail with an assertion failure when trying to add an alignment attribute without a value. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208935 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/IR/Verifier.cpp')
-rw-r--r--lib/IR/Verifier.cpp27
1 files changed, 16 insertions, 11 deletions
diff --git a/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp
index ec287f58fa..ff9ca44f87 100644
--- a/lib/IR/Verifier.cpp
+++ b/lib/IR/Verifier.cpp
@@ -1567,6 +1567,20 @@ static bool isTypeCongruent(Type *L, Type *R) {
return PL->getAddressSpace() == PR->getAddressSpace();
}
+static AttrBuilder getParameterABIAttributes(int I, AttributeSet Attrs) {
+ static const Attribute::AttrKind ABIAttrs[] = {
+ Attribute::StructRet, Attribute::ByVal, Attribute::InAlloca,
+ Attribute::InReg, Attribute::Returned};
+ AttrBuilder Copy;
+ for (auto AK : ABIAttrs) {
+ if (Attrs.hasAttribute(I + 1, AK))
+ Copy.addAttribute(AK);
+ }
+ if (Attrs.hasAttribute(I + 1, Attribute::Alignment))
+ Copy.addAlignmentAttr(Attrs.getParamAlignment(I + 1));
+ return Copy;
+}
+
void Verifier::verifyMustTailCall(CallInst &CI) {
Assert1(!CI.isInlineAsm(), "cannot use musttail call with inline asm", &CI);
@@ -1598,20 +1612,11 @@ void Verifier::verifyMustTailCall(CallInst &CI) {
// - All ABI-impacting function attributes, such as sret, byval, inreg,
// returned, and inalloca, must match.
- static const Attribute::AttrKind ABIAttrs[] = {
- Attribute::Alignment, Attribute::StructRet, Attribute::ByVal,
- Attribute::InAlloca, Attribute::InReg, Attribute::Returned};
AttributeSet CallerAttrs = F->getAttributes();
AttributeSet CalleeAttrs = CI.getAttributes();
for (int I = 0, E = CallerTy->getNumParams(); I != E; ++I) {
- AttrBuilder CallerABIAttrs;
- AttrBuilder CalleeABIAttrs;
- for (auto AK : ABIAttrs) {
- if (CallerAttrs.hasAttribute(I + 1, AK))
- CallerABIAttrs.addAttribute(AK);
- if (CalleeAttrs.hasAttribute(I + 1, AK))
- CalleeABIAttrs.addAttribute(AK);
- }
+ AttrBuilder CallerABIAttrs = getParameterABIAttributes(I, CallerAttrs);
+ AttrBuilder CalleeABIAttrs = getParameterABIAttributes(I, CalleeAttrs);
Assert2(CallerABIAttrs == CalleeABIAttrs,
"cannot guarantee tail call due to mismatched ABI impacting "
"function attributes", &CI, CI.getOperand(I));