forked from OSchip/llvm-project
Allow bytecode files to refer directly to global values as constants, instead
of forcing them to go through ConstantPointerRef's. This allows bytecode files to mirror .ll files, allows more efficient encoding, and makes it easier to eventually eliminate CPR's. llvm-svn: 10883
This commit is contained in:
parent
980ff78e3c
commit
e2f6317436
|
@ -151,6 +151,10 @@ Constant *BytecodeParser::getConstantValue(unsigned TypeSlot, unsigned Slot) {
|
|||
if (Value *V = getValue(TypeSlot, Slot, false))
|
||||
if (Constant *C = dyn_cast<Constant>(V))
|
||||
return C; // If we already have the value parsed, just return it
|
||||
else if (GlobalValue *GV = dyn_cast<GlobalValue>(V))
|
||||
// ConstantPointerRef's are an abomination, but at least they don't have
|
||||
// to infest bytecode files.
|
||||
return ConstantPointerRef::get(GV);
|
||||
else
|
||||
throw std::string("Reference of a value is expected to be a constant!");
|
||||
|
||||
|
@ -637,10 +641,10 @@ void BytecodeParser::ParseModule(const unsigned char *Buf,
|
|||
// Look up the initializer value...
|
||||
// FIXME: Preserve this type ID!
|
||||
unsigned TypeSlot = getTypeSlot(GV->getType()->getElementType());
|
||||
if (Value *V = getValue(TypeSlot, Slot, false)) {
|
||||
if (Constant *CV = getConstantValue(TypeSlot, Slot)) {
|
||||
if (GV->hasInitializer())
|
||||
throw std::string("Global *already* has an initializer?!");
|
||||
GV->setInitializer(cast<Constant>(V));
|
||||
GV->setInitializer(CV);
|
||||
} else
|
||||
throw std::string("Cannot find initializer value.");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue