diff options
Diffstat (limited to 'lib/Bytecode/Analyzer/Parser.h')
-rw-r--r-- | lib/Bytecode/Analyzer/Parser.h | 92 |
1 files changed, 69 insertions, 23 deletions
diff --git a/lib/Bytecode/Analyzer/Parser.h b/lib/Bytecode/Analyzer/Parser.h index 38a14717d5..08758cb5f2 100644 --- a/lib/Bytecode/Analyzer/Parser.h +++ b/lib/Bytecode/Analyzer/Parser.h @@ -41,7 +41,18 @@ class AbstractBytecodeParser { /// @name Constructors /// @{ public: - AbstractBytecodeParser( BytecodeHandler* h ) { handler = h; } + AbstractBytecodeParser( + BytecodeHandler* h, + bool repAlignment = false, + bool repBlocks = false, + bool repVBR = false + ) { + handler = h; + reportAlignment = repAlignment; + reportBlocks = repBlocks; + reportVBR = repVBR; + } + ~AbstractBytecodeParser() { } /// @} @@ -86,64 +97,72 @@ public: /// @{ protected: /// @brief Parse whole module scope - void ParseModule (BufPtr &Buf, BufPtr End); + void ParseModule (); /// @brief Parse the version information block - void ParseVersionInfo (BufPtr &Buf, BufPtr End); + void ParseVersionInfo (); /// @brief Parse the ModuleGlobalInfo block - void ParseModuleGlobalInfo (BufPtr &Buf, BufPtr End); + void ParseModuleGlobalInfo (); /// @brief Parse a symbol table - void ParseSymbolTable (BufPtr &Buf, BufPtr End); + void ParseSymbolTable (); /// This function parses LLVM functions lazily. It obtains the type of the /// function and records where the body of the function is in the bytecode /// buffer. The caller can then use the ParseNextFunction and /// ParseAllFunctionBodies to get handler events for the functions. /// @brief Parse functions lazily. - void ParseFunctionLazily (BufPtr &Buf, BufPtr End); + void ParseFunctionLazily (); /// @brief Parse a function body - void ParseFunctionBody (const Type* FType, BufPtr &Buf, BufPtr EndBuf); + void ParseFunctionBody (const Type* FType); /// @brief Parse a compaction table - void ParseCompactionTable (BufPtr &Buf, BufPtr End); + void ParseCompactionTable (); /// @brief Parse global types - void ParseGlobalTypes (BufPtr &Buf, BufPtr End); + void ParseGlobalTypes (); /// @brief Parse a basic block (for LLVM 1.0 basic block blocks) - void ParseBasicBlock (BufPtr &Buf, BufPtr End, unsigned BlockNo); + void ParseBasicBlock (unsigned BlockNo); /// @brief parse an instruction list (for post LLVM 1.0 instruction lists /// with blocks differentiated by terminating instructions. - unsigned ParseInstructionList(BufPtr &Buf, BufPtr End); + unsigned ParseInstructionList(); /// @brief Parse an instruction. - bool ParseInstruction (BufPtr &Buf, BufPtr End, - std::vector<unsigned>& Args); + bool ParseInstruction (std::vector<unsigned>& Args); /// @brief Parse a constant pool - void ParseConstantPool (BufPtr &Buf, BufPtr End, TypeListTy& List); + void ParseConstantPool (TypeListTy& List); /// @brief Parse a constant value - void ParseConstantValue (BufPtr &Buf, BufPtr End, unsigned TypeID); + void ParseConstantValue (unsigned TypeID); /// @brief Parse a block of types. - void ParseTypeConstants (BufPtr &Buf, BufPtr End, TypeListTy &Tab, - unsigned NumEntries); + void ParseTypeConstants (TypeListTy &Tab, unsigned NumEntries); /// @brief Parse a single type. - const Type *ParseTypeConstant(BufPtr &Buf, BufPtr End); + const Type *ParseTypeConstant(); /// @brief Parse a string constants block - void ParseStringConstants (BufPtr &Buf, BufPtr End, unsigned NumEntries); + void ParseStringConstants (unsigned NumEntries); /// @} /// @name Data /// @{ private: + BufPtr MemStart; ///< Start of the memory buffer + BufPtr MemEnd; ///< End of the memory buffer + BufPtr BlockStart; ///< Start of current block being parsed + BufPtr BlockEnd; ///< End of current block being parsed + BufPtr At; ///< Where we're currently parsing at + + bool reportAlignment; ///< Parser should report alignment? + bool reportBlocks; ///< Parser should report blocks? + bool reportVBR; ///< Report VBR compression events + // Information about the module, extracted from the bytecode revision number. unsigned char RevisionNum; // The rev # itself @@ -219,9 +238,25 @@ private: private: - static inline void readBlock(const unsigned char *&Buf, - const unsigned char *EndBuf, - unsigned &Type, unsigned &Size) ; + /// Is there more to parse in the current block? + inline bool moreInBlock(); + + /// Have we read past the end of the block + inline void checkPastBlockEnd(const char * block_name); + + /// Align to 32 bits + inline void align32(); + + /// Reader interface + inline unsigned read_uint(); + inline unsigned read_vbr_uint(); + inline uint64_t read_vbr_uint64(); + inline int64_t read_vbr_int64(); + inline std::string read_str(); + inline void read_data(void *Ptr, void *End); + + /// Read a block header + inline void readBlock(unsigned &Type, unsigned &Size); const Type *AbstractBytecodeParser::getType(unsigned ID); /// getGlobalTableType - This is just like getType, but when a compaction @@ -443,7 +478,8 @@ public: virtual bool handleInstruction( unsigned Opcode, const Type* iType, - std::vector<unsigned>& Operands + std::vector<unsigned>& Operands, + unsigned Length ); /// @brief Handle the end of a basic block @@ -488,6 +524,16 @@ public: /// @brief Handle the end of the global constants virtual void handleGlobalConstantsEnd(); + /// @brief Handle an alignment event + virtual void handleAlignment(unsigned numBytes); + + virtual void handleBlock( + unsigned BType, ///< The type of block + const unsigned char* StartPtr, ///< The start of the block + unsigned Size ///< The size of the block + ); + virtual void handleVBR32(unsigned Size ); + virtual void handleVBR64(unsigned Size ); /// @} }; |