@@ -43,21 +43,20 @@ using ResultOperand = CodeGenInstAlias::ResultOperand;
4343static Expected<ResultOperand> matchSimpleOperand (const Init *Arg,
4444 const StringInit *ArgName,
4545 const Record *Op,
46- const CodeGenTarget &T) {
47- if (Op->isSubClassOf (" RegisterClass" ) ||
48- Op->isSubClassOf (" RegisterOperand" )) {
49- const Record *OpRC =
50- Op->isSubClassOf (" RegisterClass" ) ? Op : Op->getValueAsDef (" RegClass" );
51-
46+ const CodeGenTarget &T,
47+ ArrayRef<SMLoc> Loc) {
48+ if (const Record *OpRC = T.getAsRegClassLike (Op)) {
5249 if (const auto *ArgDef = dyn_cast<DefInit>(Arg)) {
5350 const Record *ArgRec = ArgDef->getDef ();
5451
5552 // Match 'RegClass:$name' or 'RegOp:$name'.
5653 if (const Record *ArgRC = T.getInitValueAsRegClassLike (Arg)) {
5754 if (ArgRC->isSubClassOf (" RegisterClass" )) {
58- if (!T.getRegisterClass (OpRC).hasSubClass (&T.getRegisterClass (ArgRC)))
55+ if (!OpRC->isSubClassOf (" RegisterClass" ) ||
56+ !T.getRegisterClass (OpRC, Loc).hasSubClass (
57+ &T.getRegisterClass (ArgRC, Loc)))
5958 return createStringError (
60- " argument register class" + ArgRC->getName () +
59+ " argument register class " + ArgRC->getName () +
6160 " is not a subclass of operand register class " +
6261 OpRC->getName ());
6362 if (!ArgName)
@@ -73,7 +72,8 @@ static Expected<ResultOperand> matchSimpleOperand(const Init *Arg,
7372
7473 // Match 'Reg'.
7574 if (ArgRec->isSubClassOf (" Register" )) {
76- if (!T.getRegisterClass (OpRC).contains (T.getRegBank ().getReg (ArgRec)))
75+ if (!T.getRegisterClass (OpRC, Loc).contains (
76+ T.getRegBank ().getReg (ArgRec)))
7777 return createStringError (
7878 " register argument " + ArgRec->getName () +
7979 " is not a member of operand register class " + OpRC->getName ());
@@ -111,11 +111,9 @@ static Expected<ResultOperand> matchSimpleOperand(const Init *Arg,
111111 return ResultOperand::createRecord (ArgName->getAsUnquotedString (),
112112 ArgDef->getDef ());
113113 }
114-
115- return createStringError (" argument must be a subclass of Operand" );
116114 }
117-
118- llvm_unreachable ( " Unknown operand kind " );
115+ return createStringError ( " argument must be a subclass of 'Operand' but got " +
116+ Op-> getName () + " instead " );
119117}
120118
121119static Expected<ResultOperand> matchComplexOperand (const Init *Arg,
@@ -204,7 +202,8 @@ CodeGenInstAlias::CodeGenInstAlias(const Record *R, const CodeGenTarget &T)
204202 const Record *SubOp =
205203 cast<DefInit>(OpInfo.MIOperandInfo ->getArg (SubOpIdx))->getDef ();
206204 Expected<ResultOperand> ResOpOrErr = matchSimpleOperand (
207- ArgDag->getArg (SubOpIdx), ArgDag->getArgName (SubOpIdx), SubOp, T);
205+ ArgDag->getArg (SubOpIdx), ArgDag->getArgName (SubOpIdx), SubOp, T,
206+ R->getLoc ());
208207 if (!ResOpOrErr)
209208 PrintFatalError (R, " in argument #" + Twine (ArgIdx) + " ." +
210209 Twine (SubOpIdx) + " : " +
@@ -225,8 +224,9 @@ CodeGenInstAlias::CodeGenInstAlias(const Record *R, const CodeGenTarget &T)
225224 } else {
226225 // Simple operand (RegisterClass, RegisterOperand or Operand with empty
227226 // MIOperandInfo).
228- Expected<ResultOperand> ResOpOrErr = matchSimpleOperand (
229- Result->getArg (ArgIdx), Result->getArgName (ArgIdx), Op, T);
227+ Expected<ResultOperand> ResOpOrErr =
228+ matchSimpleOperand (Result->getArg (ArgIdx), Result->getArgName (ArgIdx),
229+ Op, T, R->getLoc ());
230230 if (!ResOpOrErr)
231231 PrintFatalError (R, " in argument #" + Twine (ArgIdx) + " : " +
232232 toString (ResOpOrErr.takeError ()));
0 commit comments