[llvm-commits] CVS: llvm/tools/lli/ExecutionEngine.cpp
Chris Lattner
lattner at cs.uiuc.edu
Wed May 14 12:55:41 PDT 2003
Changes in directory llvm/tools/lli:
ExecutionEngine.cpp updated: 1.10 -> 1.11
---
Log message:
Add support for more constant expressions
---
Diffs of the changes:
Index: llvm/tools/lli/ExecutionEngine.cpp
diff -u llvm/tools/lli/ExecutionEngine.cpp:1.10 llvm/tools/lli/ExecutionEngine.cpp:1.11
--- llvm/tools/lli/ExecutionEngine.cpp:1.10 Tue May 13 15:29:17 2003
+++ llvm/tools/lli/ExecutionEngine.cpp Wed May 14 12:51:49 2003
@@ -31,10 +31,10 @@
GenericValue ExecutionEngine::getConstantValue(const Constant *C) {
GenericValue Result;
- if (ConstantExpr *CE = const_cast<ConstantExpr*>(dyn_cast<ConstantExpr>(C)))
+ if (ConstantExpr *CE = const_cast<ConstantExpr*>(dyn_cast<ConstantExpr>(C))) {
switch (CE->getOpcode()) {
case Instruction::GetElementPtr: {
- Result = getConstantValue(cast<Constant>(CE->getOperand(0)));
+ Result = getConstantValue(CE->getOperand(0));
std::vector<Value*> Indexes(CE->op_begin()+1, CE->op_end());
uint64_t Offset =
TD->getIndexedOffset(CE->getOperand(0)->getType(), Indexes);
@@ -42,13 +42,42 @@
Result.LongVal += Offset;
return Result;
}
+ case Instruction::Cast: {
+ // We only need to handle a few cases here. Almost all casts will
+ // automatically fold, just the ones involving pointers won't.
+ //
+ Constant *Op = CE->getOperand(0);
- default:
- std::cerr << "ConstantExpr not handled as global var init: " << *CE
- << "\n";
- abort();
+ // Handle cast of pointer to pointer...
+ if (Op->getType()->getPrimitiveID() == C->getType()->getPrimitiveID())
+ return getConstantValue(Op);
+
+ // Handle cast of long to pointer or pointer to long...
+ if ((isa<PointerType>(Op->getType()) && (C->getType() == Type::LongTy ||
+ C->getType() == Type::ULongTy))||
+ (isa<PointerType>(C->getType()) && (Op->getType() == Type::LongTy ||
+ Op->getType() == Type::ULongTy))){
+ return getConstantValue(Op);
+ }
+ break;
}
+ case Instruction::Add:
+ if (C->getOperand(0)->getType() == Type::LongTy ||
+ C->getOperand(0)->getType() == Type::ULongTy)
+ Result.LongVal = getConstantValue(C->getOperand(0)).LongVal +
+ getConstantValue(C->getOperand(1)).LongVal;
+ else
+ break;
+ return Result;
+
+ default:
+ break;
+ }
+ std::cerr << "ConstantExpr not handled as global var init: " << *CE << "\n";
+ abort();
+ }
+
switch (C->getType()->getPrimitiveID()) {
#define GET_CONST_VAL(TY, CLASS) \
case Type::TY##TyID: Result.TY##Val = cast<CLASS>(C)->getValue(); break
More information about the llvm-commits
mailing list