llvm-mc/AsmParser: Allow target to specific a comment delimiter, which will be
authorDaniel Dunbar <daniel@zuster.org>
Tue, 11 Aug 2009 20:59:47 +0000 (20:59 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 11 Aug 2009 20:59:47 +0000 (20:59 +0000)
used to strip hard coded comments out of .td assembly strings.

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

include/llvm/Target/Target.td
lib/Target/X86/X86.td
utils/TableGen/AsmMatcherEmitter.cpp

index dcbf5f288d8df33c6b2c3d6fd69dd0b6182b6ec0..d4a185041f3ba199a1f13534ffc0efffb2d80197 100644 (file)
@@ -484,6 +484,17 @@ class AsmParser {
   // used to support targets that need to parser multiple formats for the 
   // assembly language.
   int Variant = 0;
+
+  // CommentDelimiter - If given, the delimiter string used to recognize
+  // comments which are hard coded in the .td assembler strings for individual
+  // instructions.
+  string CommentDelimiter = "";
+
+  // RegisterPrefix - If given, the token prefix which indicates a register
+  // token. This is used by the matcher to automatically recognize hard coded
+  // register tokens as constrained registers, instead of tokens, for the
+  // purposes of matching.
+  string RegisterPrefix = "";
 }
 def DefaultAsmParser : AsmParser;
 
index effbddc8501431e9ae2ce61dbe460e43fab60a90..e7aa1f2107a6e5b80718debe836a3e9b326b76de 100644 (file)
@@ -182,6 +182,12 @@ include "X86CallingConv.td"
 def ATTAsmParser : AsmParser {
   string AsmParserClassName  = "ATTAsmParser";
   int Variant = 0;
+
+  // Discard comments in assembly strings.
+  string CommentDelimiter = "#";
+
+  // Recognize hard coded registers.
+  string RegisterPrefix = "%";
 }
 
 // The X86 target supports two different syntaxes for emitting machine code.
index 57b93b1d2700b04dd05f991aacd8950c75bd70fd..4dbd24c70db5c1ac30577663d7334f6f070e33a7 100644 (file)
@@ -501,6 +501,15 @@ public:
 
 class AsmMatcherInfo {
 public:
+  /// The tablegen AsmParser record.
+  Record *AsmParser;
+
+  /// The AsmParser "CommentDelimiter" value.
+  std::string CommentDelimiter;
+
+  /// The AsmParser "RegisterPrefix" value.
+  std::string RegisterPrefix;
+
   /// The classes which are needed for matching.
   std::vector<ClassInfo*> Classes;
   
@@ -537,6 +546,8 @@ private:
   void BuildOperandClasses(CodeGenTarget &Target);
 
 public:
+  AsmMatcherInfo(Record *_AsmParser);
+
   /// BuildInfo - Construct the various tables used during matching.
   void BuildInfo(CodeGenTarget &Target);
 };
@@ -778,6 +789,13 @@ void AsmMatcherInfo::BuildOperandClasses(CodeGenTarget &Target) {
   }
 }
 
+AsmMatcherInfo::AsmMatcherInfo(Record *_AsmParser) 
+  : AsmParser(_AsmParser),
+    CommentDelimiter(AsmParser->getValueAsString("CommentDelimiter")),
+    RegisterPrefix(AsmParser->getValueAsString("RegisterPrefix"))
+{
+}
+
 void AsmMatcherInfo::BuildInfo(CodeGenTarget &Target) {
   // Build info for the register classes.
   BuildRegisterClasses(Target);
@@ -801,6 +819,13 @@ void AsmMatcherInfo::BuildInfo(CodeGenTarget &Target) {
     II->Instr = &it->second;
     II->AsmString = FlattenVariants(CGI.AsmString, 0);
 
+    // Remove comments from the asm string.
+    if (!CommentDelimiter.empty()) {
+      size_t Idx = StringRef(II->AsmString).find(CommentDelimiter);
+      if (Idx != StringRef::npos)
+        II->AsmString = II->AsmString.substr(0, Idx);
+    }
+
     TokenizeAsmString(II->AsmString, II->Tokens);
 
     // Ignore instructions which shouldn't be matched.
@@ -1309,7 +1334,7 @@ void AsmMatcherEmitter::run(raw_ostream &OS) {
   EmitMatchRegisterName(Target, AsmParser, OS);
 
   // Compute the information on the instructions to match.
-  AsmMatcherInfo Info;
+  AsmMatcherInfo Info(AsmParser);
   Info.BuildInfo(Target);
 
   // Sort the instruction table using the partial order on classes.