<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>