diff options
| -rw-r--r-- | llvm/lib/AsmParser/llvmAsmParser.y | 12 | ||||
| -rw-r--r-- | llvm/lib/Bytecode/Reader/ConstantReader.cpp | 4 | 
2 files changed, 13 insertions, 3 deletions
diff --git a/llvm/lib/AsmParser/llvmAsmParser.y b/llvm/lib/AsmParser/llvmAsmParser.y index a26ea80c815..d865742c85b 100644 --- a/llvm/lib/AsmParser/llvmAsmParser.y +++ b/llvm/lib/AsmParser/llvmAsmParser.y @@ -969,13 +969,23 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr    }; +// FIXME: ConstExpr::get never return null!  ConstExpr: Types CAST ConstVal {      ConstantExpr* CPE = ConstantExpr::get($2, $3, $1->get());      if (CPE == 0) ThrowException("constant expression builder returned null!");      $$ = CPE;    }    | Types GETELEMENTPTR '(' ConstVal IndexList ')' { -    ConstantExpr* CPE = ConstantExpr::get($2, $4, *$5, $1->get()); +    vector<Constant*> IdxVec; +    for (unsigned i = 0, e = $5->size(); i != e; ++i) +      if (Constant *C = dyn_cast<Constant>((*$5)[i])) +        IdxVec.push_back(C); +      else +        ThrowException("Arguments to getelementptr must be constants!"); + +    delete $5; + +    ConstantExpr* CPE = ConstantExpr::get($2, $4, IdxVec, $1->get());      if (CPE == 0) ThrowException("constant expression builder returned null!");      $$ = CPE;    } diff --git a/llvm/lib/Bytecode/Reader/ConstantReader.cpp b/llvm/lib/Bytecode/Reader/ConstantReader.cpp index 68d6a62249d..6bbeb8680b1 100644 --- a/llvm/lib/Bytecode/Reader/ConstantReader.cpp +++ b/llvm/lib/Bytecode/Reader/ConstantReader.cpp @@ -204,7 +204,7 @@ bool BytecodeParser::parseConstantValue(const uchar *&Buf, const uchar *EndBuf,        // Get the arg value from its slot if it exists, otherwise a placeholder        Value *Val = getValue(argTy, argValSlot, false); -      Constant* C; +      Constant *C;        if (Val) {          if (!(C = dyn_cast<Constant>(Val))) return failure(true);          BCR_TRACE(5, "Constant Found in ValueTable!\n"); @@ -218,7 +218,7 @@ bool BytecodeParser::parseConstantValue(const uchar *&Buf, const uchar *EndBuf,      if (isExprNumArgs == 1) {           // All one-operand expressions        V = ConstantExpr::get(opCode, argVec[0], Ty);      } else if (opCode == Instruction::GetElementPtr) { // GetElementPtr -      std::vector<Value*> IdxList(argVec.begin()+1, argVec.end()); +      std::vector<Constant*> IdxList(argVec.begin()+1, argVec.end());        V = ConstantExpr::get(opCode, argVec[0], IdxList, Ty);      } else {                            // All other 2-operand expressions        V = ConstantExpr::get(opCode, argVec[0], argVec[1], Ty);  | 

