#include "JIT/JIT.h"
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
-#include "llvm/IntrinsicLowering.h"
#include "llvm/Module.h"
#include "llvm/ModuleProvider.h"
+#include "llvm/CodeGen/IntrinsicLowering.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
#include "llvm/ExecutionEngine/GenericValue.h"
#include "llvm/Target/TargetData.h"
std::vector<GenericValue> GVArgs;
GenericValue GVArgc;
GVArgc.IntVal = argv.size();
- GVArgs.push_back(GVArgc); // Arg #0 = argc.
- GVArgs.push_back(PTOGV(CreateArgv(this, argv))); // Arg #1 = argv.
- assert(((char **)GVTOP(GVArgs[1]))[0] && "argv[0] was null after CreateArgv");
-
- std::vector<std::string> EnvVars;
- for (unsigned i = 0; envp[i]; ++i)
- EnvVars.push_back(envp[i]);
- GVArgs.push_back(PTOGV(CreateArgv(this, EnvVars))); // Arg #2 = envp.
+ unsigned NumArgs = Fn->getFunctionType()->getNumParams();
+ if (NumArgs) {
+ GVArgs.push_back(GVArgc); // Arg #0 = argc.
+ if (NumArgs > 1) {
+ GVArgs.push_back(PTOGV(CreateArgv(this, argv))); // Arg #1 = argv.
+ assert(((char **)GVTOP(GVArgs[1]))[0] &&
+ "argv[0] was null after CreateArgv");
+ if (NumArgs > 2) {
+ std::vector<std::string> EnvVars;
+ for (unsigned i = 0; envp[i]; ++i)
+ EnvVars.push_back(envp[i]);
+ GVArgs.push_back(PTOGV(CreateArgv(this, EnvVars))); // Arg #2 = envp.
+ }
+ }
+ }
return runFunction(Fn, GVArgs).IntVal;
}
} catch (...) {
std::cerr << "Error creating the interpreter!\n";
}
+ } catch (std::string& errmsg) {
+ std::cerr << "Error reading the bytecode file: " << errmsg << "\n";
} catch (...) {
std::cerr << "Error reading the bytecode file!\n";
}
GenericValue GV = getConstantValue(Op);
// Handle cast of pointer to pointer...
- if (Op->getType()->getPrimitiveID() == C->getType()->getPrimitiveID())
+ if (Op->getType()->getTypeID() == C->getType()->getTypeID())
return GV;
// Handle a cast of pointer to any integral type...
// Handle cast of integer to a pointer...
if (isa<PointerType>(C->getType()) && Op->getType()->isIntegral())
- switch (Op->getType()->getPrimitiveID()) {
+ switch (Op->getType()->getTypeID()) {
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 Instruction::Add:
- if (CE->getOperand(0)->getType() == Type::LongTy ||
- CE->getOperand(0)->getType() == Type::ULongTy)
+ switch (CE->getOperand(0)->getType()->getTypeID()) {
+ default: assert(0 && "Bad add type!"); abort();
+ case Type::LongTyID:
+ case Type::ULongTyID:
Result.LongVal = getConstantValue(CE->getOperand(0)).LongVal +
getConstantValue(CE->getOperand(1)).LongVal;
- else
break;
+ case Type::IntTyID:
+ case Type::UIntTyID:
+ Result.IntVal = getConstantValue(CE->getOperand(0)).IntVal +
+ getConstantValue(CE->getOperand(1)).IntVal;
+ break;
+ case Type::ShortTyID:
+ case Type::UShortTyID:
+ Result.ShortVal = getConstantValue(CE->getOperand(0)).ShortVal +
+ getConstantValue(CE->getOperand(1)).ShortVal;
+ break;
+ case Type::SByteTyID:
+ case Type::UByteTyID:
+ Result.SByteVal = getConstantValue(CE->getOperand(0)).SByteVal +
+ getConstantValue(CE->getOperand(1)).SByteVal;
+ break;
+ case Type::FloatTyID:
+ Result.FloatVal = getConstantValue(CE->getOperand(0)).FloatVal +
+ getConstantValue(CE->getOperand(1)).FloatVal;
+ break;
+ case Type::DoubleTyID:
+ Result.DoubleVal = getConstantValue(CE->getOperand(0)).DoubleVal +
+ getConstantValue(CE->getOperand(1)).DoubleVal;
+ break;
+ }
return Result;
-
default:
break;
}
abort();
}
- switch (C->getType()->getPrimitiveID()) {
+ switch (C->getType()->getTypeID()) {
#define GET_CONST_VAL(TY, CLASS) \
case Type::TY##TyID: Result.TY##Val = cast<CLASS>(C)->getValue(); break
GET_CONST_VAL(Bool , ConstantBool);
GET_CONST_VAL(Double , ConstantFP);
#undef GET_CONST_VAL
case Type::PointerTyID:
- if (isa<ConstantPointerNull>(C)) {
+ if (isa<ConstantPointerNull>(C))
Result.PointerVal = 0;
- } else if (const ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(C)){
- if (Function *F =
- const_cast<Function*>(dyn_cast<Function>(CPR->getValue())))
- Result = PTOGV(getPointerToFunctionOrStub(F));
- else
- Result = PTOGV(getOrEmitGlobalVariable(
- cast<GlobalVariable>(CPR->getValue())));
-
- } else {
+ else if (const Function *F = dyn_cast<Function>(C))
+ Result = PTOGV(getPointerToFunctionOrStub(const_cast<Function*>(F)));
+ else if (const GlobalVariable* GV = dyn_cast<GlobalVariable>(C))
+ Result = PTOGV(getOrEmitGlobalVariable(const_cast<GlobalVariable*>(GV)));
+ else
assert(0 && "Unknown constant pointer type!");
- }
break;
default:
- std::cout << "ERROR: Constant unimp for type: " << C->getType() << "\n";
+ std::cout << "ERROR: Constant unimp for type: " << *C->getType() << "\n";
abort();
}
return Result;
void ExecutionEngine::StoreValueToMemory(GenericValue Val, GenericValue *Ptr,
const Type *Ty) {
if (getTargetData().isLittleEndian()) {
- switch (Ty->getPrimitiveID()) {
+ switch (Ty->getTypeID()) {
case Type::BoolTyID:
case Type::UByteTyID:
case Type::SByteTyID: Ptr->Untyped[0] = Val.UByteVal; break;
Ptr->Untyped[7] = (Val.ULongVal >> 56) & 255;
break;
default:
- std::cout << "Cannot store value of type " << Ty << "!\n";
+ std::cout << "Cannot store value of type " << *Ty << "!\n";
}
} else {
- switch (Ty->getPrimitiveID()) {
+ switch (Ty->getTypeID()) {
case Type::BoolTyID:
case Type::UByteTyID:
case Type::SByteTyID: Ptr->Untyped[0] = Val.UByteVal; break;
Ptr->Untyped[0] = (Val.ULongVal >> 56) & 255;
break;
default:
- std::cout << "Cannot store value of type " << Ty << "!\n";
+ std::cout << "Cannot store value of type " << *Ty << "!\n";
}
}
}
const Type *Ty) {
GenericValue Result;
if (getTargetData().isLittleEndian()) {
- switch (Ty->getPrimitiveID()) {
+ switch (Ty->getTypeID()) {
case Type::BoolTyID:
case Type::UByteTyID:
case Type::SByteTyID: Result.UByteVal = Ptr->Untyped[0]; break;
abort();
}
} else {
- switch (Ty->getPrimitiveID()) {
+ switch (Ty->getTypeID()) {
case Type::BoolTyID:
case Type::UByteTyID:
case Type::SByteTyID: Result.UByteVal = Ptr->Untyped[0]; break;
return;
}
- switch (Init->getType()->getPrimitiveID()) {
+ switch (Init->getType()->getTypeID()) {
case Type::ArrayTyID: {
const ConstantArray *CPA = cast<ConstantArray>(Init);
- const std::vector<Use> &Val = CPA->getValues();
unsigned ElementSize =
getTargetData().getTypeSize(cast<ArrayType>(CPA->getType())->getElementType());
- for (unsigned i = 0; i < Val.size(); ++i)
- InitializeMemory(cast<Constant>(Val[i].get()), (char*)Addr+i*ElementSize);
+ for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i)
+ InitializeMemory(CPA->getOperand(i), (char*)Addr+i*ElementSize);
return;
}
const ConstantStruct *CPS = cast<ConstantStruct>(Init);
const StructLayout *SL =
getTargetData().getStructLayout(cast<StructType>(CPS->getType()));
- const std::vector<Use> &Val = CPS->getValues();
- for (unsigned i = 0; i < Val.size(); ++i)
- InitializeMemory(cast<Constant>(Val[i].get()),
- (char*)Addr+SL->MemberOffsets[i]);
+ for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i)
+ InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->MemberOffsets[i]);
return;
}
default:
- std::cerr << "Bad Type: " << Init->getType() << "\n";
+ std::cerr << "Bad Type: " << *Init->getType() << "\n";
assert(0 && "Unknown constant type to initialize memory with!");
}
}