Skip to content

Commit

Permalink
decode and validate instruction alias result definitions.
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118327 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
lattner committed Nov 6, 2010
1 parent 9cdf428 commit d0f225c
Showing 1 changed file with 33 additions and 0 deletions.
33 changes: 33 additions & 0 deletions utils/TableGen/CodeGenInstruction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -400,4 +400,37 @@ CodeGenInstAlias::CodeGenInstAlias(Record *R, CodeGenTarget &T)
throw TGError(R->getLoc(), "result of inst alias should be an instruction");

ResultInst = &T.getInstruction(DI->getDef());

// Check number of arguments in the result.
if (ResultInst->Operands.size() != Result->getNumArgs())
throw TGError(R->getLoc(), "result has " + utostr(Result->getNumArgs()) +
" arguments, but " + ResultInst->TheDef->getName() +
" instruction expects " + utostr(ResultInst->Operands.size())+
" operands!");

// Decode and validate the arguments of the result.
for (unsigned i = 0, e = Result->getNumArgs(); i != e; ++i) {
Init *Arg = Result->getArg(i);

// If the operand is a record, it must have a name, and the record type must
// match up with the instruction's argument type.
if (DefInit *ADI = dynamic_cast<DefInit*>(Arg)) {
if (Result->getArgName(i).empty())
throw TGError(R->getLoc(), "result argument #" + utostr(i) +
" must have a name!");

if (ADI->getDef() != ResultInst->Operands[i].Rec)
throw TGError(R->getLoc(), "result argument #" + utostr(i) +
" declared with class " + ADI->getDef()->getName() +
", instruction operand is class " +
ResultInst->Operands[i].Rec->getName());

// Now that it is validated, add it.
ResultOperands.push_back(ResultOperand(Result->getArgName(i),
ADI->getDef()));
continue;
}

throw TGError(R->getLoc(), "result of inst alias has unknown operand type");
}
}

0 comments on commit d0f225c

Please sign in to comment.