blob: e8e73e3780ed7f9b159f047adaf1b16a830d9cbe [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 Chien8dfcbea2012-02-17 18:50:32 +080018#include "stringprintf.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)
TDYa1271f196f12012-07-11 20:50:22 -070031: LLVMIRBuilder(context), module_(&module), mdb_(context) {
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");
Logan Chien1b0a1b72012-03-15 06:20:17 +080035 CHECK(jobject_struct_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 Chien8dfcbea2012-02-17 18:50:32 +080042 // Get Art shadow frame struct type from module
Logan Chien1b0a1b72012-03-15 06:20:17 +080043 art_frame_type_ = module.getTypeByName("ShadowFrame");
44 CHECK(art_frame_type_ != NULL);
Logan Chien8dfcbea2012-02-17 18:50:32 +080045
TDYa127d668a062012-04-13 12:36:57 -070046 runtime_support_ = NULL;
Shih-wei Liaod1fec812012-02-13 09:51:10 -080047}
48
49
50//----------------------------------------------------------------------------
51// Type Helper Function
52//----------------------------------------------------------------------------
53
54llvm::Type* IRBuilder::getJTypeInAccurateSpace(JType jty) {
55 switch (jty) {
56 case kVoid:
57 return getJVoidTy();
58
59 case kBoolean:
60 return getJBooleanTy();
61
62 case kByte:
63 return getJByteTy();
64
65 case kChar:
66 return getJCharTy();
67
68 case kShort:
69 return getJShortTy();
70
71 case kInt:
72 return getJIntTy();
73
74 case kLong:
75 return getJLongTy();
76
77 case kFloat:
78 return getJFloatTy();
79
80 case kDouble:
81 return getJDoubleTy();
82
83 case kObject:
84 return getJObjectTy();
Shih-wei Liaod1fec812012-02-13 09:51:10 -080085
TDYa127706e7db2012-05-06 00:05:33 -070086 default:
87 LOG(FATAL) << "Unknown java type: " << jty;
88 return NULL;
89 }
Shih-wei Liaod1fec812012-02-13 09:51:10 -080090}
91
92
93llvm::Type* IRBuilder::getJTypeInRegSpace(JType jty) {
Logan Chien83426162011-12-09 09:29:50 +080094 RegCategory regcat = GetRegCategoryFromJType(jty);
95
96 switch (regcat) {
Shih-wei Liaod1fec812012-02-13 09:51:10 -080097 case kRegUnknown:
98 case kRegZero:
Logan Chien83426162011-12-09 09:29:50 +080099 LOG(FATAL) << "Register category \"Unknown\" or \"Zero\" does not have "
100 << "the LLVM type";
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800101 return NULL;
102
103 case kRegCat1nr:
104 return getInt32Ty();
105
106 case kRegCat2:
107 return getInt64Ty();
108
109 case kRegObject:
110 return getJObjectTy();
111 }
112
Logan Chien83426162011-12-09 09:29:50 +0800113 LOG(FATAL) << "Unknown register category: " << regcat;
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800114 return NULL;
115}
116
117
118llvm::Type* IRBuilder::getJTypeInArraySpace(JType jty) {
119 switch (jty) {
120 case kVoid:
Logan Chien83426162011-12-09 09:29:50 +0800121 LOG(FATAL) << "void type should not be used in array type space";
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800122 return NULL;
123
124 case kBoolean:
125 case kByte:
126 return getInt8Ty();
127
128 case kChar:
129 case kShort:
130 return getInt16Ty();
131
132 case kInt:
133 return getInt32Ty();
134
135 case kLong:
136 return getInt64Ty();
137
138 case kFloat:
139 return getFloatTy();
140
141 case kDouble:
142 return getDoubleTy();
143
144 case kObject:
145 return getJObjectTy();
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800146
TDYa127706e7db2012-05-06 00:05:33 -0700147 default:
148 LOG(FATAL) << "Unknown java type: " << jty;
149 return NULL;
150 }
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800151}
Logan Chien83426162011-12-09 09:29:50 +0800152
153
TDYa127ce4cc0d2012-11-18 16:59:53 -0800154llvm::StructType* IRBuilder::getShadowFrameTy(uint32_t vreg_size) {
155 std::string name(StringPrintf("ShadowFrame%u", vreg_size));
Logan Chien8dfcbea2012-02-17 18:50:32 +0800156
157 // Try to find the existing struct type definition
158 if (llvm::Type* type = module_->getTypeByName(name)) {
159 CHECK(llvm::isa<llvm::StructType>(type));
160 return static_cast<llvm::StructType*>(type);
161 }
162
163 // Create new struct type definition
164 llvm::Type* elem_types[] = {
165 art_frame_type_,
TDYa1278e950c12012-11-02 09:58:19 -0700166 llvm::ArrayType::get(getInt32Ty(), vreg_size),
Logan Chien8dfcbea2012-02-17 18:50:32 +0800167 };
168
169 return llvm::StructType::create(elem_types, name);
170}
171
172
Logan Chien83426162011-12-09 09:29:50 +0800173} // namespace compiler_llvm
174} // namespace art