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. _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits