Skip to content

Commit 69bd957

Browse files
committed
TableGen: avoid dereferencing nullptr variable
ARM64 ended up reaching odder parts of TableGen alias generation than current backends and caused a segfault. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205089 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 483b0e9 commit 69bd957

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

utils/TableGen/CodeGenInstruction.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -436,26 +436,33 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
436436
ResultOperand &ResOp) {
437437
Init *Arg = Result->getArg(AliasOpNo);
438438
DefInit *ADI = dyn_cast<DefInit>(Arg);
439+
Record *ResultRecord = ADI ? ADI->getDef() : 0;
439440

440441
if (ADI && ADI->getDef() == InstOpRec) {
441442
// If the operand is a record, it must have a name, and the record type
442443
// must match up with the instruction's argument type.
443444
if (Result->getArgName(AliasOpNo).empty())
444445
PrintFatalError(Loc, "result argument #" + utostr(AliasOpNo) +
445446
" must have a name!");
446-
ResOp = ResultOperand(Result->getArgName(AliasOpNo), ADI->getDef());
447+
ResOp = ResultOperand(Result->getArgName(AliasOpNo), ResultRecord);
447448
return true;
448449
}
449450

450451
// For register operands, the source register class can be a subclass
451452
// of the instruction register class, not just an exact match.
453+
if (InstOpRec->isSubClassOf("RegisterOperand"))
454+
InstOpRec = InstOpRec->getValueAsDef("RegClass");
455+
456+
if (ADI && ADI->getDef()->isSubClassOf("RegisterOperand"))
457+
ADI = ADI->getDef()->getValueAsDef("RegClass")->getDefInit();
458+
452459
if (ADI && ADI->getDef()->isSubClassOf("RegisterClass")) {
453460
if (!InstOpRec->isSubClassOf("RegisterClass"))
454461
return false;
455462
if (!T.getRegisterClass(InstOpRec)
456463
.hasSubClass(&T.getRegisterClass(ADI->getDef())))
457464
return false;
458-
ResOp = ResultOperand(Result->getArgName(AliasOpNo), ADI->getDef());
465+
ResOp = ResultOperand(Result->getArgName(AliasOpNo), ResultRecord);
459466
return true;
460467
}
461468

@@ -468,9 +475,6 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
468475
InstOpRec = cast<DefInit>(DI->getArg(0))->getDef();
469476
}
470477

471-
if (InstOpRec->isSubClassOf("RegisterOperand"))
472-
InstOpRec = InstOpRec->getValueAsDef("RegClass");
473-
474478
if (!InstOpRec->isSubClassOf("RegisterClass"))
475479
return false;
476480

@@ -484,7 +488,7 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,
484488
PrintFatalError(Loc, "result fixed register argument must "
485489
"not have a name!");
486490

487-
ResOp = ResultOperand(ADI->getDef());
491+
ResOp = ResultOperand(ResultRecord);
488492
return true;
489493
}
490494

0 commit comments

Comments
 (0)