[llvm-commits] [vector_llvm] CVS: llvm/lib/Bytecode/Reader/Reader.cpp ReaderWrappers.cpp
Robert Bocchino
bocchino at cs.uiuc.edu
Wed Nov 16 10:32:22 PST 2005
Changes in directory llvm/lib/Bytecode/Reader:
Reader.cpp updated: 1.167.2.1 -> 1.167.2.2
ReaderWrappers.cpp updated: 1.51 -> 1.51.2.1
---
Log message:
Merged mainline into Vector LLVM branch
---
Diffs of the changes: (+93 -38)
Reader.cpp | 125 ++++++++++++++++++++++++++++++++++++++---------------
ReaderWrappers.cpp | 6 +-
2 files changed, 93 insertions(+), 38 deletions(-)
Index: llvm/lib/Bytecode/Reader/Reader.cpp
diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.167.2.1 llvm/lib/Bytecode/Reader/Reader.cpp:1.167.2.2
--- llvm/lib/Bytecode/Reader/Reader.cpp:1.167.2.1 Tue Oct 18 14:21:57 2005
+++ llvm/lib/Bytecode/Reader/Reader.cpp Wed Nov 16 12:32:10 2005
@@ -680,7 +680,8 @@
break;
case 42: { //VANext_old
const Type* ArgTy = getValue(iType, Oprnds[0])->getType();
- Function* NF = TheModule->getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, 0);
+ Function* NF = TheModule->getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy,
+ (Type *)0);
//b = vanext a, t ->
//foo = alloca 1 of t
@@ -700,7 +701,8 @@
}
case 43: { //VAArg_old
const Type* ArgTy = getValue(iType, Oprnds[0])->getType();
- Function* NF = TheModule->getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy, 0);
+ Function* NF = TheModule->getOrInsertFunction("llvm.va_copy", ArgTy, ArgTy,
+ (Type *)0);
//b = vaarg a, t ->
//foo = alloca 1 of t
@@ -915,27 +917,33 @@
if (CallingConv) cast<InvokeInst>(Result)->setCallingConv(CallingConv);
break;
}
- case Instruction::Malloc:
- if (Oprnds.size() > 2)
+ case Instruction::Malloc: {
+ unsigned Align = 0;
+ if (Oprnds.size() == 2)
+ Align = (1 << Oprnds[1]) >> 1;
+ else if (Oprnds.size() > 2)
error("Invalid malloc instruction!");
if (!isa<PointerType>(InstTy))
error("Invalid malloc instruction!");
Result = new MallocInst(cast<PointerType>(InstTy)->getElementType(),
- Oprnds.size() ? getValue(Type::UIntTyID,
- Oprnds[0]) : 0);
+ getValue(Type::UIntTyID, Oprnds[0]), Align);
break;
+ }
- case Instruction::Alloca:
- if (Oprnds.size() > 2)
+ case Instruction::Alloca: {
+ unsigned Align = 0;
+ if (Oprnds.size() == 2)
+ Align = (1 << Oprnds[1]) >> 1;
+ else if (Oprnds.size() > 2)
error("Invalid alloca instruction!");
if (!isa<PointerType>(InstTy))
error("Invalid alloca instruction!");
Result = new AllocaInst(cast<PointerType>(InstTy)->getElementType(),
- Oprnds.size() ? getValue(Type::UIntTyID,
- Oprnds[0]) :0);
+ getValue(Type::UIntTyID, Oprnds[0]), Align);
break;
+ }
case Instruction::Free:
if (!isa<PointerType>(InstTy))
error("Invalid free instruction!");
@@ -1985,6 +1993,10 @@
if (Handler) Handler->handleModuleGlobalsBegin();
+ // SectionID - If a global has an explicit section specified, this map
+ // remembers the ID until we can translate it into a string.
+ std::map<GlobalValue*, unsigned> SectionID;
+
// Read global variables...
unsigned VarType = read_vbr_uint();
while (VarType != Type::VoidTyID) { // List is terminated by Void
@@ -1995,9 +2007,24 @@
error("Invalid type (type type) for global var!");
unsigned LinkageID = (VarType >> 2) & 7;
bool isConstant = VarType & 1;
- bool hasInitializer = VarType & 2;
- GlobalValue::LinkageTypes Linkage;
+ bool hasInitializer = (VarType & 2) != 0;
+ unsigned Alignment = 0;
+ unsigned GlobalSectionID = 0;
+
+ // An extension word is present when linkage = 3 (internal) and hasinit = 0.
+ if (LinkageID == 3 && !hasInitializer) {
+ unsigned ExtWord = read_vbr_uint();
+ // The extension word has this format: bit 0 = has initializer, bit 1-3 =
+ // linkage, bit 4-8 = alignment (log2), bits 10+ = future use.
+ hasInitializer = ExtWord & 1;
+ LinkageID = (ExtWord >> 1) & 7;
+ Alignment = (1 << ((ExtWord >> 4) & 31)) >> 1;
+
+ if (ExtWord & (1 << 9)) // Has a section ID.
+ GlobalSectionID = read_vbr_uint();
+ }
+ GlobalValue::LinkageTypes Linkage;
switch (LinkageID) {
case 0: Linkage = GlobalValue::ExternalLinkage; break;
case 1: Linkage = GlobalValue::WeakLinkage; break;
@@ -2011,21 +2038,23 @@
}
const Type *Ty = getType(SlotNo);
- if (!Ty) {
+ if (!Ty)
error("Global has no type! SlotNo=" + utostr(SlotNo));
- }
- if (!isa<PointerType>(Ty)) {
+ if (!isa<PointerType>(Ty))
error("Global not a pointer type! Ty= " + Ty->getDescription());
- }
const Type *ElTy = cast<PointerType>(Ty)->getElementType();
// Create the global variable...
GlobalVariable *GV = new GlobalVariable(ElTy, isConstant, Linkage,
0, "", TheModule);
+ GV->setAlignment(Alignment);
insertValue(GV, SlotNo, ModuleValues);
+ if (GlobalSectionID != 0)
+ SectionID[GV] = GlobalSectionID;
+
unsigned initSlot = 0;
if (hasInitializer) {
initSlot = read_vbr_uint();
@@ -2047,8 +2076,8 @@
FnSignature = (FnSignature << 5) + 1;
// List is terminated by VoidTy.
- while ((FnSignature >> 5) != Type::VoidTyID) {
- const Type *Ty = getType(FnSignature >> 5);
+ while (((FnSignature & (~0U >> 1)) >> 5) != Type::VoidTyID) {
+ const Type *Ty = getType((FnSignature & (~0U >> 1)) >> 5);
if (!isa<PointerType>(Ty) ||
!isa<FunctionType>(cast<PointerType>(Ty)->getElementType())) {
error("Function not a pointer to function type! Ty = " +
@@ -2059,11 +2088,10 @@
const FunctionType* FTy =
cast<FunctionType>(cast<PointerType>(Ty)->getElementType());
-
// Insert the place holder.
- Function* Func = new Function(FTy, GlobalValue::ExternalLinkage,
+ Function *Func = new Function(FTy, GlobalValue::ExternalLinkage,
"", TheModule);
- insertValue(Func, FnSignature >> 5, ModuleValues);
+ insertValue(Func, (FnSignature & (~0U >> 1)) >> 5, ModuleValues);
// Flags are not used yet.
unsigned Flags = FnSignature & 31;
@@ -2074,13 +2102,20 @@
if ((Flags & (1 << 4)) == 0)
FunctionSignatureList.push_back(Func);
- // Look at the low bits. If there is a calling conv here, apply it,
- // read it as a vbr.
- Flags &= 15;
- if (Flags)
- Func->setCallingConv(Flags-1);
- else
- Func->setCallingConv(read_vbr_uint());
+ // Get the calling convention from the low bits.
+ unsigned CC = Flags & 15;
+ unsigned Alignment = 0;
+ if (FnSignature & (1 << 31)) { // Has extension word?
+ unsigned ExtWord = read_vbr_uint();
+ Alignment = (1 << (ExtWord & 31)) >> 1;
+ CC |= ((ExtWord >> 5) & 15) << 4;
+
+ if (ExtWord & (1 << 10)) // Has a section ID.
+ SectionID[Func] = read_vbr_uint();
+ }
+
+ Func->setCallingConv(CC-1);
+ Func->setAlignment(Alignment);
if (Handler) Handler->handleFunctionDeclaration(Func);
@@ -2094,12 +2129,19 @@
// remove elements efficiently from the back of the vector.
std::reverse(FunctionSignatureList.begin(), FunctionSignatureList.end());
- // If this bytecode format has dependent library information in it ..
- if (!hasNoDependentLibraries) {
- // Read in the number of dependent library items that follow
+ /// SectionNames - This contains the list of section names encoded in the
+ /// moduleinfoblock. Functions and globals with an explicit section index
+ /// into this to get their section name.
+ std::vector<std::string> SectionNames;
+
+ if (hasInconsistentModuleGlobalInfo) {
+ align32();
+ } else if (!hasNoDependentLibraries) {
+ // If this bytecode format has dependent library information in it, read in
+ // the number of dependent library items that follow.
unsigned num_dep_libs = read_vbr_uint();
std::string dep_lib;
- while( num_dep_libs-- ) {
+ while (num_dep_libs--) {
dep_lib = read_str();
TheModule->addLibrary(dep_lib);
if (Handler)
@@ -2107,15 +2149,28 @@
}
- // Read target triple and place into the module
+ // Read target triple and place into the module.
std::string triple = read_str();
TheModule->setTargetTriple(triple);
if (Handler)
Handler->handleTargetTriple(triple);
+
+ if (At != BlockEnd && !hasAlignment) {
+ // If the file has section info in it, read the section names now.
+ unsigned NumSections = read_vbr_uint();
+ while (NumSections--)
+ SectionNames.push_back(read_str());
+ }
}
- if (hasInconsistentModuleGlobalInfo)
- align32();
+ // If any globals are in specified sections, assign them now.
+ for (std::map<GlobalValue*, unsigned>::iterator I = SectionID.begin(), E =
+ SectionID.end(); I != E; ++I)
+ if (I->second) {
+ if (I->second > SectionID.size())
+ error("SectionID out of range for global!");
+ I->first->setSection(SectionNames[I->second-1]);
+ }
// This is for future proofing... in the future extra fields may be added that
// we don't understand, so we transparently ignore them.
Index: llvm/lib/Bytecode/Reader/ReaderWrappers.cpp
diff -u llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.51 llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.51.2.1
--- llvm/lib/Bytecode/Reader/ReaderWrappers.cpp:1.51 Wed Jul 27 01:12:33 2005
+++ llvm/lib/Bytecode/Reader/ReaderWrappers.cpp Wed Nov 16 12:32:10 2005
@@ -181,7 +181,7 @@
const Type* ArgTy = F->getFunctionType()->getReturnType();
const Type* ArgTyPtr = PointerType::get(ArgTy);
Function* NF = M->getOrInsertFunction("llvm.va_start",
- RetTy, ArgTyPtr, 0);
+ RetTy, ArgTyPtr, (Type *)0);
for(Value::use_iterator I = F->use_begin(), E = F->use_end(); I != E;)
if (CallInst* CI = dyn_cast<CallInst>(*I++)) {
@@ -204,7 +204,7 @@
const Type* ArgTy = F->getFunctionType()->getParamType(0);
const Type* ArgTyPtr = PointerType::get(ArgTy);
Function* NF = M->getOrInsertFunction("llvm.va_end",
- RetTy, ArgTyPtr, 0);
+ RetTy, ArgTyPtr, (Type *)0);
for(Value::use_iterator I = F->use_begin(), E = F->use_end(); I != E;)
if (CallInst* CI = dyn_cast<CallInst>(*I++)) {
@@ -230,7 +230,7 @@
const Type* ArgTy = F->getFunctionType()->getReturnType();
const Type* ArgTyPtr = PointerType::get(ArgTy);
Function* NF = M->getOrInsertFunction("llvm.va_copy",
- RetTy, ArgTyPtr, ArgTyPtr, 0);
+ RetTy, ArgTyPtr, ArgTyPtr, (Type *)0);
for(Value::use_iterator I = F->use_begin(), E = F->use_end(); I != E;)
if (CallInst* CI = dyn_cast<CallInst>(*I++)) {
More information about the llvm-commits
mailing list