disolve a hack, having CodeGenInstAlias decode the alias in the .td
authorChris Lattner <sabre@nondot.org>
Sat, 6 Nov 2010 06:39:47 +0000 (06:39 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 6 Nov 2010 06:39:47 +0000 (06:39 +0000)
file instead of the asmmatcher.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118324 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/AsmMatcherEmitter.cpp
utils/TableGen/CodeGenInstruction.cpp
utils/TableGen/CodeGenInstruction.h

index 75bcc046f69a800da116e20473a97d36f065b8f6..7d5ec6210beca1aa007a289696e698d2928a723d 100644 (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();
index 7428f2c88fe2421bb16ad0425412c0fab58ada6f..3c58cc63995be8a91ae5b30368a102242f9a2e7a 100644 (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());
 }
index 24bdbe2794b064bb9740c2a1b23d4b828036e6fe..625afc6bef776886d3be9f650883c8f540b39ce5 100644 (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);
   };    
 }