blob: 51a8170d38e883ca17bb5ba5ff8e69fec9b89b6f [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"
Elliott Hughese222ee02012-12-13 14:41:43 -080018
19#include "base/stringprintf.h"
Shih-wei Liaod1fec812012-02-13 09:51:10 -080020
21#include <llvm/Module.h>
22
Logan Chien83426162011-12-09 09:29:50 +080023namespace art {
24namespace compiler_llvm {
Shih-wei Liaod1fec812012-02-13 09:51:10 -080025
26
27//----------------------------------------------------------------------------
28// General
29//----------------------------------------------------------------------------
30
31IRBuilder::IRBuilder(llvm::LLVMContext& context, llvm::Module& module)
TDYa1271f196f12012-07-11 20:50:22 -070032: LLVMIRBuilder(context), module_(&module), mdb_(context) {
Shih-wei Liaod1fec812012-02-13 09:51:10 -080033
34 // Get java object type from module
Logan Chien42e0e152012-01-13 15:42:36 +080035 llvm::Type* jobject_struct_type = module.getTypeByName("JavaObject");
Logan Chien1b0a1b72012-03-15 06:20:17 +080036 CHECK(jobject_struct_type != NULL);
Shih-wei Liaod1fec812012-02-13 09:51:10 -080037 jobject_type_ = jobject_struct_type->getPointerTo();
Logan Chien42e0e152012-01-13 15:42:36 +080038
Logan Chienf04364f2012-02-10 12:01:39 +080039 // Create JEnv* type
40 llvm::Type* jenv_struct_type = llvm::StructType::create(context, "JEnv");
41 jenv_type_ = jenv_struct_type->getPointerTo();
42
Logan Chien8dfcbea2012-02-17 18:50:32 +080043 // Get Art shadow frame struct type from module
Logan Chien1b0a1b72012-03-15 06:20:17 +080044 art_frame_type_ = module.getTypeByName("ShadowFrame");
45 CHECK(art_frame_type_ != NULL);
Logan Chien8dfcbea2012-02-17 18:50:32 +080046
TDYa127d668a062012-04-13 12:36:57 -070047 runtime_support_ = NULL;
Shih-wei Liaod1fec812012-02-13 09:51:10 -080048}
49
50
51//----------------------------------------------------------------------------
52// Type Helper Function
53//----------------------------------------------------------------------------
54
55llvm::Type* IRBuilder::getJTypeInAccurateSpace(JType jty) {
56 switch (jty) {
57 case kVoid:
58 return getJVoidTy();
59
60 case kBoolean:
61 return getJBooleanTy();
62
63 case kByte:
64 return getJByteTy();
65
66 case kChar:
67 return getJCharTy();
68
69 case kShort:
70 return getJShortTy();
71
72 case kInt:
73 return getJIntTy();
74
75 case kLong:
76 return getJLongTy();
77
78 case kFloat:
79 return getJFloatTy();
80
81 case kDouble:
82 return getJDoubleTy();
83
84 case kObject:
85 return getJObjectTy();
Shih-wei Liaod1fec812012-02-13 09:51:10 -080086
TDYa127706e7db2012-05-06 00:05:33 -070087 default:
88 LOG(FATAL) << "Unknown java type: " << jty;
89 return NULL;
90 }
Shih-wei Liaod1fec812012-02-13 09:51:10 -080091}
92
93
94llvm::Type* IRBuilder::getJTypeInRegSpace(JType jty) {
Logan Chien83426162011-12-09 09:29:50 +080095 RegCategory regcat = GetRegCategoryFromJType(jty);
96
97 switch (regcat) {
Shih-wei Liaod1fec812012-02-13 09:51:10 -080098 case kRegUnknown:
99 case kRegZero:
Logan Chien83426162011-12-09 09:29:50 +0800100 LOG(FATAL) << "Register category \"Unknown\" or \"Zero\" does not have "
101 << "the LLVM type";
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800102 return NULL;
103
104 case kRegCat1nr:
105 return getInt32Ty();
106
107 case kRegCat2:
108 return getInt64Ty();
109
110 case kRegObject:
111 return getJObjectTy();
112 }
113
Logan Chien83426162011-12-09 09:29:50 +0800114 LOG(FATAL) << "Unknown register category: " << regcat;
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800115 return NULL;
116}
117
118
119llvm::Type* IRBuilder::getJTypeInArraySpace(JType jty) {
120 switch (jty) {
121 case kVoid:
Logan Chien83426162011-12-09 09:29:50 +0800122 LOG(FATAL) << "void type should not be used in array type space";
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800123 return NULL;
124
125 case kBoolean:
126 case kByte:
127 return getInt8Ty();
128
129 case kChar:
130 case kShort:
131 return getInt16Ty();
132
133 case kInt:
134 return getInt32Ty();
135
136 case kLong:
137 return getInt64Ty();
138
139 case kFloat:
140 return getFloatTy();
141
142 case kDouble:
143 return getDoubleTy();
144
145 case kObject:
146 return getJObjectTy();
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800147
TDYa127706e7db2012-05-06 00:05:33 -0700148 default:
149 LOG(FATAL) << "Unknown java type: " << jty;
150 return NULL;
151 }
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800152}
Logan Chien83426162011-12-09 09:29:50 +0800153
154
TDYa127ce4cc0d2012-11-18 16:59:53 -0800155llvm::StructType* IRBuilder::getShadowFrameTy(uint32_t vreg_size) {
156 std::string name(StringPrintf("ShadowFrame%u", vreg_size));
Logan Chien8dfcbea2012-02-17 18:50:32 +0800157
158 // Try to find the existing struct type definition
159 if (llvm::Type* type = module_->getTypeByName(name)) {
160 CHECK(llvm::isa<llvm::StructType>(type));
161 return static_cast<llvm::StructType*>(type);
162 }
163
164 // Create new struct type definition
165 llvm::Type* elem_types[] = {
166 art_frame_type_,
TDYa1278e950c12012-11-02 09:58:19 -0700167 llvm::ArrayType::get(getInt32Ty(), vreg_size),
Logan Chien8dfcbea2012-02-17 18:50:32 +0800168 };
169
170 return llvm::StructType::create(elem_types, name);
171}
172
173
Logan Chien83426162011-12-09 09:29:50 +0800174} // namespace compiler_llvm
175} // namespace art