Skip to content

Commit

Permalink
musttail: Fix the verification of alignment attributes
Browse files Browse the repository at this point in the history
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
  • Loading branch information
rnk committed May 15, 2014
1 parent d5db876 commit a9f15ce
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 11 deletions.
27 changes: 16 additions & 11 deletions lib/IR/Verifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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));
Expand Down
7 changes: 7 additions & 0 deletions test/Verifier/musttail-invalid.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit a9f15ce

Please sign in to comment.