Add CompiledCode for method and invoke stub.
CompiledCode is the base class of CompiledMethod and
CompiledInvokeStub with a code array and an
instruction set field.
Change-Id: I4eca9b9b682b14732c8fa80d44587a7e621ab54d
diff --git a/src/compiled_method.cc b/src/compiled_method.cc
index 4b3cdee..b0285fd 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 @@
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 @@
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 @@
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 @@
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