<div>tl;dr: is anyone opposed to making the interface to a TableGen backend be:</div><div><br></div><div>void MyBackend(RecordKeeper &, raw_ostream & /* maybe some other args, per backend's needs */);</div><div>
<br></div><div>??</div><div><br></div>Currently, this is the "interface" for a TableGen backend:<div><br></div><div><div>struct TableGenBackend {</div><div>  virtual void anchor();</div><div>  virtual ~TableGenBackend() {}</div>
<div><br></div><div>  // run - All TableGen backends should implement the run method, which should</div><div>  // be the main entry point.</div><div>  virtual void run(raw_ostream &OS) = 0;</div><div><br></div><div><br>
</div><div>public:   // Useful helper routines...</div><div>  /// EmitSourceFileHeader - Output a LLVM style file header to the specified</div><div>  /// ostream.</div><div>  void EmitSourceFileHeader(StringRef Desc, raw_ostream &OS) const;</div>
<div><br></div><div>};</div></div><div><br></div><div>Let's go over this class's members one-by-one:</div><div><br></div><div>anchor(): hack to decrease link time and bloat <<a href="http://llvm.org/docs/CodingStandards.html#ll_virtual_anch">http://llvm.org/docs/CodingStandards.html#ll_virtual_anch</a>></div>
<div><br></div><div>~TableGenBackend(): the standard virtual destructor so that we can polymorphically delete. Except that we never polymorphically delete. Every use of the backends is basically</div><div>`SubtargetEmitter(Records).run(OS);` and is hardcoded into the respective TableGen.cpp file. No polymorphic creation ever happens. We never even declare a variable using this type. This <<a href="http://pastie.org/private/xhqaonrbarz3lf7b1gew6q">http://pastie.org/private/xhqaonrbarz3lf7b1gew6q</a>> is all occurrences of "TableGenBackend" in the LLVM source tree; that's a code smell if I've ever seen one.</div>
<div><br></div><div>run(): this does the action, but given that it is only ever called like `SubtargetEmitter(Records).run(OS);`, seems kind of pointless</div><div><br></div><div>EmitSourceFileHeader(): this is just a helper *function*, it doesn't rely on instance state since it just blasts some hardcoded strings surrounding the given StringRef into the raw_ostream it is given. It should not be a method in the first place.</div>
<div><br></div><div>So basically, this class just needs to die. All of the utils/TableGen/*Emitter.h files declaring subclasses of it can be merged into a single "Backends.h" declaring a single function with the aforementioned prototype for each one of the backends and all of the backends can be their own nicely self-contained .cpp file.</div>
<div>Clang has its own backends, but the makeover would be identical.</div><div><br></div><div>I'll also take the opportunity to fill in the sorely needed TODO at the end of <<a href="http://llvm.org/docs/TableGenFundamentals.html">http://llvm.org/docs/TableGenFundamentals.html</a>>. Finally :)))))</div>
<div><br></div><div>Finally, does anyone foresee me needing to make any changes to be build system? If so, some advice would be appreciated.</div><div><br></div><div>Any objections?</div><div><br></div><div>--Sean Silva</div>