blob: 9644ebd976cc405c87b9ed14e79292eb21b13512 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ir_builder.h"
#include "base/stringprintf.h"
#include <llvm/IR/Module.h>
namespace art {
namespace llvm {
//----------------------------------------------------------------------------
// General
//----------------------------------------------------------------------------
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);
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");
jenv_type_ = jenv_struct_type->getPointerTo();
// Get Art shadow frame struct type from module
art_frame_type_ = module.getTypeByName("ShadowFrame");
CHECK(art_frame_type_ != NULL);
runtime_support_ = NULL;
}
//----------------------------------------------------------------------------
// Type Helper Function
//----------------------------------------------------------------------------
::llvm::Type* IRBuilder::getJType(JType jty) {
switch (jty) {
case kVoid:
return getJVoidTy();
case kBoolean:
return getJBooleanTy();
case kByte:
return getJByteTy();
case kChar:
return getJCharTy();
case kShort:
return getJShortTy();
case kInt:
return getJIntTy();
case kLong:
return getJLongTy();
case kFloat:
return getJFloatTy();
case kDouble:
return getJDoubleTy();
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));
// Try to find the existing struct type definition
if (::llvm::Type* type = module_->getTypeByName(name)) {
CHECK(::llvm::isa< ::llvm::StructType>(type));
return static_cast< ::llvm::StructType*>(type);
}
// Create new struct type definition
::llvm::Type* elem_types[] = {
art_frame_type_,
::llvm::ArrayType::get(getInt32Ty(), vreg_size),
};
return ::llvm::StructType::create(elem_types, name);
}
} // namespace llvm
} // namespace art