Packed types, brought to you by Brad Jones
[oota-llvm.git] / include / llvm / Bytecode / BytecodeHandler.h
1 //===-- BytecodeHandler.h - Handle Bytecode Parsing Events ------*- C++ -*-===//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by Reid Spencer and is distributed under the 
6 // University of Illinois Open Source License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9 //
10 //  This header file defines the interface to the Bytecode Handler. The handler
11 //  is called by the Bytecode Reader to obtain out-of-band parsing events for
12 //  tasks other then LLVM IR construction.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #ifndef LLVM_BYTECODE_BYTECODEHANDLER_H
17 #define LLVM_BYTECODE_BYTECODEHANDLER_H
18
19 #include "llvm/Module.h"
20
21 namespace llvm {
22
23 class ArrayType;
24 class StructType;
25 class PointerType;
26 class PackedType;
27 class ConstantArray;
28 class Module;
29
30 /// This class provides the interface for handling bytecode events during
31 /// reading of bytecode. The methods on this interface are invoked by the 
32 /// BytecodeReader as it discovers the content of a bytecode stream. 
33 /// This class provides a a clear separation of concerns between recognizing 
34 /// the semantic units of a bytecode file (the Reader) and deciding what to do 
35 /// with them (the Handler). 
36 ///
37 /// The BytecodeReader recognizes the content of the bytecode file and
38 /// calls the BytecodeHandler methods to let it perform additional tasks. This
39 /// arrangement allows Bytecode files to be read and handled for a number of
40 /// purposes simply by creating a subclass of BytecodeHandler. None of the
41 /// parsing details need to be understood, only the meaning of the calls
42 /// made on this interface.
43 /// 
44 /// @see BytecodeHandler
45 /// @brief Handle Bytecode Parsing Events
46 class BytecodeHandler {
47
48 /// @name Constructors And Operators
49 /// @{
50 public:
51   /// @brief Default constructor (empty)
52   BytecodeHandler() {}
53   /// @brief Virtual destructor (empty)
54   virtual ~BytecodeHandler();
55
56 private:
57   BytecodeHandler(const BytecodeHandler &);  // DO NOT IMPLEMENT
58   void operator=(const BytecodeHandler &);  // DO NOT IMPLEMENT
59
60 /// @}
61 /// @name Handler Methods
62 /// @{
63 public:
64
65   /// This method is called whenever the parser detects an error in the
66   /// bytecode formatting. It gives the handler a chance to do something
67   /// with the error message before the parser throws an exception to 
68   /// terminate the parsing. 
69   /// @brief Handle parsing errors.
70   virtual void handleError(const std::string& str ) {}
71
72   /// This method is called at the beginning of a parse before anything is
73   /// read in order to give the handler a chance to initialize.
74   /// @brief Handle the start of a bytecode parse
75   virtual void handleStart( Module* Mod, unsigned byteSize ) {}
76
77   /// This method is called at the end of a parse after everything has been
78   /// read in order to give the handler a chance to terminate.
79   /// @brief Handle the end of a bytecode parse
80   virtual void handleFinish() {}
81
82   /// This method is called at the start of a module to indicate that a
83   /// module is being parsed.
84   /// @brief Handle the start of a module.
85   virtual void handleModuleBegin(const std::string& moduleId) {}
86
87   /// This method is called at the end of a module to indicate that the module
88   /// previously being parsed has concluded.
89   /// @brief Handle the end of a module.
90   virtual void handleModuleEnd(
91     const std::string& moduleId ///< An identifier for the module
92   ) {}
93
94   /// This method is called once the version information has been parsed. It 
95   /// provides the information about the version of the bytecode file being 
96   /// read.
97   /// @brief Handle the bytecode prolog
98   virtual void handleVersionInfo(
99     unsigned char RevisionNum,        ///< Byte code revision number
100     Module::Endianness Endianness,    ///< Endianness indicator
101     Module::PointerSize PointerSize   ///< PointerSize indicator
102   ) {}
103
104   /// This method is called at the start of a module globals block which
105   /// contains the global variables and the function placeholders
106   virtual void handleModuleGlobalsBegin() {}
107
108   /// This method is called when a non-initialized global variable is 
109   /// recognized. Its type, constness, and linkage type are provided.
110   /// @brief Handle a non-initialized global variable
111   virtual void handleGlobalVariable( 
112     const Type* ElemType,     ///< The type of the global variable
113     bool isConstant,          ///< Whether the GV is constant or not
114     GlobalValue::LinkageTypes,///< The linkage type of the GV
115     unsigned SlotNum,         ///< Slot number of GV
116     unsigned initSlot         ///< Slot number of GV's initializer (0 if none)
117   ) {}
118
119   /// This method is called when a new type is recognized. The type is 
120   /// converted from the bytecode and passed to this method.
121   /// @brief Handle a type
122   virtual void handleType( 
123     const Type* Ty ///< The type that was just recognized
124   ) {}
125
126   /// This method is called when the function prototype for a function is
127   /// encountered in the module globals block.
128   virtual void handleFunctionDeclaration( 
129     Function* Func ///< The function being declared
130   ) {}
131
132   /// This method is called when a global variable is initialized with
133   /// its constant value. Because of forward referencing, etc. this is
134   /// done towards the end of the module globals block
135   virtual void handleGlobalInitializer(GlobalVariable*, Constant* ) {}
136
137   /// This method is called at the end of the module globals block.
138   /// @brief Handle end of module globals block.
139   virtual void handleModuleGlobalsEnd() {}
140
141   /// This method is called at the beginning of a compaction table.
142   /// @brief Handle start of compaction table.
143   virtual void handleCompactionTableBegin() {}
144
145   /// @brief Handle start of a compaction table plane
146   virtual void handleCompactionTablePlane( 
147     unsigned Ty,         ///< The type of the plane (slot number)
148     unsigned NumEntries  ///< The number of entries in the plane
149   ) {}
150
151   /// @brief Handle a type entry in the compaction table
152   virtual void handleCompactionTableType( 
153     unsigned i,       ///< Index in the plane of this type
154     unsigned TypSlot, ///< Slot number for this type
155     const Type*       ///< The type referenced by this slot
156   ) {}
157
158   /// @brief Handle a value entry in the compaction table
159   virtual void handleCompactionTableValue(
160     unsigned i,       ///< Index in the compaction table's type plane
161     unsigned TypSlot, ///< The slot (plane) of the type of this value
162     unsigned ValSlot  ///< The global value slot of the value
163   ) {}
164
165   /// @brief Handle end of a compaction table
166   virtual void handleCompactionTableEnd() {}
167
168   /// @brief Handle start of a symbol table
169   virtual void handleSymbolTableBegin( 
170     Function* Func,  ///< The function to which the ST belongs
171     SymbolTable* ST  ///< The symbol table being filled
172   ) {}
173
174   /// @brief Handle start of a symbol table plane
175   virtual void handleSymbolTablePlane( 
176     unsigned TySlot,      ///< The slotnum of the type plane
177     unsigned NumEntries,  ///< Number of entries in the plane
178     const Type* Typ       ///< The type of this type plane
179   ) {}
180
181   /// @brief Handle a named type in the symbol table
182   virtual void handleSymbolTableType( 
183     unsigned i,              ///< The index of the type in this plane
184     unsigned slot,           ///< Slot number of the named type
185     const std::string& name  ///< Name of the type
186   ) {}
187
188   /// @brief Handle a named value in the symbol table
189   virtual void handleSymbolTableValue( 
190     unsigned i,              ///< The index of the value in this plane
191     unsigned slot,           ///< Slot number of the named value
192     const std::string& name  ///< Name of the value.
193   ) {}
194
195   /// @brief Handle the end of a symbol table
196   virtual void handleSymbolTableEnd() {}
197
198   /// @brief Handle the beginning of a function body
199   virtual void handleFunctionBegin(
200     Function* Func, ///< The function being defined
201     unsigned Size   ///< The size (in bytes) of the function's bytecode
202   ) {}
203
204   /// @brief Handle the end of a function body
205   virtual void handleFunctionEnd(
206     Function* Func  ///< The function whose definition has just finished.
207   ) {}
208
209   /// @brief Handle the beginning of a basic block
210   virtual void handleBasicBlockBegin(
211     unsigned blocknum ///< The block number of the block
212   ) {}
213
214   /// This method is called for each instruction that is parsed. 
215   /// @returns true if the instruction is a block terminating instruction
216   /// @brief Handle an instruction
217   virtual bool handleInstruction(
218     unsigned Opcode,                 ///< Opcode of the instruction
219     const Type* iType,               ///< Instruction type
220     std::vector<unsigned>& Operands, ///< Vector of slot # operands
221     unsigned Length                  ///< Length of instruction in bc bytes
222   ) { return false; }
223
224   /// @brief Handle the end of a basic block
225   virtual void handleBasicBlockEnd(
226     unsigned blocknum  ///< The block number of the block just finished
227   ) {}
228
229   /// @brief Handle start of global constants block.
230   virtual void handleGlobalConstantsBegin() {}
231
232   /// @brief Handle a constant expression
233   virtual void handleConstantExpression( 
234     unsigned Opcode,  ///< Opcode of primary expression operator
235     std::vector<Constant*> ArgVec, ///< expression args
236     Constant* C ///< The constant value
237   ) {}
238
239   /// @brief Handle a constant array
240   virtual void handleConstantArray( 
241     const ArrayType* AT,                ///< Type of the array
242     std::vector<Constant*>& ElementSlots,///< Slot nums for array values
243     unsigned TypeSlot,                  ///< Slot # of type
244     Constant* Val                       ///< The constant value
245   ) {}
246
247   /// @brief Handle a constant structure 
248   virtual void handleConstantStruct( 
249     const StructType* ST,               ///< Type of the struct
250     std::vector<Constant*>& ElementSlots,///< Slot nums for struct values
251     Constant* Val                       ///< The constant value
252   ) {}
253
254   /// @brief Handle a constant packed
255   virtual void handleConstantPacked( 
256     const PackedType* PT,                ///< Type of the array
257     std::vector<Constant*>& ElementSlots,///< Slot nums for packed values
258     unsigned TypeSlot,                  ///< Slot # of type
259     Constant* Val                       ///< The constant value
260   ) {}
261
262   /// @brief Handle a constant pointer
263   virtual void handleConstantPointer( 
264     const PointerType* PT, ///< Type of the pointer
265     unsigned Slot,         ///< Slot num of initializer value
266     GlobalValue* GV        ///< Referenced global value
267   ) {}
268
269   /// @brief Handle a constant strings (array special case)
270   virtual void handleConstantString(
271     const ConstantArray* CA ///< Type of the string array
272   ) {}
273
274   /// @brief Handle a primitive constant value
275   virtual void handleConstantValue( 
276     Constant * c ///< The constant just defined
277   ) {}
278
279   /// @brief Handle the end of the global constants
280   virtual void handleGlobalConstantsEnd() {}
281
282   /// @brief Handle an alignment event
283   virtual void handleAlignment(
284     unsigned numBytes ///< The number of bytes added for alignment
285   ) {}
286
287   /// @brief Handle a bytecode block
288   virtual void handleBlock(
289     unsigned BType,                ///< The type of block
290     const unsigned char* StartPtr, ///< The start of the block
291     unsigned Size                  ///< The size of the block
292   ) {}
293
294   /// @brief Handle a variable bit rate 32 bit unsigned
295   virtual void handleVBR32(
296     unsigned Size  ///< Number of bytes the vbr_uint took up
297   ) {}
298
299   /// @brief Handle a variable bit rate 64 bit unsigned
300   virtual void handleVBR64(
301     unsigned Size  ///< Number of byte sthe vbr_uint64 took up
302   ) {}
303 /// @}
304
305 };
306
307 }
308 // vim: sw=2 ai
309 #endif