diff options
author | Chris Lattner <sabre@nondot.org> | 2010-11-06 06:39:47 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-11-06 06:39:47 +0000 |
commit | 225549f775db61c5dba10e14758f4b43c53ef593 (patch) | |
tree | a1bbc58de5faf69dc1f2ec4a8dd8b4391fe48993 | |
parent | 2a301704ea76535f0485d5c3b75664b323249bdb (diff) | |
download | external_llvm-225549f775db61c5dba10e14758f4b43c53ef593.zip external_llvm-225549f775db61c5dba10e14758f4b43c53ef593.tar.gz external_llvm-225549f775db61c5dba10e14758f4b43c53ef593.tar.bz2 |
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
-rw-r--r-- | utils/TableGen/AsmMatcherEmitter.cpp | 16 | ||||
-rw-r--r-- | utils/TableGen/CodeGenInstruction.cpp | 10 | ||||
-rw-r--r-- | utils/TableGen/CodeGenInstruction.h | 18 |
3 files changed, 31 insertions, 13 deletions
diff --git a/utils/TableGen/AsmMatcherEmitter.cpp b/utils/TableGen/AsmMatcherEmitter.cpp index 75bcc04..7d5ec62 100644 --- a/utils/TableGen/AsmMatcherEmitter.cpp +++ b/utils/TableGen/AsmMatcherEmitter.cpp @@ -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(); diff --git a/utils/TableGen/CodeGenInstruction.cpp b/utils/TableGen/CodeGenInstruction.cpp index 7428f2c..3c58cc6 100644 --- a/utils/TableGen/CodeGenInstruction.cpp +++ b/utils/TableGen/CodeGenInstruction.cpp @@ -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()); } diff --git a/utils/TableGen/CodeGenInstruction.h b/utils/TableGen/CodeGenInstruction.h index 24bdbe2..625afc6 100644 --- a/utils/TableGen/CodeGenInstruction.h +++ b/utils/TableGen/CodeGenInstruction.h @@ -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); }; } |