Add dex cache codegen helper function.
Change-Id: I02b0d3538dbbee03fb8837761b00ae1220d6902e
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index 7ddae88..7253cad 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -2324,6 +2324,78 @@
}
+llvm::Value* MethodCompiler::EmitLoadDexCacheAddr(MemberOffset offset) {
+ llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
+
+ llvm::Value* dex_cache_offset_value =
+ irb_.getPtrEquivInt(offset.Int32Value());
+
+ llvm::Value* dex_cache_field_addr =
+ irb_.CreatePtrDisp(method_object_addr, dex_cache_offset_value,
+ irb_.getJObjectTy()->getPointerTo());
+
+ return irb_.CreateLoad(dex_cache_field_addr);
+}
+
+
+void MethodCompiler::
+EmitLoadDexCacheCodeAndDirectMethodFieldAddr(llvm::Value*& code_field_addr,
+ llvm::Value*& method_field_addr,
+ uint32_t method_idx) {
+ llvm::Value* cadms_dex_cache_addr =
+ EmitLoadDexCacheAddr(Method::GetDexCacheCodeAndDirectMethodsOffset());
+
+ llvm::Value* code_index_value =
+ irb_.getPtrEquivInt(CodeAndDirectMethods::CodeIndex(method_idx));
+
+ llvm::Value* method_index_value =
+ irb_.getPtrEquivInt(CodeAndDirectMethods::MethodIndex(method_idx));
+
+ // Return the field address
+ code_field_addr = EmitArrayGEP(cadms_dex_cache_addr, code_index_value,
+ irb_.getJIntTy());
+
+ method_field_addr = EmitArrayGEP(cadms_dex_cache_addr, method_index_value,
+ irb_.getJIntTy());
+}
+
+
+llvm::Value* MethodCompiler::
+EmitLoadDexCacheStaticStorageFieldAddr(uint32_t type_idx) {
+ llvm::Value* static_storage_dex_cache_addr =
+ EmitLoadDexCacheAddr(Method::DexCacheInitializedStaticStorageOffset());
+
+ llvm::Value* type_idx_value = irb_.getPtrEquivInt(type_idx);
+
+ return EmitArrayGEP(static_storage_dex_cache_addr, type_idx_value,
+ irb_.getJObjectTy());
+}
+
+
+llvm::Value* MethodCompiler::
+EmitLoadDexCacheResolvedTypeFieldAddr(uint32_t type_idx) {
+ llvm::Value* resolved_type_dex_cache_addr =
+ EmitLoadDexCacheAddr(Method::DexCacheResolvedTypesOffset());
+
+ llvm::Value* type_idx_value = irb_.getPtrEquivInt(type_idx);
+
+ return EmitArrayGEP(resolved_type_dex_cache_addr, type_idx_value,
+ irb_.getJObjectTy());
+}
+
+
+llvm::Value* MethodCompiler::
+EmitLoadDexCacheStringFieldAddr(uint32_t string_idx) {
+ llvm::Value* string_dex_cache_addr =
+ EmitLoadDexCacheAddr(Method::DexCacheStringsOffset());
+
+ llvm::Value* string_idx_value = irb_.getPtrEquivInt(string_idx);
+
+ return EmitArrayGEP(string_dex_cache_addr, string_idx_value,
+ irb_.getJObjectTy());
+}
+
+
CompiledMethod *MethodCompiler::Compile() {
// Code generation
CreateFunction();