// automatically fold, just the ones involving pointers won't.
//
Constant *Op = CE->getOperand(0);
+ GenericValue GV = getConstantValue(Op);
// Handle cast of pointer to pointer...
if (Op->getType()->getPrimitiveID() == C->getType()->getPrimitiveID())
- return getConstantValue(Op);
+ return GV;
// Handle a cast of pointer to any integral type...
if (isa<PointerType>(Op->getType()) && C->getType()->isIntegral())
- return getConstantValue(Op);
+ return GV;
- // Handle cast of long to pointer...
- if (isa<PointerType>(C->getType()) && (Op->getType() == Type::LongTy ||
- Op->getType() == Type::ULongTy))
- return getConstantValue(Op);
+ // Handle cast of integer to a pointer...
+ if (isa<PointerType>(C->getType()) && Op->getType()->isIntegral())
+ switch (Op->getType()->getPrimitiveID()) {
+ case Type::BoolTyID: return PTOGV((void*)(uintptr_t)GV.BoolVal);
+ case Type::SByteTyID: return PTOGV((void*)( intptr_t)GV.SByteVal);
+ case Type::UByteTyID: return PTOGV((void*)(uintptr_t)GV.UByteVal);
+ case Type::ShortTyID: return PTOGV((void*)( intptr_t)GV.ShortVal);
+ case Type::UShortTyID: return PTOGV((void*)(uintptr_t)GV.UShortVal);
+ case Type::IntTyID: return PTOGV((void*)( intptr_t)GV.IntVal);
+ case Type::UIntTyID: return PTOGV((void*)(uintptr_t)GV.UIntVal);
+ case Type::LongTyID: return PTOGV((void*)( intptr_t)GV.LongVal);
+ case Type::ULongTyID: return PTOGV((void*)(uintptr_t)GV.ULongVal);
+ default: assert(0 && "Unknown integral type!");
+ }
break;
}
GenericValue Val = getConstantValue(Init);
StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType());
return;
+ } else if (isa<ConstantAggregateZero>(Init)) {
+ unsigned Size = getTargetData().getTypeSize(Init->getType());
+ memset(Addr, 0, Size);
+ return;
}
switch (Init->getType()->getPrimitiveID()) {
// Allocate some memory for it!
unsigned Size = TD.getTypeSize(Ty);
addGlobalMapping(I, new char[Size]);
-
- DEBUG(std::cerr << "Global '" << I->getName() << "' -> "
- << getPointerToGlobal(I) << "\n");
} else {
// External variable reference. Try to use the dynamic loader to
// get a pointer to it.
// already in the map.
void ExecutionEngine::EmitGlobalVariable(const GlobalVariable *GV) {
void *GA = getPointerToGlobalIfAvailable(GV);
+ DEBUG(std::cerr << "Global '" << GV->getName() << "' -> " << GA << "\n");
+
const Type *ElTy = GV->getType()->getElementType();
if (GA == 0) {
// If it's not already specified, allocate memory for the global.