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
This commit is contained in:
Reid Kleckner 2014-05-15 23:58:57 +00:00
parent d5db8765d6
commit a9f15ce71f
2 changed files with 23 additions and 11 deletions

View File

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

View File

@ -60,6 +60,13 @@ define void @mismatched_sret(i32* %a) {
ret void
}
declare void @mismatched_alignment_callee(i32* byval align 8)
define void @mismatched_alignment(i32* byval align 4 %a) {
; CHECK: mismatched ABI impacting function attributes
musttail call void @mismatched_alignment_callee(i32* byval align 8 %a)
ret void
}
declare i32 @not_tail_pos_callee()
define i32 @not_tail_pos() {
; CHECK: musttail call must be precede a ret with an optional bitcast