blob: 582af65a417dfd380d07b1c5b342b63434572594 [file] [log] [blame]
Shih-wei Liaod1fec812012-02-13 09:51:10 -08001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "ir_builder.h"
Logan Chien42e0e152012-01-13 15:42:36 +080018#include "runtime_support_func.h"
Shih-wei Liaod1fec812012-02-13 09:51:10 -080019
20#include <llvm/Module.h>
21
Logan Chien83426162011-12-09 09:29:50 +080022namespace art {
23namespace compiler_llvm {
Shih-wei Liaod1fec812012-02-13 09:51:10 -080024
25
26//----------------------------------------------------------------------------
27// General
28//----------------------------------------------------------------------------
29
30IRBuilder::IRBuilder(llvm::LLVMContext& context, llvm::Module& module)
Logan Chien6a917992012-02-17 18:43:48 +080031: LLVMIRBuilder(context), module_(&module) {
Shih-wei Liaod1fec812012-02-13 09:51:10 -080032
33 // Get java object type from module
Logan Chien42e0e152012-01-13 15:42:36 +080034 llvm::Type* jobject_struct_type = module.getTypeByName("JavaObject");
35 CHECK_NE(jobject_struct_type, static_cast<llvm::Type*>(NULL));
Shih-wei Liaod1fec812012-02-13 09:51:10 -080036 jobject_type_ = jobject_struct_type->getPointerTo();
Logan Chien42e0e152012-01-13 15:42:36 +080037
Logan Chienf04364f2012-02-10 12:01:39 +080038 // Create JEnv* type
39 llvm::Type* jenv_struct_type = llvm::StructType::create(context, "JEnv");
40 jenv_type_ = jenv_struct_type->getPointerTo();
41
Logan Chien42e0e152012-01-13 15:42:36 +080042 // Load the runtime support function declaration from module
Logan Chien6a917992012-02-17 18:43:48 +080043 InitRuntimeSupportFuncDecl();
Logan Chien42e0e152012-01-13 15:42:36 +080044}
45
46
47//----------------------------------------------------------------------------
48// Runtime Helper Function
49//----------------------------------------------------------------------------
50
Logan Chien6a917992012-02-17 18:43:48 +080051void IRBuilder::InitRuntimeSupportFuncDecl() {
Logan Chien42e0e152012-01-13 15:42:36 +080052 using namespace runtime_support;
53
54#define GET_RUNTIME_SUPPORT_FUNC_DECL(ID, NAME) \
55 do { \
Logan Chien6a917992012-02-17 18:43:48 +080056 llvm::Function* fn = module_->getFunction(NAME); \
Logan Chien42e0e152012-01-13 15:42:36 +080057 DCHECK_NE(fn, (void*)NULL) << "Function not found: " << NAME; \
58 runtime_support_func_decls_[ID] = fn; \
59 } while (0);
60
61#include "runtime_support_func_list.h"
62 RUNTIME_SUPPORT_FUNC_LIST(GET_RUNTIME_SUPPORT_FUNC_DECL)
63#undef RUNTIME_SUPPORT_FUNC_LIST
64#undef GET_RUNTIME_SUPPORT_FUNC_DECL
65}
66
67
68llvm::Function* IRBuilder::GetRuntime(runtime_support::RuntimeId rt) const {
69 using namespace runtime_support;
70
71 if (rt >= 0 && rt < MAX_ID){
72 return runtime_support_func_decls_[rt];
73 } else {
74 LOG(ERROR) << "Unknown runtime function id: " << rt;
75 return NULL;
76 }
Shih-wei Liaod1fec812012-02-13 09:51:10 -080077}
78
79
80//----------------------------------------------------------------------------
81// Type Helper Function
82//----------------------------------------------------------------------------
83
84llvm::Type* IRBuilder::getJTypeInAccurateSpace(JType jty) {
85 switch (jty) {
86 case kVoid:
87 return getJVoidTy();
88
89 case kBoolean:
90 return getJBooleanTy();
91
92 case kByte:
93 return getJByteTy();
94
95 case kChar:
96 return getJCharTy();
97
98 case kShort:
99 return getJShortTy();
100
101 case kInt:
102 return getJIntTy();
103
104 case kLong:
105 return getJLongTy();
106
107 case kFloat:
108 return getJFloatTy();
109
110 case kDouble:
111 return getJDoubleTy();
112
113 case kObject:
114 return getJObjectTy();
115 }
116
117 LOG(FATAL) << "Unknown java type: " << jty;
118 return NULL;
119}
120
121
122llvm::Type* IRBuilder::getJTypeInRegSpace(JType jty) {
Logan Chien83426162011-12-09 09:29:50 +0800123 RegCategory regcat = GetRegCategoryFromJType(jty);
124
125 switch (regcat) {
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800126 case kRegUnknown:
127 case kRegZero:
Logan Chien83426162011-12-09 09:29:50 +0800128 LOG(FATAL) << "Register category \"Unknown\" or \"Zero\" does not have "
129 << "the LLVM type";
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800130 return NULL;
131
132 case kRegCat1nr:
133 return getInt32Ty();
134
135 case kRegCat2:
136 return getInt64Ty();
137
138 case kRegObject:
139 return getJObjectTy();
140 }
141
Logan Chien83426162011-12-09 09:29:50 +0800142 LOG(FATAL) << "Unknown register category: " << regcat;
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800143 return NULL;
144}
145
146
147llvm::Type* IRBuilder::getJTypeInArraySpace(JType jty) {
148 switch (jty) {
149 case kVoid:
Logan Chien83426162011-12-09 09:29:50 +0800150 LOG(FATAL) << "void type should not be used in array type space";
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800151 return NULL;
152
153 case kBoolean:
154 case kByte:
155 return getInt8Ty();
156
157 case kChar:
158 case kShort:
159 return getInt16Ty();
160
161 case kInt:
162 return getInt32Ty();
163
164 case kLong:
165 return getInt64Ty();
166
167 case kFloat:
168 return getFloatTy();
169
170 case kDouble:
171 return getDoubleTy();
172
173 case kObject:
174 return getJObjectTy();
175 }
176
Logan Chien83426162011-12-09 09:29:50 +0800177 LOG(FATAL) << "Unknown java type: " << jty;
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800178 return NULL;
179}
Logan Chien83426162011-12-09 09:29:50 +0800180
181
182} // namespace compiler_llvm
183} // namespace art