summaryrefslogtreecommitdiffstats
path: root/src/compiler_llvm
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2012-02-28 16:15:33 -0800
committerIan Rogers <irogers@google.com>2012-02-29 12:17:34 -0800
commit04ec04e096306c38abe00cbe65e0aff64524ab1d (patch)
treee798dbb4ba8814e787cd813fd48d06cb28188c6a /src/compiler_llvm
parent61c65dc8a86545b3f6a3daaa360ad73ce97e7b0e (diff)
downloadart-04ec04e096306c38abe00cbe65e0aff64524ab1d.zip
art-04ec04e096306c38abe00cbe65e0aff64524ab1d.tar.gz
art-04ec04e096306c38abe00cbe65e0aff64524ab1d.tar.bz2
Fix LLVM compiler following array object representation change
Change-Id: Ia987e1392dc1814dcb29e2a26c8a5d7b12d86f21
Diffstat (limited to 'src/compiler_llvm')
-rw-r--r--src/compiler_llvm/method_compiler.cc39
-rw-r--r--src/compiler_llvm/method_compiler.h3
2 files changed, 29 insertions, 13 deletions
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index 294d005..8dc81dd 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -1732,8 +1732,11 @@ void MethodCompiler::EmitInsn_FilledNewArray(uint32_t dex_pc,
llvm::Value* object_addr_int =
irb_.CreatePtrToInt(object_addr, irb_.getPtrEquivIntTy());
+ // TODO: currently FilledNewArray doesn't support I, J, D and L, [ so computing the component
+ // size using int alignment is safe. This code should determine the width of the FilledNewArray
+ // component.
llvm::Value* data_field_offset =
- irb_.getPtrEquivInt(Array::DataOffset().Int32Value());
+ irb_.getPtrEquivInt(Array::DataOffset(sizeof(int32_t)).Int32Value());
llvm::Value* data_field_addr_int =
irb_.CreateAdd(object_addr_int, data_field_offset);
@@ -1818,9 +1821,12 @@ void MethodCompiler::EmitInsn_FillArrayData(uint32_t dex_pc,
EmitGuard_ArrayIndexOutOfBoundsException(dex_pc, array_addr, last_index);
+ // TODO: currently FillArray doesn't support I, J, D and L, [ so computing the component
+ // size using int alignment is safe. This code should determine the width of the FillArray
+ // component.
// Get array data field
llvm::Value* data_field_offset_value =
- irb_.getPtrEquivInt(Array::DataOffset().Int32Value());
+ irb_.getPtrEquivInt(Array::DataOffset(sizeof(int32_t)).Int32Value());
llvm::Value* data_field_addr =
irb_.CreatePtrDisp(array_addr, data_field_offset_value,
@@ -2196,10 +2202,19 @@ void MethodCompiler::EmitGuard_ArrayException(uint32_t dex_pc,
// Emit Array GetElementPtr
llvm::Value* MethodCompiler::EmitArrayGEP(llvm::Value* array_addr,
llvm::Value* index_value,
- llvm::Type* elem_type) {
+ llvm::Type* elem_type,
+ JType elem_jty) {
+
+ int data_offset;
+ if (elem_jty == kLong || elem_jty == kDouble ||
+ (elem_jty == kObject && sizeof(uint64_t) == sizeof(Object*))) {
+ data_offset = Array::DataOffset(sizeof(int64_t)).Int32Value();
+ } else {
+ data_offset = Array::DataOffset(sizeof(int32_t)).Int32Value();
+ }
llvm::Constant* data_offset_value =
- irb_.getPtrEquivInt(Array::DataOffset().Int32Value());
+ irb_.getPtrEquivInt(data_offset);
llvm::Value* array_data_addr =
irb_.CreatePtrDisp(array_addr, data_offset_value,
@@ -2223,7 +2238,7 @@ void MethodCompiler::EmitInsn_AGet(uint32_t dex_pc,
llvm::Type* elem_type = irb_.getJType(elem_jty, kArray);
llvm::Value* array_elem_addr =
- EmitArrayGEP(array_addr, index_value, elem_type);
+ EmitArrayGEP(array_addr, index_value, elem_type, elem_jty);
llvm::Value* array_elem_value = irb_.CreateLoad(array_elem_addr);
@@ -2247,7 +2262,7 @@ void MethodCompiler::EmitInsn_APut(uint32_t dex_pc,
llvm::Type* elem_type = irb_.getJType(elem_jty, kArray);
llvm::Value* array_elem_addr =
- EmitArrayGEP(array_addr, index_value, elem_type);
+ EmitArrayGEP(array_addr, index_value, elem_type, elem_jty);
llvm::Value* new_value = EmitLoadDalvikReg(dec_insn.vA_, elem_jty, kArray);
@@ -2869,7 +2884,7 @@ void MethodCompiler::EmitInsn_InvokeStaticDirect(uint32_t dex_pc,
bool is_static = (invoke_type == kStatic);
UniquePtr<OatCompilationUnit> callee_oatcompilation_unit(
- oatcompilation_unit_->GetCallee(callee_method_idx, is_static ? kAccStatic : 0));
+ oat_compilation_unit_->GetCallee(callee_method_idx, is_static ? kAccStatic : 0));
int vtable_idx = -1; // Currently unused
bool is_fast_path = compiler_->
@@ -3394,7 +3409,7 @@ EmitLoadMethodObjectAddrFromVTable(llvm::Value* vtable_addr,
irb_.getPtrEquivInt(static_cast<uint64_t>(vtable_index));
llvm::Value* method_field_addr =
- EmitArrayGEP(vtable_addr, vtable_index_value, irb_.getJObjectTy());
+ EmitArrayGEP(vtable_addr, vtable_index_value, irb_.getJObjectTy(), kObject);
return irb_.CreateLoad(method_field_addr);
}
@@ -3460,7 +3475,7 @@ EmitLoadDexCacheStaticStorageFieldAddr(uint32_t type_idx) {
llvm::Value* type_idx_value = irb_.getPtrEquivInt(type_idx);
return EmitArrayGEP(static_storage_dex_cache_addr, type_idx_value,
- irb_.getJObjectTy());
+ irb_.getJObjectTy(), kObject);
}
@@ -3472,7 +3487,7 @@ EmitLoadDexCacheResolvedTypeFieldAddr(uint32_t type_idx) {
llvm::Value* type_idx_value = irb_.getPtrEquivInt(type_idx);
return EmitArrayGEP(resolved_type_dex_cache_addr, type_idx_value,
- irb_.getJObjectTy());
+ irb_.getJObjectTy(), kObject);
}
@@ -3484,7 +3499,7 @@ EmitLoadDexCacheResolvedMethodFieldAddr(uint32_t method_idx) {
llvm::Value* method_idx_value = irb_.getPtrEquivInt(method_idx);
return EmitArrayGEP(resolved_method_dex_cache_addr, method_idx_value,
- irb_.getJObjectTy());
+ irb_.getJObjectTy(), kObject);
}
@@ -3496,7 +3511,7 @@ EmitLoadDexCacheStringFieldAddr(uint32_t string_idx) {
llvm::Value* string_idx_value = irb_.getPtrEquivInt(string_idx);
return EmitArrayGEP(string_dex_cache_addr, string_idx_value,
- irb_.getJObjectTy());
+ irb_.getJObjectTy(), kObject);
}
diff --git a/src/compiler_llvm/method_compiler.h b/src/compiler_llvm/method_compiler.h
index e75e945..0359fa2 100644
--- a/src/compiler_llvm/method_compiler.h
+++ b/src/compiler_llvm/method_compiler.h
@@ -334,7 +334,8 @@ class MethodCompiler {
llvm::Value* EmitArrayGEP(llvm::Value* array_addr,
llvm::Value* index_value,
- llvm::Type* elem_type);
+ llvm::Type* elem_type,
+ JType elem_jty);
llvm::Value* EmitLoadConstantClass(uint32_t dex_pc, uint32_t type_idx);