From 19c350a9197411d427b71b7ab15b18417701de10 Mon Sep 17 00:00:00 2001 From: Logan Chien Date: Tue, 1 May 2012 19:21:32 +0800 Subject: Move payload data structures to dex_instruction.h. Change-Id: Ib46aab7bac70b008bf8569e3e9e30caa31320255 --- src/compiler_llvm/method_compiler.cc | 61 +++++++++++++----------------------- src/dex_file.h | 9 ------ src/dex_instruction.h | 36 +++++++++++++++++++++ src/oat/runtime/support_fillarray.cc | 3 +- 4 files changed, 60 insertions(+), 49 deletions(-) diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc index f9a2833041..2c0fef146e 100644 --- a/src/compiler_llvm/method_compiler.cc +++ b/src/compiler_llvm/method_compiler.cc @@ -1886,35 +1886,29 @@ void MethodCompiler::EmitInsn_FillArrayData(uint32_t dex_pc, DecodedInstruction dec_insn(insn); // Read the payload - struct PACKED Payload { - uint16_t ident_; - uint16_t elem_width_; - uint32_t num_elems_; - uint8_t data_[]; - }; - int32_t payload_offset = static_cast(dex_pc) + static_cast(dec_insn.vB); - Payload const* payload = - reinterpret_cast(code_item_->insns_ + payload_offset); + const Instruction::ArrayDataPayload* payload = + reinterpret_cast( + code_item_->insns_ + payload_offset); - uint32_t size_in_bytes = payload->elem_width_ * payload->num_elems_; + uint32_t size_in_bytes = payload->element_width * payload->element_count; // Load and check the array llvm::Value* array_addr = EmitLoadDalvikReg(dec_insn.vA, kObject, kAccurate); EmitGuard_NullPointerException(dex_pc, array_addr); - if (payload->num_elems_ > 0) { + if (payload->element_count > 0) { // Test: Is array length big enough? - llvm::Constant* last_index = irb_.getJInt(payload->num_elems_ - 1); + llvm::Constant* last_index = irb_.getJInt(payload->element_count - 1); EmitGuard_ArrayIndexOutOfBoundsException(dex_pc, array_addr, last_index); // Get array data field llvm::Value* data_field_offset_value = - irb_.getPtrEquivInt(Array::DataOffset(payload->elem_width_).Int32Value()); + irb_.getPtrEquivInt(Array::DataOffset(payload->element_width).Int32Value()); llvm::Value* data_field_addr = irb_.CreatePtrDisp(array_addr, data_field_offset_value, @@ -1923,7 +1917,7 @@ void MethodCompiler::EmitInsn_FillArrayData(uint32_t dex_pc, // Emit payload to bitcode constant pool std::vector const_pool_data; for (uint32_t i = 0; i < size_in_bytes; ++i) { - const_pool_data.push_back(irb_.getInt8(payload->data_[i])); + const_pool_data.push_back(irb_.getInt8(payload->data[i])); } llvm::Constant* const_pool_data_array_value = llvm::ConstantArray::get( @@ -1985,27 +1979,21 @@ void MethodCompiler::EmitInsn_PackedSwitch(uint32_t dex_pc, DecodedInstruction dec_insn(insn); - struct PACKED Payload { - uint16_t ident_; - uint16_t num_cases_; - int32_t first_key_; - int32_t targets_[]; - }; - int32_t payload_offset = static_cast(dex_pc) + static_cast(dec_insn.vB); - Payload const* payload = - reinterpret_cast(code_item_->insns_ + payload_offset); + const Instruction::PackedSwitchPayload* payload = + reinterpret_cast( + code_item_->insns_ + payload_offset); llvm::Value* value = EmitLoadDalvikReg(dec_insn.vA, kInt, kAccurate); llvm::SwitchInst* sw = - irb_.CreateSwitch(value, GetNextBasicBlock(dex_pc), payload->num_cases_); + irb_.CreateSwitch(value, GetNextBasicBlock(dex_pc), payload->case_count); - for (uint16_t i = 0; i < payload->num_cases_; ++i) { - sw->addCase(irb_.getInt32(payload->first_key_ + i), - GetBasicBlock(dex_pc + payload->targets_[i])); + for (uint16_t i = 0; i < payload->case_count; ++i) { + sw->addCase(irb_.getInt32(payload->first_key + i), + GetBasicBlock(dex_pc + payload->targets[i])); } } @@ -2015,27 +2003,22 @@ void MethodCompiler::EmitInsn_SparseSwitch(uint32_t dex_pc, DecodedInstruction dec_insn(insn); - struct PACKED Payload { - uint16_t ident_; - uint16_t num_cases_; - int32_t keys_and_targets_[]; - }; - int32_t payload_offset = static_cast(dex_pc) + static_cast(dec_insn.vB); - Payload const* payload = - reinterpret_cast(code_item_->insns_ + payload_offset); + const Instruction::SparseSwitchPayload* payload = + reinterpret_cast( + code_item_->insns_ + payload_offset); - int32_t const* keys = payload->keys_and_targets_; - int32_t const* targets = payload->keys_and_targets_ + payload->num_cases_; + const int32_t* keys = payload->GetKeys(); + const int32_t* targets = payload->GetTargets(); llvm::Value* value = EmitLoadDalvikReg(dec_insn.vA, kInt, kAccurate); llvm::SwitchInst* sw = - irb_.CreateSwitch(value, GetNextBasicBlock(dex_pc), payload->num_cases_); + irb_.CreateSwitch(value, GetNextBasicBlock(dex_pc), payload->case_count); - for (size_t i = 0; i < payload->num_cases_; ++i) { + for (size_t i = 0; i < payload->case_count; ++i) { sw->addCase(irb_.getInt32(keys[i]), GetBasicBlock(dex_pc + targets[i])); } } diff --git a/src/dex_file.h b/src/dex_file.h index aeb7e89efd..29ce08700f 100644 --- a/src/dex_file.h +++ b/src/dex_file.h @@ -307,15 +307,6 @@ class DexFile { DISALLOW_COPY_AND_ASSIGN(AnnotationItem); }; - struct PACKED Payload { - uint16_t ident; // kPackedSwitchSignature, kSparseSwitchSignature, or kArrayDataSignature. - uint16_t element_width; - uint32_t element_count; - uint8_t data[]; - private: - DISALLOW_COPY_AND_ASSIGN(Payload); - }; - typedef std::pair ClassPathEntry; typedef std::vector ClassPath; diff --git a/src/dex_instruction.h b/src/dex_instruction.h index 278a61d29d..b33b0017ae 100644 --- a/src/dex_instruction.h +++ b/src/dex_instruction.h @@ -38,6 +38,42 @@ class Instruction { kArrayDataSignature = 0x0300, }; + struct PACKED PackedSwitchPayload { + const uint16_t ident; + const uint16_t case_count; + const int32_t first_key; + const int32_t targets[]; + private: + DISALLOW_COPY_AND_ASSIGN(PackedSwitchPayload); + }; + + struct PACKED SparseSwitchPayload { + const uint16_t ident; + const uint16_t case_count; + const int32_t keys_and_targets[]; + + public: + const int32_t* GetKeys() const { + return keys_and_targets; + } + + const int32_t* GetTargets() const { + return keys_and_targets + case_count; + } + + private: + DISALLOW_COPY_AND_ASSIGN(SparseSwitchPayload); + }; + + struct PACKED ArrayDataPayload { + const uint16_t ident; + const uint16_t element_width; + const uint32_t element_count; + const uint8_t data[]; + private: + DISALLOW_COPY_AND_ASSIGN(ArrayDataPayload); + }; + enum Code { #define INSTRUCTION_ENUM(opcode, cname, p, f, r, i, a, v) cname = opcode, #include "dex_instruction_list.h" diff --git a/src/oat/runtime/support_fillarray.cc b/src/oat/runtime/support_fillarray.cc index 6f40177713..7227f6ba13 100644 --- a/src/oat/runtime/support_fillarray.cc +++ b/src/oat/runtime/support_fillarray.cc @@ -35,7 +35,8 @@ namespace art { * ubyte data[size*width] table of data values (may contain a single-byte * padding at the end) */ -extern "C" int artHandleFillArrayDataFromCode(Array* array, const DexFile::Payload* payload, +extern "C" int artHandleFillArrayDataFromCode(Array* array, + const Instruction::ArrayDataPayload* payload, Thread* self, Method** sp) { FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly); DCHECK_EQ(payload->ident, static_cast(Instruction::kArrayDataSignature)); -- cgit v1.2.3-59-g8ed1b