diff options
author | Chris Lattner <sabre@nondot.org> | 2002-10-14 03:33:02 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-10-14 03:33:02 +0000 |
commit | bbd4b303e3792d94239640a1075b66dedeaa37fe (patch) | |
tree | be03c8082c70d35abe0db1e28becdf812225cb12 /lib/Bytecode/Reader/ConstantReader.cpp | |
parent | 34048e2ace447e5bdbd386d599ce768e19e6b18b (diff) |
There is no way to guarantee that constants are not forward referenced.
Handle forward referenced constants in a general way. This fixes bug:
Assembler/2002-10-13-ConstantEncodingProblem.llx and allows the SPEC
197.parser benchmark to be built
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4161 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bytecode/Reader/ConstantReader.cpp')
-rw-r--r-- | lib/Bytecode/Reader/ConstantReader.cpp | 37 |
1 files changed, 8 insertions, 29 deletions
diff --git a/lib/Bytecode/Reader/ConstantReader.cpp b/lib/Bytecode/Reader/ConstantReader.cpp index 3fb2530c11..e71441edd8 100644 --- a/lib/Bytecode/Reader/ConstantReader.cpp +++ b/lib/Bytecode/Reader/ConstantReader.cpp @@ -202,28 +202,8 @@ bool BytecodeParser::parseConstantValue(const uchar *&Buf, const uchar *EndBuf, << ArgValSlot << "\n"); // Get the arg value from its slot if it exists, otherwise a placeholder - Value *Val = getValue(ArgTy, ArgValSlot, false); - Constant *C; - if (Val) { - if (!(C = dyn_cast<Constant>(Val))) return true; - BCR_TRACE(5, "Constant Found in ValueTable!\n"); - } else { // Nope... find or create a forward ref. for it - GlobalRefsType::iterator I = - GlobalRefs.find(make_pair(ArgTy, ArgValSlot)); - - if (I != GlobalRefs.end()) { - BCR_TRACE(5, "Previous forward ref found!\n"); - C = cast<Constant>(I->second); - } else { - // Create a placeholder for the constant reference and - // keep track of the fact that we have a forward ref to recycle it - BCR_TRACE(5, "Creating new forward ref to a constant!\n"); - C = new ConstPHolder(ArgTy, ArgValSlot); - - // Keep track of the fact that we have a forward ref to recycle it - GlobalRefs.insert(make_pair(make_pair(ArgTy, ArgValSlot), C)); - } - } + Constant *C = getConstantValue(ArgTy, ArgValSlot); + if (C == 0) return true; ArgVec.push_back(C); } @@ -310,9 +290,9 @@ bool BytecodeParser::parseConstantValue(const uchar *&Buf, const uchar *EndBuf, while (NumElements--) { // Read all of the elements of the constant. unsigned Slot; if (read_vbr(Buf, EndBuf, Slot)) return true; - Value *V = getValue(AT->getElementType(), Slot, false); - if (!V || !isa<Constant>(V)) return true; - Elements.push_back(cast<Constant>(V)); + Constant *C = getConstantValue(AT->getElementType(), Slot); + if (!C) return true; + Elements.push_back(C); } V = ConstantArray::get(AT, Elements); break; @@ -326,10 +306,9 @@ bool BytecodeParser::parseConstantValue(const uchar *&Buf, const uchar *EndBuf, for (unsigned i = 0; i < ET.size(); ++i) { unsigned Slot; if (read_vbr(Buf, EndBuf, Slot)) return true; - Value *V = getValue(ET[i], Slot, false); - if (!V || !isa<Constant>(V)) - return true; - Elements.push_back(cast<Constant>(V)); + Constant *C = getConstantValue(ET[i], Slot); + if (!C) return true; + Elements.push_back(C); } V = ConstantStruct::get(ST, Elements); |