mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	To use this in conjunction with exuberant ctags to generate a single combined tags file, run tblgen first and then $ ctags --append [...] Since some identifiers have corresponding definitions in C++ code, it can be useful (if using vim) to also use cscope, and :set cscopetagorder=1 so that :tag X will preferentially select the tablegen symbol, while :cscope find g X will always find the C++ symbol. Patch by Kevin Schoedel! (a couple small formatting changes courtesy of clang-format) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177682 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			81 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===- TableGenBackends.h - Declarations for LLVM TableGen Backends -------===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file contains the declarations for all of the LLVM TableGen
 | |
| // backends. A "TableGen backend" is just a function. See below for a
 | |
| // precise description.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| 
 | |
| // A TableGen backend is a function that looks like
 | |
| //
 | |
| //    EmitFoo(RecordKeeper &RK, raw_ostream &OS /*, anything else you need */ )
 | |
| //
 | |
| // What you do inside of that function is up to you, but it will usually
 | |
| // involve generating C++ code to the provided raw_ostream.
 | |
| //
 | |
| // The RecordKeeper is just a top-level container for an in-memory
 | |
| // representation of the data encoded in the TableGen file. What a TableGen
 | |
| // backend does is walk around that in-memory representation and generate
 | |
| // stuff based on the information it contains.
 | |
| //
 | |
| // The in-memory representation is a node-graph (think of it like JSON but
 | |
| // with a richer ontology of types), where the nodes are subclasses of
 | |
| // Record. The methods `getClass`, `getDef` are the basic interface to
 | |
| // access the node-graph.  RecordKeeper also provides a handy method
 | |
| // `getAllDerivedDefinitions`. Consult "include/llvm/TableGen/Record.h" for
 | |
| // the exact interfaces provided by Record's and RecordKeeper.
 | |
| //
 | |
| // A common pattern for TableGen backends is for the EmitFoo function to
 | |
| // instantiate a class which holds some context for the generation process,
 | |
| // and then have most of the work happen in that class's methods. This
 | |
| // pattern partly has historical roots in the previous TableGen backend API
 | |
| // that involved a class and an invocation like `FooEmitter(RK).run(OS)`.
 | |
| //
 | |
| // Remember to wrap private things in an anonymous namespace. For most
 | |
| // backends, this means that the EmitFoo function is the only thing not in
 | |
| // the anonymous namespace.
 | |
| 
 | |
| 
 | |
| // FIXME: Reorganize TableGen so that build dependencies can be more
 | |
| // accurately expressed. Currently, touching any of the emitters (or
 | |
| // anything that they transitively depend on) causes everything dependent
 | |
| // on TableGen to be rebuilt (this includes all the targets!). Perhaps have
 | |
| // a standalone TableGen binary and have the backends be loadable modules
 | |
| // of some sort; then the dependency could be expressed as being on the
 | |
| // module, and all the modules would have a common dependency on the
 | |
| // TableGen binary with as few dependencies as possible on the rest of
 | |
| // LLVM.
 | |
| 
 | |
| 
 | |
| namespace llvm {
 | |
| 
 | |
| class raw_ostream;
 | |
| class RecordKeeper;
 | |
| 
 | |
| void EmitIntrinsics(RecordKeeper &RK, raw_ostream &OS, bool TargetOnly = false);
 | |
| void EmitAsmMatcher(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitAsmWriter(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitCallingConv(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitCodeEmitter(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitDAGISel(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitDFAPacketizer(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitDisassembler(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitFastISel(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitInstrInfo(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitPseudoLowering(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitRegisterInfo(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitSubtarget(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitMapTable(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitOptParser(RecordKeeper &RK, raw_ostream &OS);
 | |
| void EmitCTags(RecordKeeper &RK, raw_ostream &OS);
 | |
| 
 | |
| } // End llvm namespace
 |