disolve a hack, having CodeGenInstAlias decode the alias in the .td

file instead of the asmmatcher.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118324 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-11-06 06:39:47 +00:00
parent 2a301704ea
commit 225549f775
3 changed files with 31 additions and 13 deletions

View File

@ -355,12 +355,8 @@ struct MatchableInfo {
MatchableInfo(const CodeGenInstAlias *Alias)
: TheDef(Alias->TheDef), DefRec(Alias), TheOperandList(Alias->Operands),
AsmString(Alias->AsmString) {
// FIXME: Huge hack.
DefInit *DI = dynamic_cast<DefInit*>(Alias->Result->getOperator());
assert(DI);
InstrName = DI->getDef()->getName();
// FIXME: InstrName should be a CGI.
InstrName = Alias->ResultInst->TheDef->getName();
}
void Initialize(const AsmMatcherInfo &Info,
@ -1066,7 +1062,7 @@ void AsmMatcherInfo::BuildInfo() {
std::vector<Record*> AllInstAliases =
Records.getAllDerivedDefinitions("InstAlias");
for (unsigned i = 0, e = AllInstAliases.size(); i != e; ++i) {
CodeGenInstAlias *Alias = new CodeGenInstAlias(AllInstAliases[i]);
CodeGenInstAlias *Alias = new CodeGenInstAlias(AllInstAliases[i], Target);
OwningPtr<MatchableInfo> II(new MatchableInfo(Alias));
@ -1117,11 +1113,9 @@ void AsmMatcherInfo::BuildInfo() {
OperandName = Token.substr(1);
if (II->DefRec.is<const CodeGenInstruction*>())
BuildInstructionOperandReference(II,
OperandName, Op);
BuildInstructionOperandReference(II, OperandName, Op);
else
BuildAliasOperandReference(II,
OperandName, Op);
BuildAliasOperandReference(II, OperandName, Op);
}
II->BuildResultOperands();

View File

@ -388,8 +388,16 @@ FlattenAsmStringVariants(StringRef Cur, unsigned Variant) {
/// CodeGenInstAlias Implementation
//===----------------------------------------------------------------------===//
CodeGenInstAlias::CodeGenInstAlias(Record *R) : TheDef(R), Operands(R) {
CodeGenInstAlias::CodeGenInstAlias(Record *R, CodeGenTarget &T)
: TheDef(R), Operands(R) {
AsmString = R->getValueAsString("AsmString");
Result = R->getValueAsDag("ResultInst");
// Verify that the root of the result is an instruction.
DefInit *DI = dynamic_cast<DefInit*>(Result->getOperator());
if (DI == 0 || !DI->getDef()->isSubClassOf("Instruction"))
throw TGError(R->getLoc(), "result of inst alias should be an instruction");
ResultInst = &T.getInstruction(DI->getDef());
}

View File

@ -15,6 +15,7 @@
#define CODEGEN_INSTRUCTION_H
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/ADT/StringRef.h"
#include <string>
#include <vector>
#include <utility>
@ -264,7 +265,22 @@ namespace llvm {
/// Result - The result instruction.
DagInit *Result;
CodeGenInstAlias(Record *R);
/// ResultInst - The instruction generated by the alias (decoded from
/// Result).
CodeGenInstruction *ResultInst;
struct ResultOperand {
StringRef Name;
Record *R;
ResultOperand(StringRef N, Record *r) : Name(N), R(r) {}
};
/// ResultOperands - The decoded operands for the result instruction.
std::vector<ResultOperand> ResultOperands;
CodeGenInstAlias(Record *R, CodeGenTarget &T);
};
}