[llvm-commits] CVS: llvm/lib/Bytecode/Writer/Writer.cpp
LLVM
llvm at cs.uiuc.edu
Sun Jul 4 06:47:01 PDT 2004
Changes in directory llvm/lib/Bytecode/Writer:
Writer.cpp updated: 1.67 -> 1.68
---
Log message:
Implement new output functions for types and compacted type planes. Also
remove use of Type::TypeTyID and Type::TypeTy since Type no longer inherits
Value.
---
Diffs of the changes: (+68 -51)
Index: llvm/lib/Bytecode/Writer/Writer.cpp
diff -u llvm/lib/Bytecode/Writer/Writer.cpp:1.67 llvm/lib/Bytecode/Writer/Writer.cpp:1.68
--- llvm/lib/Bytecode/Writer/Writer.cpp:1.67 Fri Jun 25 15:52:10 2004
+++ llvm/lib/Bytecode/Writer/Writer.cpp Sun Jul 4 06:45:47 2004
@@ -61,17 +61,10 @@
output_vbr(Version, Out);
align32(Out);
+ // The Global type plane comes first
{
- BytecodeBlock CPool(BytecodeFormat::GlobalTypePlane, Out);
-
- // Write the type plane for types first because earlier planes (e.g. for a
- // primitive type like float) may have constants constructed using types
- // coming later (e.g., via getelementptr from a pointer type). The type
- // plane is needed before types can be fwd or bkwd referenced.
- const std::vector<const Value*> &Plane = Table.getPlane(Type::TypeTyID);
- assert(!Plane.empty() && "No types at all?");
- unsigned ValNo = Type::FirstDerivedTyID; // Start at the derived types...
- outputConstantsInPlane(Plane, ValNo); // Write out the types
+ BytecodeBlock CPool(BytecodeFormat::GlobalTypePlane, Out );
+ outputTypes(Type::FirstDerivedTyID);
}
// The ModuleInfoBlock follows directly after the type information
@@ -88,6 +81,25 @@
outputSymbolTable(M->getSymbolTable());
}
+void BytecodeWriter::outputTypes(unsigned TypeNum)
+{
+ // Write the type plane for types first because earlier planes (e.g. for a
+ // primitive type like float) may have constants constructed using types
+ // coming later (e.g., via getelementptr from a pointer type). The type
+ // plane is needed before types can be fwd or bkwd referenced.
+ const std::vector<const Type*>& Types = Table.getTypes();
+ assert(!Types.empty() && "No types at all?");
+ assert(TypeNum <= Types.size() && "Invalid TypeNo index");
+
+ unsigned NumEntries = Types.size() - TypeNum;
+
+ // Output type header: [num entries]
+ output_vbr(NumEntries, Out);
+
+ for (unsigned i = TypeNum; i < TypeNum+NumEntries; ++i)
+ outputType(Types[i]);
+}
+
// Helper function for outputConstants().
// Writes out all the constants in the plane Plane starting at entry StartNo.
//
@@ -104,8 +116,7 @@
/*empty*/;
unsigned NC = ValNo; // Number of constants
- for (; NC < Plane.size() &&
- (isa<Constant>(Plane[NC]) || isa<Type>(Plane[NC])); NC++)
+ for (; NC < Plane.size() && (isa<Constant>(Plane[NC])); NC++)
/*empty*/;
NC -= ValNo; // Convert from index into count
if (NC == 0) return; // Skip empty type planes...
@@ -122,24 +133,16 @@
assert (Slot != -1 && "Type in constant pool but not in function!!");
output_vbr((unsigned)Slot, Out);
- //cerr << "Emitting " << NC << " constants of type '"
- // << Plane.front()->getType()->getName() << "' = Slot #" << Slot << "\n";
-
for (unsigned i = ValNo; i < ValNo+NC; ++i) {
const Value *V = Plane[i];
if (const Constant *CPV = dyn_cast<Constant>(V)) {
- //cerr << "Serializing value: <" << V->getType() << ">: " << V << ":"
- // << Out.size() << "\n";
outputConstant(CPV);
- } else {
- outputType(cast<Type>(V));
}
}
}
static inline bool hasNullValue(unsigned TyID) {
- return TyID != Type::LabelTyID && TyID != Type::TypeTyID &&
- TyID != Type::VoidTyID;
+ return TyID != Type::LabelTyID && TyID != Type::VoidTyID;
}
void BytecodeWriter::outputConstants(bool isFunction) {
@@ -149,36 +152,31 @@
unsigned NumPlanes = Table.getNumPlanes();
// Output the type plane before any constants!
- if (isFunction && NumPlanes > Type::TypeTyID) {
- const std::vector<const Value*> &Plane = Table.getPlane(Type::TypeTyID);
- if (!Plane.empty()) { // Skip empty type planes...
- unsigned ValNo = Table.getModuleLevel(Type::TypeTyID);
- outputConstantsInPlane(Plane, ValNo);
- }
+ if (isFunction) {
+ outputTypes( Table.getModuleTypeLevel() );
}
// Output module-level string constants before any other constants.x
if (!isFunction)
outputConstantStrings();
- for (unsigned pno = 0; pno != NumPlanes; pno++)
- if (pno != Type::TypeTyID) { // Type plane handled above.
- const std::vector<const Value*> &Plane = Table.getPlane(pno);
- if (!Plane.empty()) { // Skip empty type planes...
- unsigned ValNo = 0;
- if (isFunction) // Don't re-emit module constants
- ValNo += Table.getModuleLevel(pno);
-
- if (hasNullValue(pno)) {
- // Skip zero initializer
- if (ValNo == 0)
- ValNo = 1;
- }
-
- // Write out constants in the plane
- outputConstantsInPlane(Plane, ValNo);
+ for (unsigned pno = 0; pno != NumPlanes; pno++) {
+ const std::vector<const Value*> &Plane = Table.getPlane(pno);
+ if (!Plane.empty()) { // Skip empty type planes...
+ unsigned ValNo = 0;
+ if (isFunction) // Don't re-emit module constants
+ ValNo += Table.getModuleLevel(pno);
+
+ if (hasNullValue(pno)) {
+ // Skip zero initializer
+ if (ValNo == 0)
+ ValNo = 1;
}
+
+ // Write out constants in the plane
+ outputConstantsInPlane(Plane, ValNo);
}
+ }
}
static unsigned getEncodedLinkage(const GlobalValue *GV) {
@@ -269,7 +267,7 @@
assert(StartNo < Plane.size() && End <= Plane.size());
// Do not emit the null initializer!
- if (PlaneNo != Type::TypeTyID) ++StartNo;
+ ++StartNo;
// Figure out which encoding to use. By far the most common case we have is
// to emit 0-2 entries in a compaction table plane.
@@ -290,18 +288,38 @@
output_vbr(Table.getGlobalSlot(Plane[i]), Out);
}
+void BytecodeWriter::outputCompactionTypes(unsigned StartNo) {
+ // Get the compaction type table from the slot calculator
+ const std::vector<const Type*> &CTypes = Table.getCompactionTypes();
+
+ // The compaction types may have been uncompactified back to the
+ // global types. If so, we just write an empty table
+ if (CTypes.size() == 0 ) {
+ output_vbr(0U, Out);
+ return;
+ }
+
+ assert(CTypes.size() >= StartNo && "Invalid compaction types start index");
+
+ // Determine how many types to write
+ unsigned NumTypes = CTypes.size() - StartNo;
+
+ // Output the number of types.
+ output_vbr(NumTypes, Out);
+
+ for (unsigned i = StartNo; i < StartNo+NumTypes; ++i)
+ output_vbr(Table.getGlobalSlot(CTypes[i]), Out);
+}
+
void BytecodeWriter::outputCompactionTable() {
BytecodeBlock CTB(BytecodeFormat::CompactionTable, Out, true/*ElideIfEmpty*/);
const std::vector<std::vector<const Value*> > &CT =Table.getCompactionTable();
// First thing is first, emit the type compaction table if there is one.
- if (CT.size() > Type::TypeTyID)
- outputCompactionTablePlane(Type::TypeTyID, CT[Type::TypeTyID],
- Type::FirstDerivedTyID);
+ outputCompactionTypes(Type::FirstDerivedTyID);
for (unsigned i = 0, e = CT.size(); i != e; ++i)
- if (i != Type::TypeTyID)
- outputCompactionTablePlane(i, CT[i], 0);
+ outputCompactionTablePlane(i, CT[i], 0);
}
void BytecodeWriter::outputSymbolTable(const SymbolTable &MST) {
@@ -312,9 +330,8 @@
BytecodeBlock SymTabBlock(BytecodeFormat::SymbolTable, Out,
true/* ElideIfEmpty*/);
- //Symtab block header: [num entries][type id number]
+ //Symtab block header for types: [num entries]
output_vbr(MST.num_types(), Out);
- output_vbr((unsigned)Table.getSlot(Type::TypeTy), Out);
for (SymbolTable::type_const_iterator TI = MST.type_begin(),
TE = MST.type_end(); TI != TE; ++TI ) {
//Symtab entry:[def slot #][name]
More information about the llvm-commits
mailing list