Refactor dalvik_reg.
Also, fix ComputeMethodInfo, ARRAY_LENGTH may throw exception.
Don't store arguments to shadow frame, it already existed in the
caller's shadow frame.
Change-Id: I184a93ed7f3caea924514d425e6a00dc60464f90
diff --git a/src/compiler_llvm/method_compiler.h b/src/compiler_llvm/method_compiler.h
index 50411a1..6de50ed 100644
--- a/src/compiler_llvm/method_compiler.h
+++ b/src/compiler_llvm/method_compiler.h
@@ -18,7 +18,6 @@
#define ART_SRC_COMPILER_LLVM_METHOD_COMPILER_H_
#include "backend_types.h"
-#include "dalvik_reg.h"
#include "dex_file.h"
#include "dex_instruction.h"
#include "invoke_type.h"
@@ -59,6 +58,7 @@
class CompilationUnit;
class CompilerLLVM;
+class DalvikReg;
class IRBuilder;
class MethodCompiler {
@@ -81,11 +81,9 @@
// Register helper function
- llvm::Value* AllocDalvikLocalVarReg(RegCategory cat, uint32_t reg_idx);
+ llvm::Value* AllocDalvikReg(RegCategory cat, const std::string& name);
- llvm::Value* AllocShadowFrameEntry(uint32_t reg_idx);
-
- llvm::Value* AllocDalvikRetValReg(RegCategory cat);
+ llvm::Value* GetShadowFrameEntry(uint32_t reg_idx);
private:
@@ -395,43 +393,23 @@
// Register helper function
- llvm::Value* EmitLoadDalvikReg(uint32_t reg_idx, JType jty,
- JTypeSpace space) {
- return regs_[reg_idx]->GetValue(jty, space);
- }
+ llvm::Value* EmitLoadDalvikReg(uint32_t reg_idx, JType jty, JTypeSpace space);
- llvm::Value* EmitLoadDalvikReg(uint32_t reg_idx, char shorty,
- JTypeSpace space) {
- return EmitLoadDalvikReg(reg_idx, GetJTypeFromShorty(shorty), space);
- }
+ llvm::Value* EmitLoadDalvikReg(uint32_t reg_idx, char shorty, JTypeSpace space);
void EmitStoreDalvikReg(uint32_t reg_idx, JType jty,
- JTypeSpace space, llvm::Value* new_value) {
- regs_[reg_idx]->SetValue(jty, space, new_value);
- }
+ JTypeSpace space, llvm::Value* new_value);
void EmitStoreDalvikReg(uint32_t reg_idx, char shorty,
- JTypeSpace space, llvm::Value* new_value) {
- EmitStoreDalvikReg(reg_idx, GetJTypeFromShorty(shorty), space, new_value);
- }
+ JTypeSpace space, llvm::Value* new_value);
- llvm::Value* EmitLoadDalvikRetValReg(JType jty, JTypeSpace space) {
- return retval_reg_->GetValue(jty, space);
- }
+ llvm::Value* EmitLoadDalvikRetValReg(JType jty, JTypeSpace space);
- llvm::Value* EmitLoadDalvikRetValReg(char shorty, JTypeSpace space) {
- return EmitLoadDalvikRetValReg(GetJTypeFromShorty(shorty), space);
- }
+ llvm::Value* EmitLoadDalvikRetValReg(char shorty, JTypeSpace space);
- void EmitStoreDalvikRetValReg(JType jty, JTypeSpace space,
- llvm::Value* new_value) {
- retval_reg_->SetValue(jty, space, new_value);
- }
+ void EmitStoreDalvikRetValReg(JType jty, JTypeSpace space, llvm::Value* new_value);
- void EmitStoreDalvikRetValReg(char shorty, JTypeSpace space,
- llvm::Value* new_value) {
- EmitStoreDalvikRetValReg(GetJTypeFromShorty(shorty), space, new_value);
- }
+ void EmitStoreDalvikRetValReg(char shorty, JTypeSpace space, llvm::Value* new_value);
// TODO: Use high-level IR to do this
bool EmitInlineJavaIntrinsic(const std::string& callee_method_name,
@@ -477,6 +455,7 @@
llvm::Function* func_;
std::vector<DalvikReg*> regs_;
+ std::vector<llvm::Value*> shadow_frame_entries_;
std::vector<int32_t> reg_to_shadow_frame_index_;
UniquePtr<DalvikReg> retval_reg_;