[llvm-commits] CVS: llvm/lib/Bytecode/Reader/Analyzer.cpp Reader.cpp Reader.h

Reid Spencer reid at x10sys.com
Fri Jan 5 23:25:21 PST 2007



Changes in directory llvm/lib/Bytecode/Reader:

Analyzer.cpp updated: 1.26 -> 1.27
Reader.cpp updated: 1.215 -> 1.216
Reader.h updated: 1.40 -> 1.41
---
Log message:

For PR411: http://llvm.org/PR411 :
Take an incremental step towards type plane elimination. This change 
separates types from values in the symbol tables by finally making use
of the TypeSymbolTable class. This yields more natural interfaces for
dealing with types and unclutters the SymbolTable class.


---
Diffs of the changes:  (+43 -22)

 Analyzer.cpp |   10 +++++++---
 Reader.cpp   |   47 ++++++++++++++++++++++++++++++-----------------
 Reader.h     |    8 ++++++--
 3 files changed, 43 insertions(+), 22 deletions(-)


Index: llvm/lib/Bytecode/Reader/Analyzer.cpp
diff -u llvm/lib/Bytecode/Reader/Analyzer.cpp:1.26 llvm/lib/Bytecode/Reader/Analyzer.cpp:1.27
--- llvm/lib/Bytecode/Reader/Analyzer.cpp:1.26	Fri Dec 15 15:46:37 2006
+++ llvm/lib/Bytecode/Reader/Analyzer.cpp	Sat Jan  6 01:24:43 2007
@@ -96,11 +96,12 @@
     bca.BlockSizes[BytecodeFormat::ModuleBlockID] = theSize;
     bca.BlockSizes[BytecodeFormat::FunctionBlockID] = 0;
     bca.BlockSizes[BytecodeFormat::ConstantPoolBlockID] = 0;
-    bca.BlockSizes[BytecodeFormat::SymbolTableBlockID] = 0;
+    bca.BlockSizes[BytecodeFormat::ValueSymbolTableBlockID] = 0;
     bca.BlockSizes[BytecodeFormat::ModuleGlobalInfoBlockID] = 0;
     bca.BlockSizes[BytecodeFormat::GlobalTypePlaneBlockID] = 0;
     bca.BlockSizes[BytecodeFormat::InstructionListBlockID] = 0;
     bca.BlockSizes[BytecodeFormat::CompactionTableBlockID] = 0;
+    bca.BlockSizes[BytecodeFormat::TypeSymbolTableBlockID] = 0;
   }
 
   virtual void handleFinish() {
@@ -636,8 +637,11 @@
   print(Out, "Compaction Table Bytes",
         double(bca.BlockSizes[BytecodeFormat::CompactionTableBlockID]),
         double(bca.byteSize));
-  print(Out, "Symbol Table Bytes",
-        double(bca.BlockSizes[BytecodeFormat::SymbolTableBlockID]),
+  print(Out, "Value Symbol Table Bytes",
+        double(bca.BlockSizes[BytecodeFormat::ValueSymbolTableBlockID]),
+        double(bca.byteSize));
+  print(Out, "Type Symbol Table Bytes",
+        double(bca.BlockSizes[BytecodeFormat::TypeSymbolTableBlockID]),
         double(bca.byteSize));
   print(Out, "Alignment Bytes",
         double(bca.numAlignment), double(bca.byteSize));


Index: llvm/lib/Bytecode/Reader/Reader.cpp
diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.215 llvm/lib/Bytecode/Reader/Reader.cpp:1.216
--- llvm/lib/Bytecode/Reader/Reader.cpp:1.215	Sat Dec 30 23:44:24 2006
+++ llvm/lib/Bytecode/Reader/Reader.cpp	Sat Jan  6 01:24:43 2007
@@ -24,6 +24,7 @@
 #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"
 #include "llvm/Support/GetElementPtrTypeIterator.h"
@@ -1023,13 +1024,27 @@
   return BlockNo;
 }
 
-/// Parse a symbol table. This works for both module level and function
+/// Parse a type symbol table.
+void BytecodeReader::ParseTypeSymbolTable(TypeSymbolTable *TST) {
+  // Type Symtab block header: [num entries]
+  unsigned NumEntries = read_vbr_uint();
+  for (unsigned i = 0; i < NumEntries; ++i) {
+    // Symtab entry: [type slot #][name]
+    unsigned slot = read_vbr_uint();
+    std::string Name = read_str();
+    const Type* T = getType(slot);
+    TST->insert(Name, T);
+  }
+}
+
+/// Parse a value symbol table. This works for both module level and function
 /// level symbol tables.  For function level symbol tables, the CurrentFunction
 /// parameter must be non-zero and the ST parameter must correspond to
 /// CurrentFunction's symbol table. For Module level symbol tables, the
 /// CurrentFunction argument must be zero.
-void BytecodeReader::ParseSymbolTable(Function *CurrentFunction,
-                                      SymbolTable *ST) {
+void BytecodeReader::ParseValueSymbolTable(Function *CurrentFunction,
+                                           SymbolTable *ST) {
+                                      
   if (Handler) Handler->handleSymbolTableBegin(CurrentFunction,ST);
 
   // Allow efficient basic block lookup by number.
@@ -1039,16 +1054,6 @@
            E = CurrentFunction->end(); I != E; ++I)
       BBMap.push_back(I);
 
-  // Symtab block header: [num entries]
-  unsigned NumEntries = read_vbr_uint();
-  for (unsigned i = 0; i < NumEntries; ++i) {
-    // Symtab entry: [def slot #][name]
-    unsigned slot = read_vbr_uint();
-    std::string Name = read_str();
-    const Type* T = getType(slot);
-    ST->insert(Name, T);
-  }
-
   while (moreInBlock()) {
     // Symtab block header: [num entries][type id number]
     unsigned NumEntries = read_vbr_uint();
@@ -1683,8 +1688,12 @@
       break;
     }
 
-    case BytecodeFormat::SymbolTableBlockID:
-      ParseSymbolTable(F, &F->getSymbolTable());
+    case BytecodeFormat::ValueSymbolTableBlockID:
+      ParseValueSymbolTable(F, &F->getValueSymbolTable());
+      break;
+
+    case BytecodeFormat::TypeSymbolTableBlockID:
+      error("Functions don't have type symbol tables");
       break;
 
     default:
@@ -2084,8 +2093,12 @@
       ParseFunctionLazily();
       break;
 
-    case BytecodeFormat::SymbolTableBlockID:
-      ParseSymbolTable(0, &TheModule->getSymbolTable());
+    case BytecodeFormat::ValueSymbolTableBlockID:
+      ParseValueSymbolTable(0, &TheModule->getValueSymbolTable());
+      break;
+
+    case BytecodeFormat::TypeSymbolTableBlockID:
+      ParseTypeSymbolTable(&TheModule->getTypeSymbolTable());
       break;
 
     default:


Index: llvm/lib/Bytecode/Reader/Reader.h
diff -u llvm/lib/Bytecode/Reader/Reader.h:1.40 llvm/lib/Bytecode/Reader/Reader.h:1.41
--- llvm/lib/Bytecode/Reader/Reader.h:1.40	Sat Dec  2 23:47:10 2006
+++ llvm/lib/Bytecode/Reader/Reader.h	Sat Jan  6 01:24:43 2007
@@ -29,6 +29,7 @@
 namespace llvm {
 
 class BytecodeHandler; ///< Forward declare the handler interface
+class TypeSymbolTable; ///< Forward declare
 
 /// This class defines the interface for parsing a buffer of bytecode. The
 /// parser itself takes no action except to call the various functions of
@@ -199,8 +200,11 @@
   /// @brief Parse the ModuleGlobalInfo block
   void ParseModuleGlobalInfo();
 
-  /// @brief Parse a symbol table
-  void ParseSymbolTable( Function* Func, SymbolTable *ST);
+  /// @brief Parse a value symbol table
+  void ParseTypeSymbolTable(TypeSymbolTable *ST);
+
+  /// @brief Parse a value symbol table
+  void ParseValueSymbolTable(Function* Func, SymbolTable *ST);
 
   /// @brief Parse functions lazily.
   void ParseFunctionLazily();






More information about the llvm-commits mailing list