diff options
Diffstat (limited to 'lib/Bytecode/Reader')
-rw-r--r-- | lib/Bytecode/Reader/Analyzer.cpp | 43 | ||||
-rw-r--r-- | lib/Bytecode/Reader/Reader.cpp | 20 | ||||
-rw-r--r-- | lib/Bytecode/Reader/Reader.h | 8 |
3 files changed, 38 insertions, 33 deletions
diff --git a/lib/Bytecode/Reader/Analyzer.cpp b/lib/Bytecode/Reader/Analyzer.cpp index 64907a8e80..71cb4b2579 100644 --- a/lib/Bytecode/Reader/Analyzer.cpp +++ b/lib/Bytecode/Reader/Analyzer.cpp @@ -270,19 +270,15 @@ public: *os << " } END BLOCK: CompactionTable\n"; } - virtual void handleSymbolTableBegin(Function* CF, SymbolTable* ST) { + virtual void handleTypeSymbolTableBegin(TypeSymbolTable* ST) { bca.numSymTab++; if (os) - *os << " BLOCK: SymbolTable {\n"; + *os << " BLOCK: TypeSymbolTable {\n"; } - - virtual void handleSymbolTablePlane(unsigned Ty, unsigned NumEntries, - const Type* Typ) { - if (os) { - *os << " Plane: Ty=" << Ty << " Size=" << NumEntries << " Type: "; - WriteTypeSymbolic(*os,Typ,M); - *os << "\n"; - } + virtual void handleValueSymbolTableBegin(Function* CF, ValueSymbolTable* ST) { + bca.numSymTab++; + if (os) + *os << " BLOCK: ValueSymbolTable {\n"; } virtual void handleSymbolTableType(unsigned i, unsigned TypSlot, @@ -292,18 +288,23 @@ public: << " Name: " << name << "\n"; } - virtual void handleSymbolTableValue(unsigned i, unsigned ValSlot, - const std::string& name ) { + virtual void handleSymbolTableValue(unsigned TySlot, unsigned ValSlot, + const std::string& name) { if (os) - *os << " Value " << i << " Slot=" << ValSlot + *os << " Value " << TySlot << " Slot=" << ValSlot << " Name: " << name << "\n"; if (ValSlot > bca.maxValueSlot) bca.maxValueSlot = ValSlot; } - virtual void handleSymbolTableEnd() { + virtual void handleValueSymbolTableEnd() { if (os) - *os << " } END BLOCK: SymbolTable\n"; + *os << " } END BLOCK: ValueSymbolTable\n"; + } + + virtual void handleTypeSymbolTableEnd() { + if (os) + *os << " } END BLOCK: TypeSymbolTable\n"; } virtual void handleFunctionBegin(Function* Func, unsigned Size) { @@ -358,15 +359,15 @@ public: } virtual bool handleInstruction( unsigned Opcode, const Type* iType, - std::vector<unsigned>& Operands, unsigned Size){ + std::vector<unsigned>& Operands, + Instruction *Inst, + unsigned Size){ if (os) { *os << " INST: OpCode=" - << Instruction::getOpcodeName(Opcode) << " Type=\""; - WriteTypeSymbolic(*os,iType,M); - *os << "\""; + << Instruction::getOpcodeName(Opcode); for ( unsigned i = 0; i < Operands.size(); ++i ) - *os << " Op(" << i << ")=Slot(" << Operands[i] << ")"; - *os << "\n"; + *os << " Op(" << Operands[i] << ")"; + *os << *Inst; } bca.numInstructions++; diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp index e2505cc81e..ff6d8f04ca 100644 --- a/lib/Bytecode/Reader/Reader.cpp +++ b/lib/Bytecode/Reader/Reader.cpp @@ -23,7 +23,6 @@ #include "llvm/Constants.h" #include "llvm/InlineAsm.h" #include "llvm/Instructions.h" -#include "llvm/SymbolTable.h" #include "llvm/TypeSymbolTable.h" #include "llvm/Bytecode/Format.h" #include "llvm/Config/alloca.h" @@ -55,6 +54,7 @@ namespace { inline void BytecodeReader::error(const std::string& err) { ErrorMsg = err + " (Vers=" + itostr(RevisionNum) + ", Pos=" + itostr(At-MemStart) + ")"; + if (Handler) Handler->handleError(ErrorMsg); longjmp(context,1); } @@ -443,10 +443,6 @@ void BytecodeReader::ParseInstruction(std::vector<unsigned> &Oprnds, // of opcodes. Instruction* Result = 0; - // We have enough info to inform the handler now. - if (Handler) - Handler->handleInstruction(Opcode, InstTy, Oprnds, At-SaveAt); - // First, handle the easy binary operators case if (Opcode >= Instruction::BinaryOpsBegin && Opcode < Instruction::BinaryOpsEnd && Oprnds.size() == 2) { @@ -861,6 +857,10 @@ void BytecodeReader::ParseInstruction(std::vector<unsigned> &Oprnds, else TypeSlot = getTypeSlot(Result->getType()); + // We have enough info to inform the handler now. + if (Handler) + Handler->handleInstruction(Opcode, InstTy, Oprnds, Result, At-SaveAt); + insertValue(Result, TypeSlot, FunctionValues); } @@ -936,9 +936,9 @@ void BytecodeReader::ParseTypeSymbolTable(TypeSymbolTable *TST) { /// CurrentFunction's symbol table. For Module level symbol tables, the /// CurrentFunction argument must be zero. void BytecodeReader::ParseValueSymbolTable(Function *CurrentFunction, - SymbolTable *ST) { + ValueSymbolTable *VST) { - if (Handler) Handler->handleSymbolTableBegin(CurrentFunction,ST); + if (Handler) Handler->handleValueSymbolTableBegin(CurrentFunction,VST); // Allow efficient basic block lookup by number. std::vector<BasicBlock*> BBMap; @@ -963,13 +963,15 @@ void BytecodeReader::ParseValueSymbolTable(Function *CurrentFunction, } else { V = getValue(Typ, slot, false); // Find mapping... } + if (Handler) Handler->handleSymbolTableValue(Typ, slot, Name); if (V == 0) - error("Failed value look-up for name '" + Name + "'"); + error("Failed value look-up for name '" + Name + "', type #" + + utostr(Typ) + " slot #" + utostr(slot)); V->setName(Name); } } checkPastBlockEnd("Symbol Table"); - if (Handler) Handler->handleSymbolTableEnd(); + if (Handler) Handler->handleValueSymbolTableEnd(); } // Parse a single type. The typeid is read in first. If its a primitive type diff --git a/lib/Bytecode/Reader/Reader.h b/lib/Bytecode/Reader/Reader.h index 92c8fa0225..b881f9d0a5 100644 --- a/lib/Bytecode/Reader/Reader.h +++ b/lib/Bytecode/Reader/Reader.h @@ -28,8 +28,10 @@ namespace llvm { -class BytecodeHandler; ///< Forward declare the handler interface -class TypeSymbolTable; ///< Forward declare +// Forward declarations +class BytecodeHandler; +class TypeSymbolTable; +class ValueSymbolTable; /// This class defines the interface for parsing a buffer of bytecode. The /// parser itself takes no action except to call the various functions of @@ -204,7 +206,7 @@ protected: void ParseTypeSymbolTable(TypeSymbolTable *ST); /// @brief Parse a value symbol table - void ParseValueSymbolTable(Function* Func, SymbolTable *ST); + void ParseValueSymbolTable(Function* Func, ValueSymbolTable *ST); /// @brief Parse functions lazily. void ParseFunctionLazily(); |