aboutsummaryrefslogtreecommitdiff
path: root/lib/ExecutionEngine/ExecutionEngine.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-05-14 17:51:49 +0000
committerChris Lattner <sabre@nondot.org>2003-05-14 17:51:49 +0000
commit9a23122b6a4decff3d3f10cb8d9b5ccebe5c7474 (patch)
tree772822f112acd38e5626f35810a9fd448a759286 /lib/ExecutionEngine/ExecutionEngine.cpp
parent3b9922f99c96bafd2c3ecb7f7fa4a8a4fc9cc9dc (diff)
Add support for more constant expressions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6203 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/ExecutionEngine.cpp')
-rw-r--r--lib/ExecutionEngine/ExecutionEngine.cpp41
1 files changed, 35 insertions, 6 deletions
diff --git a/lib/ExecutionEngine/ExecutionEngine.cpp b/lib/ExecutionEngine/ExecutionEngine.cpp
index 0b5d19eb6f..df4bac6947 100644
--- a/lib/ExecutionEngine/ExecutionEngine.cpp
+++ b/lib/ExecutionEngine/ExecutionEngine.cpp
@@ -31,10 +31,10 @@ void *ExecutionEngine::getPointerToGlobal(const GlobalValue *GV) {
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 @@ GenericValue ExecutionEngine::getConstantValue(const Constant *C) {
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