Changes in directory llvm/lib/Bytecode/Reader:
Reader.cpp updated: 1.254 -> 1.255 --- Log message: Implement aliases. This fixes PR1017: http://llvm.org/PR1017 and it's dependent bugs. CFE part will follow. --- Diffs of the changes: (+49 -2) Reader.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 49 insertions(+), 2 deletions(-) Index: llvm/lib/Bytecode/Reader/Reader.cpp diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.254 llvm/lib/Bytecode/Reader/Reader.cpp:1.255 --- llvm/lib/Bytecode/Reader/Reader.cpp:1.254 Tue Apr 24 12:20:52 2007 +++ llvm/lib/Bytecode/Reader/Reader.cpp Wed Apr 25 09:27:10 2007 @@ -348,7 +348,7 @@ /// with this method. The ValueTable argument must be one of ModuleValues /// or FunctionValues data members of this class. unsigned BytecodeReader::insertValue(Value *Val, unsigned type, - ValueTable &ValueTab) { + ValueTable &ValueTab) { if (ValueTab.size() <= type) ValueTab.resize(type+1); @@ -1855,7 +1855,7 @@ case 1: Func->setLinkage(Function::DLLImportLinkage); break; case 2: Func->setLinkage(Function::ExternalWeakLinkage); break; default: assert(0 && "Unsupported external linkage"); - } + } } Func->setCallingConv(CC-1); @@ -1919,6 +1919,53 @@ I->first->setSection(SectionNames[I->second-1]); } + if (At != BlockEnd) { + // Read aliases... + unsigned VarType = read_vbr_uint(); + while (VarType != Type::VoidTyID) { // List is terminated by Void + unsigned TypeSlotNo = VarType >> 2; + unsigned EncodedLinkage = VarType & 3; + unsigned AliaseeTypeSlotNo, AliaseeSlotNo; + + AliaseeTypeSlotNo = read_vbr_uint(); + AliaseeSlotNo = read_vbr_uint(); + + const Type *Ty = getType(TypeSlotNo); + if (!Ty) + error("Alias has no type! SlotNo=" + utostr(TypeSlotNo)); + + 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) + + " SlotNo=" + utostr(AliaseeSlotNo)); + if (!isa<GlobalValue>(V)) + error("Aliasee is not global value! SlotNo=" + utostr(AliaseeSlotNo)); + + GlobalValue::LinkageTypes Linkage; + switch (EncodedLinkage) { + case 0: + Linkage = GlobalValue::ExternalLinkage; + break; + case 1: + Linkage = GlobalValue::InternalLinkage; + break; + case 2: + Linkage = GlobalValue::WeakLinkage; + break; + default: + assert(0 && "Unsupported encoded alias linkage"); + } + + GlobalAlias *GA = new GlobalAlias(Ty, Linkage, "", + dyn_cast<GlobalValue>(V), TheModule); + insertValue(GA, TypeSlotNo, ModuleValues); + VarType = read_vbr_uint(); + } + } + // This is for future proofing... in the future extra fields may be added that // we don't understand, so we transparently ignore them. // _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits