[llvm-commits] CVS: llvm/lib/Bytecode/Reader/Analyzer.cpp Reader.cpp Reader.h
Anton Korobeynikov
asl at math.spbu.ru
Sat Apr 28 06:45:52 PDT 2007
Changes in directory llvm/lib/Bytecode/Reader:
Analyzer.cpp updated: 1.41 -> 1.42
Reader.cpp updated: 1.255 -> 1.256
Reader.h updated: 1.52 -> 1.53
---
Log message:
Implement review feedback. Aliasees can be either GlobalValue's or
bitcasts of them.
---
Diffs of the changes: (+61 -10)
Analyzer.cpp | 21 +++++++++++++++++++++
Reader.cpp | 41 +++++++++++++++++++++++++++++++----------
Reader.h | 9 +++++++++
3 files changed, 61 insertions(+), 10 deletions(-)
Index: llvm/lib/Bytecode/Reader/Analyzer.cpp
diff -u llvm/lib/Bytecode/Reader/Analyzer.cpp:1.41 llvm/lib/Bytecode/Reader/Analyzer.cpp:1.42
--- llvm/lib/Bytecode/Reader/Analyzer.cpp:1.41 Tue Apr 24 12:20:52 2007
+++ llvm/lib/Bytecode/Reader/Analyzer.cpp Sat Apr 28 08:44:59 2007
@@ -179,6 +179,27 @@
}
+ virtual void handleGlobalAlias(
+ const Type* ElemType,
+ GlobalValue::LinkageTypes Linkage,
+ unsigned TypeSlotNum,
+ unsigned AliaseeSlot) {
+ if (os) {
+ *os << " GA: "
+ << " Linkage=" << Linkage
+ << " Type=";
+ //WriteTypeSymbolic(*os, ElemType, M);
+ *os << " Slot=" << TypeSlotNum << " AliaseeSlot=" << AliaseeSlot
+ << "\n";
+ }
+
+ bca.numValues++;
+ if (TypeSlotNum > bca.maxValueSlot)
+ bca.maxValueSlot = TypeSlotNum;
+ if (AliaseeSlot > bca.maxValueSlot)
+ bca.maxValueSlot = AliaseeSlot;
+ }
+
virtual void handleTypeList(unsigned numEntries) {
bca.maxTypeSlot = numEntries - 1;
}
Index: llvm/lib/Bytecode/Reader/Reader.cpp
diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.255 llvm/lib/Bytecode/Reader/Reader.cpp:1.256
--- llvm/lib/Bytecode/Reader/Reader.cpp:1.255 Wed Apr 25 09:27:10 2007
+++ llvm/lib/Bytecode/Reader/Reader.cpp Sat Apr 28 08:44:59 2007
@@ -1923,12 +1923,10 @@
// Read aliases...
unsigned VarType = read_vbr_uint();
while (VarType != Type::VoidTyID) { // List is terminated by Void
- unsigned TypeSlotNo = VarType >> 2;
+ unsigned TypeSlotNo = VarType >> 3;
unsigned EncodedLinkage = VarType & 3;
- unsigned AliaseeTypeSlotNo, AliaseeSlotNo;
-
- AliaseeTypeSlotNo = read_vbr_uint();
- AliaseeSlotNo = read_vbr_uint();
+ bool isConstantAliasee = (VarType >> 2) & 1;
+ unsigned AliaseeSlotNo = read_vbr_uint();
const Type *Ty = getType(TypeSlotNo);
if (!Ty)
@@ -1937,11 +1935,11 @@
if (!isa<PointerType>(Ty))
error("Alias not a pointer type! Ty= " + Ty->getDescription());
- Value* V = getValue(AliaseeTypeSlotNo, AliaseeSlotNo, false);
- if (!V)
- error("Invalid aliasee! TypeSlotNo=" + utostr(AliaseeTypeSlotNo) +
+ Value* V = getValue(TypeSlotNo, AliaseeSlotNo, false);
+ if (!V && !isConstantAliasee)
+ error("Invalid aliasee! TypeSlotNo=" + utostr(TypeSlotNo) +
" SlotNo=" + utostr(AliaseeSlotNo));
- if (!isa<GlobalValue>(V))
+ if (!isConstantAliasee && !isa<GlobalValue>(V))
error("Aliasee is not global value! SlotNo=" + utostr(AliaseeSlotNo));
GlobalValue::LinkageTypes Linkage;
@@ -1960,8 +1958,14 @@
}
GlobalAlias *GA = new GlobalAlias(Ty, Linkage, "",
- dyn_cast<GlobalValue>(V), TheModule);
+ dyn_cast_or_null<Constant>(V),
+ TheModule);
insertValue(GA, TypeSlotNo, ModuleValues);
+ if (!V && isConstantAliasee)
+ Aliasees.push_back(std::make_pair(GA, AliaseeSlotNo));
+
+ if (Handler) Handler->handleGlobalAlias(Ty, Linkage,
+ TypeSlotNo, AliaseeSlotNo);
VarType = read_vbr_uint();
}
}
@@ -2068,6 +2072,23 @@
error("Cannot find initializer value.");
}
+ // And aliasees
+ while (!Aliasees.empty()) {
+ GlobalAlias *GA = Aliasees.back().first;
+ unsigned Slot = Aliasees.back().second;
+ Aliasees.pop_back();
+
+ // Look up the aliasee value...
+ const llvm::PointerType* GAType = GA->getType();
+ unsigned TypeSlot = getTypeSlot(GAType);
+ if (Constant *CV = getConstantValue(TypeSlot, Slot)) {
+ if (GA->getAliasee())
+ error("Aliasee was *already* set?!");
+ GA->setAliasee(CV);
+ } else
+ error("Cannot find aliasee value.");
+ }
+
if (!ConstantFwdRefs.empty())
error("Use of undefined constants in a module");
Index: llvm/lib/Bytecode/Reader/Reader.h
diff -u llvm/lib/Bytecode/Reader/Reader.h:1.52 llvm/lib/Bytecode/Reader/Reader.h:1.53
--- llvm/lib/Bytecode/Reader/Reader.h:1.52 Mon Apr 9 01:14:31 2007
+++ llvm/lib/Bytecode/Reader/Reader.h Sat Apr 28 08:44:59 2007
@@ -129,6 +129,9 @@
/// them.
typedef std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInitsList;
+ /// @brief A list of global aliases and the slot number for constant aliasees
+ typedef std::vector<std::pair<GlobalAlias*, unsigned> > AliaseeList;
+
/// This type maps a typeslot/valueslot pair to the corresponding Value*.
/// It is used for dealing with forward references as values are read in.
/// @brief A map for dealing with forward references of values.
@@ -338,6 +341,12 @@
/// of what we must do.
GlobalInitsList GlobalInits;
+ /// Constant values are read in after global aliases. Because of this, we must
+ /// defer setting the constant aliasees until after module level constants
+ /// have been read. In the mean time, this list keeps track of what we must
+ /// do.
+ AliaseeList Aliasees;
+
// For lazy reading-in of functions, we need to save away several pieces of
// information about each function: its begin and end pointer in the buffer
// and its FunctionSlot.
More information about the llvm-commits
mailing list