summaryrefslogtreecommitdiff
path: root/src/compiler_llvm/ir_builder.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler_llvm/ir_builder.cc')
-rw-r--r--src/compiler_llvm/ir_builder.cc89
1 files changed, 22 insertions, 67 deletions
diff --git a/src/compiler_llvm/ir_builder.cc b/src/compiler_llvm/ir_builder.cc
index 51a8170d38..88af166fbf 100644
--- a/src/compiler_llvm/ir_builder.cc
+++ b/src/compiler_llvm/ir_builder.cc
@@ -28,13 +28,30 @@ namespace compiler_llvm {
// General
//----------------------------------------------------------------------------
-IRBuilder::IRBuilder(llvm::LLVMContext& context, llvm::Module& module)
-: LLVMIRBuilder(context), module_(&module), mdb_(context) {
-
+IRBuilder::IRBuilder(llvm::LLVMContext& context, llvm::Module& module,
+ IntrinsicHelper& intrinsic_helper)
+ : LLVMIRBuilder(context), module_(&module), mdb_(context), java_object_type_(NULL),
+ java_method_type_(NULL), java_thread_type_(NULL), intrinsic_helper_(intrinsic_helper) {
// Get java object type from module
llvm::Type* jobject_struct_type = module.getTypeByName("JavaObject");
CHECK(jobject_struct_type != NULL);
- jobject_type_ = jobject_struct_type->getPointerTo();
+ java_object_type_ = jobject_struct_type->getPointerTo();
+
+ // If type of Method is not explicitly defined in the module, use JavaObject*
+ llvm::Type* type = module.getTypeByName("Method");
+ if (type != NULL) {
+ java_method_type_ = type->getPointerTo();
+ } else {
+ java_method_type_ = java_object_type_;
+ }
+
+ // If type of Thread is not explicitly defined in the module, use JavaObject*
+ type = module.getTypeByName("Thread");
+ if (type != NULL) {
+ java_thread_type_ = type->getPointerTo();
+ } else {
+ java_thread_type_ = java_object_type_;
+ }
// Create JEnv* type
llvm::Type* jenv_struct_type = llvm::StructType::create(context, "JEnv");
@@ -52,7 +69,7 @@ IRBuilder::IRBuilder(llvm::LLVMContext& context, llvm::Module& module)
// Type Helper Function
//----------------------------------------------------------------------------
-llvm::Type* IRBuilder::getJTypeInAccurateSpace(JType jty) {
+llvm::Type* IRBuilder::getJType(JType jty) {
switch (jty) {
case kVoid:
return getJVoidTy();
@@ -90,68 +107,6 @@ llvm::Type* IRBuilder::getJTypeInAccurateSpace(JType jty) {
}
}
-
-llvm::Type* IRBuilder::getJTypeInRegSpace(JType jty) {
- RegCategory regcat = GetRegCategoryFromJType(jty);
-
- switch (regcat) {
- case kRegUnknown:
- case kRegZero:
- LOG(FATAL) << "Register category \"Unknown\" or \"Zero\" does not have "
- << "the LLVM type";
- return NULL;
-
- case kRegCat1nr:
- return getInt32Ty();
-
- case kRegCat2:
- return getInt64Ty();
-
- case kRegObject:
- return getJObjectTy();
- }
-
- LOG(FATAL) << "Unknown register category: " << regcat;
- return NULL;
-}
-
-
-llvm::Type* IRBuilder::getJTypeInArraySpace(JType jty) {
- switch (jty) {
- case kVoid:
- LOG(FATAL) << "void type should not be used in array type space";
- return NULL;
-
- case kBoolean:
- case kByte:
- return getInt8Ty();
-
- case kChar:
- case kShort:
- return getInt16Ty();
-
- case kInt:
- return getInt32Ty();
-
- case kLong:
- return getInt64Ty();
-
- case kFloat:
- return getFloatTy();
-
- case kDouble:
- return getDoubleTy();
-
- case kObject:
- return getJObjectTy();
-
- default:
- LOG(FATAL) << "Unknown java type: " << jty;
- return NULL;
- }
-}
-
-
llvm::StructType* IRBuilder::getShadowFrameTy(uint32_t vreg_size) {
std::string name(StringPrintf("ShadowFrame%u", vreg_size));