diff options
Diffstat (limited to 'src/compiled_method.cc')
-rw-r--r-- | src/compiled_method.cc | 156 |
1 files changed, 65 insertions, 91 deletions
diff --git a/src/compiled_method.cc b/src/compiled_method.cc index 4b3cdeea60..b0285fdd04 100644 --- a/src/compiled_method.cc +++ b/src/compiled_method.cc @@ -18,6 +18,60 @@ namespace art { +uint32_t CompiledCode::AlignCode(uint32_t offset) const { + return AlignCode(offset, instruction_set_); +} + +uint32_t CompiledCode::AlignCode(uint32_t offset, InstructionSet instruction_set) { + switch (instruction_set) { + case kArm: + case kThumb2: + return RoundUp(offset, kArmAlignment); + case kMips: + return RoundUp(offset, kMipsAlignment); + case kX86: + return RoundUp(offset, kX86Alignment); + default: + LOG(FATAL) << "Unknown InstructionSet: " << instruction_set; + return 0; + } +} + +size_t CompiledCode::CodeDelta() const { + switch (instruction_set_) { + case kArm: + case kMips: + case kX86: + return 0; + case kThumb2: { + // +1 to set the low-order bit so a BLX will switch to Thumb mode + return 1; + } + default: + LOG(FATAL) << "Unknown InstructionSet: " << instruction_set_; + return 0; + } +} + +const void* CompiledCode::CodePointer(const void* code_pointer, + InstructionSet instruction_set) { + switch (instruction_set) { + case kArm: + case kMips: + case kX86: + return code_pointer; + case kThumb2: { + uintptr_t address = reinterpret_cast<uintptr_t>(code_pointer); + // Set the low-order bit so a BLX will switch to Thumb mode + address |= 0x1; + return reinterpret_cast<const void*>(address); + } + default: + LOG(FATAL) << "Unknown InstructionSet: " << instruction_set; + return NULL; + } +} + CompiledMethod::CompiledMethod(InstructionSet instruction_set, const std::vector<uint8_t>& code, const size_t frame_size_in_bytes, @@ -25,9 +79,8 @@ CompiledMethod::CompiledMethod(InstructionSet instruction_set, const uint32_t fp_spill_mask, const std::vector<uint32_t>& mapping_table, const std::vector<uint16_t>& vmap_table) - : instruction_set_(instruction_set), frame_size_in_bytes_(frame_size_in_bytes), - core_spill_mask_(core_spill_mask), fp_spill_mask_(fp_spill_mask), - elf_idx_(-1) + : CompiledCode(instruction_set), frame_size_in_bytes_(frame_size_in_bytes), + core_spill_mask_(core_spill_mask), fp_spill_mask_(fp_spill_mask) { CHECK_NE(code.size(), 0U); DCHECK_EQ(vmap_table.size(), @@ -54,7 +107,7 @@ CompiledMethod::CompiledMethod(InstructionSet instruction_set, DCHECK_EQ(vmap_table.size() + 1, length_prefixed_vmap_table.size()); DCHECK_EQ(vmap_table.size(), length_prefixed_vmap_table[0]); - code_ = byte_code; + SetCode(byte_code); mapping_table_ = length_prefixed_mapping_table; vmap_table_ = length_prefixed_vmap_table; DCHECK_EQ(vmap_table_[0], static_cast<uint32_t>(__builtin_popcount(core_spill_mask) + __builtin_popcount(fp_spill_mask))); @@ -76,31 +129,13 @@ CompiledMethod::CompiledMethod(InstructionSet instruction_set, const size_t frame_size_in_bytes, const uint32_t core_spill_mask, const uint32_t fp_spill_mask) - : instruction_set_(instruction_set), code_(code), frame_size_in_bytes_(frame_size_in_bytes), - core_spill_mask_(core_spill_mask), fp_spill_mask_(fp_spill_mask), - elf_idx_(-1) -{ - CHECK_NE(code.size(), 0U); -} - -CompiledMethod::CompiledMethod(InstructionSet instruction_set, - const uint16_t elf_idx, - const uint16_t elf_func_idx) - : instruction_set_(instruction_set), frame_size_in_bytes_(0), - core_spill_mask_(0), fp_spill_mask_(0), elf_idx_(elf_idx), - elf_func_idx_(elf_func_idx) { + : CompiledCode(instruction_set, code), + frame_size_in_bytes_(frame_size_in_bytes), + core_spill_mask_(core_spill_mask), fp_spill_mask_(fp_spill_mask) { } CompiledMethod::~CompiledMethod() {} -InstructionSet CompiledMethod::GetInstructionSet() const { - return instruction_set_; -} - -const std::vector<uint8_t>& CompiledMethod::GetCode() const { - return code_; -} - size_t CompiledMethod::GetFrameSizeInBytes() const { return frame_size_in_bytes_; } @@ -125,76 +160,15 @@ const std::vector<uint8_t>& CompiledMethod::GetGcMap() const { return gc_map_; } -uint32_t CompiledMethod::AlignCode(uint32_t offset) const { - return AlignCode(offset, instruction_set_); +CompiledInvokeStub::CompiledInvokeStub(InstructionSet instruction_set) + : CompiledCode(instruction_set) { } -uint32_t CompiledMethod::AlignCode(uint32_t offset, InstructionSet instruction_set) { - switch (instruction_set) { - case kArm: - case kThumb2: - return RoundUp(offset, kArmAlignment); - case kMips: - return RoundUp(offset, kMipsAlignment); - case kX86: - return RoundUp(offset, kX86Alignment); - default: - LOG(FATAL) << "Unknown InstructionSet: " << instruction_set; - return 0; - } -} - -size_t CompiledMethod::CodeDelta() const { - switch (instruction_set_) { - case kArm: - case kMips: - case kX86: - return 0; - case kThumb2: { - // +1 to set the low-order bit so a BLX will switch to Thumb mode - return 1; - } - default: - LOG(FATAL) << "Unknown InstructionSet: " << instruction_set_; - return 0; - } -} - -const void* CompiledMethod::CodePointer(const void* code_pointer, - InstructionSet instruction_set) { - switch (instruction_set) { - case kArm: - case kMips: - case kX86: - return code_pointer; - case kThumb2: { - uintptr_t address = reinterpret_cast<uintptr_t>(code_pointer); - // Set the low-order bit so a BLX will switch to Thumb mode - address |= 0x1; - return reinterpret_cast<const void*>(address); - } - default: - LOG(FATAL) << "Unknown InstructionSet: " << instruction_set; - return NULL; - } -} - -#if defined(ART_USE_LLVM_COMPILER) -CompiledInvokeStub::CompiledInvokeStub(uint16_t elf_idx, uint16_t elf_func_idx) - : elf_idx_(elf_idx), elf_func_idx_(elf_func_idx) { -} -#endif - -CompiledInvokeStub::CompiledInvokeStub(std::vector<uint8_t>& code) - : elf_idx_(-1), elf_func_idx_(-1) { - CHECK_NE(code.size(), 0U); - code_ = code; +CompiledInvokeStub::CompiledInvokeStub(InstructionSet instruction_set, + const std::vector<uint8_t>& code) + : CompiledCode(instruction_set, code) { } CompiledInvokeStub::~CompiledInvokeStub() {} -const std::vector<uint8_t>& CompiledInvokeStub::GetCode() const { - return code_; -} - } // namespace art |