aboutsummaryrefslogtreecommitdiff
path: root/lib/Bytecode
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Bytecode')
-rw-r--r--lib/Bytecode/Writer/Writer.cpp41
1 files changed, 25 insertions, 16 deletions
diff --git a/lib/Bytecode/Writer/Writer.cpp b/lib/Bytecode/Writer/Writer.cpp
index f97d7e232b..ad13eef734 100644
--- a/lib/Bytecode/Writer/Writer.cpp
+++ b/lib/Bytecode/Writer/Writer.cpp
@@ -125,25 +125,34 @@ void BytecodeWriter::outputConstants(bool isFunction) {
BytecodeBlock CPool(BytecodeFormat::ConstantPool, Out);
unsigned NumPlanes = Table.getNumPlanes();
-
- 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 reemit module constants
- ValNo += Table.getModuleLevel(pno);
- else if (pno == Type::TypeTyID) // If type plane wasn't written out above
- continue;
-
- if (pno >= Type::FirstDerivedTyID) {
- // Skip zero initializer
- if (ValNo == 0)
- ValNo = 1;
- }
- outputConstantsInPlane(Plane, ValNo); // Write out constants in the plane
+ // 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);
}
}
+
+ 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 reemit module constants
+ ValNo += Table.getModuleLevel(pno);
+
+ if (pno >= Type::FirstDerivedTyID) {
+ // Skip zero initializer
+ if (ValNo == 0)
+ ValNo = 1;
+ }
+
+ // Write out constants in the plane
+ outputConstantsInPlane(Plane, ValNo);
+ }
+ }
}
void BytecodeWriter::outputModuleInfoBlock(const Module *M) {