[llvm-commits] CVS: llvm/lib/Bytecode/Reader/Reader.cpp
Anton Korobeynikov
asl at math.spbu.ru
Wed Apr 25 07:28:12 PDT 2007
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.
//
More information about the llvm-commits
mailing list