blob: d93b5885d053c49ac78e02804257dd7b52a19f74 [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
TDYa127ac7b5bb2012-05-11 13:17:49 -070022#include <algorithm>
23
Logan Chien83426162011-12-09 09:29:50 +080024namespace art {
25namespace compiler_llvm {
Shih-wei Liaod1fec812012-02-13 09:51:10 -080026
27
28//----------------------------------------------------------------------------
29// General
30//----------------------------------------------------------------------------
31
32IRBuilder::IRBuilder(llvm::LLVMContext& context, llvm::Module& module)
TDYa127aba61122012-05-04 18:28:36 -070033: LLVMIRBuilder(context), module_(&module), tbaa_(context) {
Shih-wei Liaod1fec812012-02-13 09:51:10 -080034
35 // Get java object type from module
Logan Chien42e0e152012-01-13 15:42:36 +080036 llvm::Type* jobject_struct_type = module.getTypeByName("JavaObject");
Logan Chien1b0a1b72012-03-15 06:20:17 +080037 CHECK(jobject_struct_type != NULL);
Shih-wei Liaod1fec812012-02-13 09:51:10 -080038 jobject_type_ = jobject_struct_type->getPointerTo();
Logan Chien42e0e152012-01-13 15:42:36 +080039
Logan Chienf04364f2012-02-10 12:01:39 +080040 // Create JEnv* type
41 llvm::Type* jenv_struct_type = llvm::StructType::create(context, "JEnv");
42 jenv_type_ = jenv_struct_type->getPointerTo();
43
Logan Chien8dfcbea2012-02-17 18:50:32 +080044 // Get Art shadow frame struct type from module
Logan Chien1b0a1b72012-03-15 06:20:17 +080045 art_frame_type_ = module.getTypeByName("ShadowFrame");
46 CHECK(art_frame_type_ != NULL);
Logan Chien8dfcbea2012-02-17 18:50:32 +080047
TDYa127d668a062012-04-13 12:36:57 -070048 runtime_support_ = NULL;
TDYa127ac7b5bb2012-05-11 13:17:49 -070049
50
51 // Pre-generate the MDNode for static branch prediction
52 llvm::Type* int32ty = llvm::Type::getInt32Ty(context);
53 llvm::MDString* branch_weights = llvm::MDString::get(context, "branch_weights");
54 llvm::Constant* likely = llvm::ConstantInt::get(int32ty, 64);
55 llvm::Constant* unlikely = llvm::ConstantInt::get(int32ty, 4);
56 llvm::Value *opts[] = {
57 branch_weights,
58 likely,
59 unlikely
60 };
61
62 expect_cond_[kLikely] = llvm::MDNode::get(context, opts);
63 std::swap(opts[1], opts[2]);
64 expect_cond_[kUnlikely] = llvm::MDNode::get(context, opts);
Shih-wei Liaod1fec812012-02-13 09:51:10 -080065}
66
67
68//----------------------------------------------------------------------------
69// Type Helper Function
70//----------------------------------------------------------------------------
71
72llvm::Type* IRBuilder::getJTypeInAccurateSpace(JType jty) {
73 switch (jty) {
74 case kVoid:
75 return getJVoidTy();
76
77 case kBoolean:
78 return getJBooleanTy();
79
80 case kByte:
81 return getJByteTy();
82
83 case kChar:
84 return getJCharTy();
85
86 case kShort:
87 return getJShortTy();
88
89 case kInt:
90 return getJIntTy();
91
92 case kLong:
93 return getJLongTy();
94
95 case kFloat:
96 return getJFloatTy();
97
98 case kDouble:
99 return getJDoubleTy();
100
101 case kObject:
102 return getJObjectTy();
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800103
TDYa127706e7db2012-05-06 00:05:33 -0700104 default:
105 LOG(FATAL) << "Unknown java type: " << jty;
106 return NULL;
107 }
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800108}
109
110
111llvm::Type* IRBuilder::getJTypeInRegSpace(JType jty) {
Logan Chien83426162011-12-09 09:29:50 +0800112 RegCategory regcat = GetRegCategoryFromJType(jty);
113
114 switch (regcat) {
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800115 case kRegUnknown:
116 case kRegZero:
Logan Chien83426162011-12-09 09:29:50 +0800117 LOG(FATAL) << "Register category \"Unknown\" or \"Zero\" does not have "
118 << "the LLVM type";
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800119 return NULL;
120
121 case kRegCat1nr:
122 return getInt32Ty();
123
124 case kRegCat2:
125 return getInt64Ty();
126
127 case kRegObject:
128 return getJObjectTy();
129 }
130
Logan Chien83426162011-12-09 09:29:50 +0800131 LOG(FATAL) << "Unknown register category: " << regcat;
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800132 return NULL;
133}
134
135
136llvm::Type* IRBuilder::getJTypeInArraySpace(JType jty) {
137 switch (jty) {
138 case kVoid:
Logan Chien83426162011-12-09 09:29:50 +0800139 LOG(FATAL) << "void type should not be used in array type space";
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800140 return NULL;
141
142 case kBoolean:
143 case kByte:
144 return getInt8Ty();
145
146 case kChar:
147 case kShort:
148 return getInt16Ty();
149
150 case kInt:
151 return getInt32Ty();
152
153 case kLong:
154 return getInt64Ty();
155
156 case kFloat:
157 return getFloatTy();
158
159 case kDouble:
160 return getDoubleTy();
161
162 case kObject:
163 return getJObjectTy();
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800164
TDYa127706e7db2012-05-06 00:05:33 -0700165 default:
166 LOG(FATAL) << "Unknown java type: " << jty;
167 return NULL;
168 }
Shih-wei Liaod1fec812012-02-13 09:51:10 -0800169}
Logan Chien83426162011-12-09 09:29:50 +0800170
171
Logan Chien8dfcbea2012-02-17 18:50:32 +0800172llvm::StructType* IRBuilder::getShadowFrameTy(uint32_t sirt_size) {
Logan Chien1b0a1b72012-03-15 06:20:17 +0800173 std::string name(StringPrintf("ShadowFrame%u", sirt_size));
Logan Chien8dfcbea2012-02-17 18:50:32 +0800174
175 // Try to find the existing struct type definition
176 if (llvm::Type* type = module_->getTypeByName(name)) {
177 CHECK(llvm::isa<llvm::StructType>(type));
178 return static_cast<llvm::StructType*>(type);
179 }
180
181 // Create new struct type definition
182 llvm::Type* elem_types[] = {
183 art_frame_type_,
184 llvm::ArrayType::get(jobject_type_, sirt_size),
185 };
186
187 return llvm::StructType::create(elem_types, name);
188}
189
190
Logan Chien83426162011-12-09 09:29:50 +0800191} // namespace compiler_llvm
192} // namespace art