<meta http-equiv="content-type" content="text/html; charset=utf-8"><div>Hi Bill,</div><div><br></div><div>This broke the build for us because we use -Wunused-function -Werror. </div><div><br></div>llvm/utils/TableGen/AsmWriterEmitter.cpp:714: error: 'void EmitSubtargetFeatureFlagEnumeration(<unnamed>::AsmWriterInfo&, llvm::raw_ostream&)' defined but not used [-Wunused-function]<div>

<br></div><div>llvm/utils/TableGen/AsmWriterEmitter.cpp:735: error: 'void EmitComputeAvailableFeatures(<unnamed>::AsmWriterInfo&, llvm::Record*, llvm::CodeGenTarget&, llvm::raw_ostream&)' defined but not used [-Wunused-function]</div>

<div><br></div><div>Would you be okay with waiting until you have the callers written before submitting? Or at least breaking it up in a different sort of way?</div><div><br></div><div>Nick</div><div><br></div><div><div>
<div class="gmail_quote">
On 21 March 2011 01:31, Bill Wendling <span dir="ltr"><<a href="mailto:isanbard@gmail.com">isanbard@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Author: void<br>
Date: Mon Mar 21 03:31:53 2011<br>
New Revision: 127988<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=127988&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=127988&view=rev</a><br>
Log:<br>
* Add classes that support the "feature" information.<br>
* Move the code that emits the reg in reg class matching into its own function.<br>
<br>
Modified:<br>
    llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp<br>
    llvm/trunk/utils/TableGen/AsmWriterEmitter.h<br>
<br>
Modified: llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp?rev=127988&r1=127987&r2=127988&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp?rev=127988&r1=127987&r2=127988&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp (original)<br>
+++ llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp Mon Mar 21 03:31:53 2011<br>
@@ -542,12 +542,116 @@<br>
   << "}\n\n#endif\n";<br>
 }<br>
<br>
-void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {<br>
-  CodeGenTarget Target(Records);<br>
-  Record *AsmWriter = Target.getAsmWriter();<br>
+namespace {<br>
<br>
-  O << "\n#ifdef PRINT_ALIAS_INSTR\n";<br>
-  O << "#undef PRINT_ALIAS_INSTR\n\n";<br>
+/// SubtargetFeatureInfo - Helper class for storing information on a subtarget<br>
+/// feature which participates in instruction matching.<br>
+struct SubtargetFeatureInfo {<br>
+  /// \brief The predicate record for this feature.<br>
+  const Record *TheDef;<br>
+<br>
+  /// \brief An unique index assigned to represent this feature.<br>
+  unsigned Index;<br>
+<br>
+  SubtargetFeatureInfo(const Record *D, unsigned Idx) : TheDef(D), Index(Idx) {}<br>
+<br>
+  /// \brief The name of the enumerated constant identifying this feature.<br>
+  std::string getEnumName() const {<br>
+    return "Feature_" + TheDef->getName();<br>
+  }<br>
+};<br>
+<br>
+struct AsmWriterInfo {<br>
+  /// Map of Predicate records to their subtarget information.<br>
+  std::map<const Record*, SubtargetFeatureInfo*> SubtargetFeatures;<br>
+<br>
+  /// getSubtargetFeature - Lookup or create the subtarget feature info for the<br>
+  /// given operand.<br>
+  SubtargetFeatureInfo *getSubtargetFeature(const Record *Def) const {<br>
+    assert(Def->isSubClassOf("Predicate") && "Invalid predicate type!");<br>
+    std::map<const Record*, SubtargetFeatureInfo*>::const_iterator I =<br>
+      SubtargetFeatures.find(Def);<br>
+    return I == SubtargetFeatures.end() ? 0 : I->second;<br>
+  }<br>
+<br>
+  void addReqFeatures(const std::vector<Record*> &Features) {<br>
+    for (std::vector<Record*>::const_iterator<br>
+           I = Features.begin(), E = Features.end(); I != E; ++I) {<br>
+      const Record *Pred = *I;<br>
+<br>
+      // Ignore predicates that are not intended for the assembler.<br>
+      if (!Pred->getValueAsBit("AssemblerMatcherPredicate"))<br>
+        continue;<br>
+<br>
+      if (Pred->getName().empty())<br>
+        throw TGError(Pred->getLoc(), "Predicate has no name!");<br>
+<br>
+      // Don't add the predicate again.<br>
+      if (getSubtargetFeature(Pred))<br>
+        continue;<br>
+<br>
+      unsigned FeatureNo = SubtargetFeatures.size();<br>
+      SubtargetFeatures[Pred] = new SubtargetFeatureInfo(Pred, FeatureNo);<br>
+      assert(FeatureNo < 32 && "Too many subtarget features!");<br>
+    }<br>
+  }<br>
+<br>
+  const SubtargetFeatureInfo *getFeatureInfo(const Record *R) {<br>
+    return SubtargetFeatures[R];<br>
+  }<br>
+};<br>
+<br>
+} // end anonymous namespace<br>
+<br>
+/// EmitSubtargetFeatureFlagEnumeration - Emit the subtarget feature flag<br>
+/// definitions.<br>
+static void EmitSubtargetFeatureFlagEnumeration(AsmWriterInfo &Info,<br>
+                                                raw_ostream &O) {<br>
+  O << "namespace {\n\n";<br>
+  O << "// Flags for subtarget features that participate in "<br>
+    << "alias instruction matching.\n";<br>
+  O << "enum SubtargetFeatureFlag {\n";<br>
+<br>
+  for (std::map<const Record*, SubtargetFeatureInfo*>::const_iterator<br>
+         I = Info.SubtargetFeatures.begin(),<br>
+         E = Info.SubtargetFeatures.end(); I != E; ++I) {<br>
+    SubtargetFeatureInfo &SFI = *I->second;<br>
+    O << "  " << SFI.getEnumName() << " = (1 << " << SFI.Index << "),\n";<br>
+  }<br>
+<br>
+  O << "  Feature_None = 0\n";<br>
+  O << "};\n\n";<br>
+  O << "} // end anonymous namespace\n";<br>
+}<br>
+<br>
+/// EmitComputeAvailableFeatures - Emit the function to compute the list of<br>
+/// available features given a subtarget.<br>
+static void EmitComputeAvailableFeatures(AsmWriterInfo &Info,<br>
+                                         Record *AsmWriter,<br>
+                                         CodeGenTarget &Target,<br>
+                                         raw_ostream &O) {<br>
+  std::string ClassName = AsmWriter->getValueAsString("AsmWriterClassName");<br>
+<br>
+  O << "unsigned " << Target.getName() << ClassName << "::\n"<br>
+    << "ComputeAvailableFeatures(const " << Target.getName()<br>
+    << "Subtarget *Subtarget) const {\n";<br>
+  O << "  unsigned Features = 0;\n";<br>
+<br>
+  for (std::map<const Record*, SubtargetFeatureInfo*>::const_iterator<br>
+         I = Info.SubtargetFeatures.begin(),<br>
+         E = Info.SubtargetFeatures.end(); I != E; ++I) {<br>
+    SubtargetFeatureInfo &SFI = *I->second;<br>
+    O << "  if (" << SFI.TheDef->getValueAsString("CondString")<br>
+      << ")\n";<br>
+    O << "    Features |= " << SFI.getEnumName() << ";\n";<br>
+  }<br>
+<br>
+  O << "  return Features;\n";<br>
+  O << "}\n\n";<br>
+}<br>
+<br>
+void AsmWriterEmitter::EmitRegIsInRegClass(raw_ostream &O) {<br>
+  CodeGenTarget Target(Records);<br>
<br>
   // Enumerate the register classes.<br>
   const std::vector<CodeGenRegisterClass> &RegisterClasses =<br>
@@ -606,6 +710,16 @@<br>
   O << "  }\n\n";<br>
   O << "  return false;\n";<br>
   O << "}\n\n";<br>
+}<br>
+<br>
+void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {<br>
+  CodeGenTarget Target(Records);<br>
+  Record *AsmWriter = Target.getAsmWriter();<br>
+<br>
+  O << "\n#ifdef PRINT_ALIAS_INSTR\n";<br>
+  O << "#undef PRINT_ALIAS_INSTR\n\n";<br>
+<br>
+  EmitRegIsInRegClass(O);<br>
<br>
   // Emit the method that prints the alias instruction.<br>
   std::string ClassName = AsmWriter->getValueAsString("AsmWriterClassName");<br>
<br>
Modified: llvm/trunk/utils/TableGen/AsmWriterEmitter.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmWriterEmitter.h?rev=127988&r1=127987&r2=127988&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmWriterEmitter.h?rev=127988&r1=127987&r2=127988&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/utils/TableGen/AsmWriterEmitter.h (original)<br>
+++ llvm/trunk/utils/TableGen/AsmWriterEmitter.h Mon Mar 21 03:31:53 2011<br>
@@ -38,6 +38,7 @@<br>
     void EmitPrintInstruction(raw_ostream &o);<br>
     void EmitGetRegisterName(raw_ostream &o);<br>
     void EmitGetInstructionName(raw_ostream &o);<br>
+    void EmitRegIsInRegClass(raw_ostream &O);<br>
     void EmitPrintAliasInstruction(raw_ostream &O);<br>
<br>
     AsmWriterInst *getAsmWriterInstByID(unsigned ID) const {<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>