diff options
author | Calin Juravle <calin@google.com> | 2015-09-08 19:56:31 +0100 |
---|---|---|
committer | Calin Juravle <calin@google.com> | 2015-09-17 12:29:59 +0100 |
commit | 23a8e35481face09183a24b9d11e505597c75ebb (patch) | |
tree | bcaafb6ea001349acbf160c2cc89334fab4a38dc /compiler/optimizing/code_generator.h | |
parent | 175dc732c80e6f2afd83209348124df349290ba8 (diff) |
Support unresolved fields in optimizing
Change-Id: I9941fa5fcb6ef0a7a253c7a0b479a44a0210aad4
Diffstat (limited to 'compiler/optimizing/code_generator.h')
-rw-r--r-- | compiler/optimizing/code_generator.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h index a54dbf1506..11478a4bcf 100644 --- a/compiler/optimizing/code_generator.h +++ b/compiler/optimizing/code_generator.h @@ -136,6 +136,22 @@ class InvokeDexCallingConventionVisitor { DISALLOW_COPY_AND_ASSIGN(InvokeDexCallingConventionVisitor); }; +class FieldAccessCallingConvetion { + public: + virtual Location GetObjectLocation() const = 0; + virtual Location GetFieldIndexLocation() const = 0; + virtual Location GetReturnLocation(Primitive::Type type) const = 0; + virtual Location GetSetValueLocation(Primitive::Type type, bool is_instance) const = 0; + virtual Location GetFpuLocation(Primitive::Type type) const = 0; + virtual ~FieldAccessCallingConvetion() {} + + protected: + FieldAccessCallingConvetion() {} + + private: + DISALLOW_COPY_AND_ASSIGN(FieldAccessCallingConvetion); +}; + class CodeGenerator { public: // Compiles the graph to executable instructions. Returns whether the compilation @@ -170,6 +186,16 @@ class CodeGenerator { virtual void Bind(HBasicBlock* block) = 0; virtual void Move(HInstruction* instruction, Location location, HInstruction* move_for) = 0; virtual void MoveConstant(Location destination, int32_t value) = 0; + virtual void AddLocationAsTemp(Location location, LocationSummary* locations) = 0; + virtual void MoveLocationToTemp(Location source, + const LocationSummary& locations, + int temp_index, + Primitive::Type type) = 0; + virtual void MoveTempToLocation(const LocationSummary& locations, + int temp_index, + Location destination, + Primitive::Type type) = 0; + virtual Assembler* GetAssembler() = 0; virtual const Assembler& GetAssembler() const = 0; virtual size_t GetWordSize() const = 0; @@ -378,6 +404,16 @@ class CodeGenerator { void GenerateInvokeUnresolvedRuntimeCall(HInvokeUnresolved* invoke); + void CreateUnresolvedFieldLocationSummary( + HInstruction* field_access, + Primitive::Type field_type, + const FieldAccessCallingConvetion& calling_convention); + + void GenerateUnresolvedFieldAccess(HInstruction* field_access, + Primitive::Type field_type, + uint32_t field_index, + uint32_t dex_pc); + void SetDisassemblyInformation(DisassemblyInformation* info) { disasm_info_ = info; } DisassemblyInformation* GetDisassemblyInformation() const { return disasm_info_; } |