diff options
author | David Srbecky <dsrbecky@google.com> | 2015-04-08 12:30:18 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-04-08 12:30:19 +0000 |
commit | cde8e5da3e774a2494b051043130c0495eca09ef (patch) | |
tree | 634d8ae50583df30fd743ee1e1e6c97591e95484 /compiler/dex | |
parent | 8635e1886f3624154c076cf40cbf182c74e2e0e3 (diff) | |
parent | 8c57831b2b07185ee1986b9af68a351e1ca584c3 (diff) | |
download | art-cde8e5da3e774a2494b051043130c0495eca09ef.zip art-cde8e5da3e774a2494b051043130c0495eca09ef.tar.gz art-cde8e5da3e774a2494b051043130c0495eca09ef.tar.bz2 |
Merge "Remove the old CFI infrastructure."
Diffstat (limited to 'compiler/dex')
-rw-r--r-- | compiler/dex/quick/codegen_util.cc | 15 | ||||
-rw-r--r-- | compiler/dex/quick/mir_to_lir.h | 5 | ||||
-rw-r--r-- | compiler/dex/quick/x86/call_x86.cc | 7 | ||||
-rw-r--r-- | compiler/dex/quick/x86/codegen_x86.h | 12 | ||||
-rwxr-xr-x | compiler/dex/quick/x86/target_x86.cc | 96 |
5 files changed, 4 insertions, 131 deletions
diff --git a/compiler/dex/quick/codegen_util.cc b/compiler/dex/quick/codegen_util.cc index c51046e..232a228 100644 --- a/compiler/dex/quick/codegen_util.cc +++ b/compiler/dex/quick/codegen_util.cc @@ -1156,14 +1156,6 @@ CompiledMethod* Mir2Lir::GetCompiledMethod() { return lhs.LiteralOffset() < rhs.LiteralOffset(); }); - std::unique_ptr<std::vector<uint8_t>> cfi_info( - cu_->compiler_driver->GetCompilerOptions().GetGenerateGDBInformation() ? - ReturnFrameDescriptionEntry() : - nullptr); - ArrayRef<const uint8_t> cfi_ref; - if (cfi_info.get() != nullptr) { - cfi_ref = ArrayRef<const uint8_t>(*cfi_info); - } return CompiledMethod::SwapAllocCompiledMethod( cu_->compiler_driver, cu_->instruction_set, ArrayRef<const uint8_t>(code_buffer_), @@ -1172,7 +1164,7 @@ CompiledMethod* Mir2Lir::GetCompiledMethod() { ArrayRef<const uint8_t>(encoded_mapping_table_), ArrayRef<const uint8_t>(vmap_encoder.GetData()), ArrayRef<const uint8_t>(native_gc_map_), - cfi_ref, + ArrayRef<const uint8_t>(), ArrayRef<const LinkerPatch>(patches_)); } @@ -1334,11 +1326,6 @@ void Mir2Lir::OpPcRelDexCacheArrayLoad(const DexFile* dex_file ATTRIBUTE_UNUSED, UNREACHABLE(); } -std::vector<uint8_t>* Mir2Lir::ReturnFrameDescriptionEntry() { - // Default case is to do nothing. - return nullptr; -} - RegLocation Mir2Lir::NarrowRegLoc(RegLocation loc) { if (loc.location == kLocPhysReg) { DCHECK(!loc.reg.Is32Bit()); diff --git a/compiler/dex/quick/mir_to_lir.h b/compiler/dex/quick/mir_to_lir.h index 45a5855..1624c84 100644 --- a/compiler/dex/quick/mir_to_lir.h +++ b/compiler/dex/quick/mir_to_lir.h @@ -1573,11 +1573,6 @@ class Mir2Lir { bool can_assume_type_is_in_dex_cache, uint32_t type_idx, RegLocation rl_dest, RegLocation rl_src); - /* - * @brief Generate the eh_frame FDE information if possible. - * @returns pointer to vector containg FDE information, or NULL. - */ - virtual std::vector<uint8_t>* ReturnFrameDescriptionEntry(); /** * @brief Used to insert marker that can be used to associate MIR with LIR. diff --git a/compiler/dex/quick/x86/call_x86.cc b/compiler/dex/quick/x86/call_x86.cc index fd23692..18fae17 100644 --- a/compiler/dex/quick/x86/call_x86.cc +++ b/compiler/dex/quick/x86/call_x86.cc @@ -184,8 +184,7 @@ void X86Mir2Lir::GenEntrySequence(RegLocation* ArgLocs, RegLocation rl_method) { } /* Build frame, return address already on stack */ - stack_decrement_ = OpRegImm(kOpSub, rs_rSP, frame_size_ - - GetInstructionSetPointerSize(cu_->instruction_set)); + OpRegImm(kOpSub, rs_rSP, frame_size_ - GetInstructionSetPointerSize(cu_->instruction_set)); /* Spill core callee saves */ SpillCoreRegs(); @@ -263,8 +262,8 @@ void X86Mir2Lir::GenExitSequence() { UnSpillFPRegs(); /* Remove frame except for return address */ const RegStorage rs_rSP = cu_->target64 ? rs_rX86_SP_64 : rs_rX86_SP_32; - stack_increment_ = OpRegImm(kOpAdd, rs_rSP, - frame_size_ - GetInstructionSetPointerSize(cu_->instruction_set)); + int adjust = frame_size_ - GetInstructionSetPointerSize(cu_->instruction_set); + OpRegImm(kOpAdd, rs_rSP, adjust); NewLIR0(kX86Ret); } diff --git a/compiler/dex/quick/x86/codegen_x86.h b/compiler/dex/quick/x86/codegen_x86.h index 758684e..a98a99e 100644 --- a/compiler/dex/quick/x86/codegen_x86.h +++ b/compiler/dex/quick/x86/codegen_x86.h @@ -380,12 +380,6 @@ class X86Mir2Lir : public Mir2Lir { */ void InstallLiteralPools() OVERRIDE; - /* - * @brief Generate the debug_frame FDE information. - * @returns pointer to vector containing CFE information - */ - std::vector<uint8_t>* ReturnFrameDescriptionEntry() OVERRIDE; - LIR* InvokeTrampoline(OpKind op, RegStorage r_tgt, QuickEntrypointEnum trampoline) OVERRIDE; protected: @@ -958,12 +952,6 @@ class X86Mir2Lir : public Mir2Lir { // Instructions needing patching with PC relative code addresses. ArenaVector<LIR*> dex_cache_access_insns_; - // Prologue decrement of stack pointer. - LIR* stack_decrement_; - - // Epilogue increment of stack pointer. - LIR* stack_increment_; - // The list of const vector literals. LIR* const_vectors_; diff --git a/compiler/dex/quick/x86/target_x86.cc b/compiler/dex/quick/x86/target_x86.cc index cad82a1..081f80f 100755 --- a/compiler/dex/quick/x86/target_x86.cc +++ b/compiler/dex/quick/x86/target_x86.cc @@ -32,7 +32,6 @@ #include "mirror/string.h" #include "oat.h" #include "x86_lir.h" -#include "utils/dwarf_cfi.h" namespace art { @@ -830,7 +829,6 @@ X86Mir2Lir::X86Mir2Lir(CompilationUnit* cu, MIRGraph* mir_graph, ArenaAllocator* class_type_address_insns_(arena->Adapter()), call_method_insns_(arena->Adapter()), dex_cache_access_insns_(arena->Adapter()), - stack_decrement_(nullptr), stack_increment_(nullptr), const_vectors_(nullptr) { method_address_insns_.reserve(100); class_type_address_insns_.reserve(100); @@ -1426,100 +1424,6 @@ bool X86Mir2Lir::GenInlinedIndexOf(CallInfo* info, bool zero_based) { return true; } -static bool ARTRegIDToDWARFRegID(bool is_x86_64, int art_reg_id, int* dwarf_reg_id) { - if (is_x86_64) { - switch (art_reg_id) { - case 3 : *dwarf_reg_id = 3; return true; // %rbx - // This is the only discrepancy between ART & DWARF register numbering. - case 5 : *dwarf_reg_id = 6; return true; // %rbp - case 12: *dwarf_reg_id = 12; return true; // %r12 - case 13: *dwarf_reg_id = 13; return true; // %r13 - case 14: *dwarf_reg_id = 14; return true; // %r14 - case 15: *dwarf_reg_id = 15; return true; // %r15 - default: return false; // Should not get here - } - } else { - switch (art_reg_id) { - case 5: *dwarf_reg_id = 5; return true; // %ebp - case 6: *dwarf_reg_id = 6; return true; // %esi - case 7: *dwarf_reg_id = 7; return true; // %edi - default: return false; // Should not get here - } - } -} - -std::vector<uint8_t>* X86Mir2Lir::ReturnFrameDescriptionEntry() { - std::vector<uint8_t>* cfi_info = new std::vector<uint8_t>; - - // Generate the FDE for the method. - DCHECK_NE(data_offset_, 0U); - - WriteFDEHeader(cfi_info, cu_->target64); - WriteFDEAddressRange(cfi_info, data_offset_, cu_->target64); - - // The instructions in the FDE. - if (stack_decrement_ != nullptr) { - // Advance LOC to just past the stack decrement. - uint32_t pc = NEXT_LIR(stack_decrement_)->offset; - DW_CFA_advance_loc(cfi_info, pc); - - // Now update the offset to the call frame: DW_CFA_def_cfa_offset frame_size. - DW_CFA_def_cfa_offset(cfi_info, frame_size_); - - // Handle register spills - const uint32_t kSpillInstLen = (cu_->target64) ? 5 : 4; - const int kDataAlignmentFactor = (cu_->target64) ? -8 : -4; - uint32_t mask = core_spill_mask_ & ~(1 << rs_rRET.GetRegNum()); - int offset = -(GetInstructionSetPointerSize(cu_->instruction_set) * num_core_spills_); - for (int reg = 0; mask; mask >>= 1, reg++) { - if (mask & 0x1) { - pc += kSpillInstLen; - - // Advance LOC to pass this instruction - DW_CFA_advance_loc(cfi_info, kSpillInstLen); - - int dwarf_reg_id; - if (ARTRegIDToDWARFRegID(cu_->target64, reg, &dwarf_reg_id)) { - // DW_CFA_offset_extended_sf reg offset - DW_CFA_offset_extended_sf(cfi_info, dwarf_reg_id, offset / kDataAlignmentFactor); - } - - offset += GetInstructionSetPointerSize(cu_->instruction_set); - } - } - - // We continue with that stack until the epilogue. - if (stack_increment_ != nullptr) { - uint32_t new_pc = NEXT_LIR(stack_increment_)->offset; - DW_CFA_advance_loc(cfi_info, new_pc - pc); - - // We probably have code snippets after the epilogue, so save the - // current state: DW_CFA_remember_state. - DW_CFA_remember_state(cfi_info); - - // We have now popped the stack: DW_CFA_def_cfa_offset 4/8. - // There is only the return PC on the stack now. - DW_CFA_def_cfa_offset(cfi_info, GetInstructionSetPointerSize(cu_->instruction_set)); - - // Everything after that is the same as before the epilogue. - // Stack bump was followed by RET instruction. - LIR *post_ret_insn = NEXT_LIR(NEXT_LIR(stack_increment_)); - if (post_ret_insn != nullptr) { - pc = new_pc; - new_pc = post_ret_insn->offset; - DW_CFA_advance_loc(cfi_info, new_pc - pc); - // Restore the state: DW_CFA_restore_state. - DW_CFA_restore_state(cfi_info); - } - } - } - - PadCFI(cfi_info); - WriteCFILength(cfi_info, cu_->target64); - - return cfi_info; -} - void X86Mir2Lir::GenMachineSpecificExtendedMethodMIR(BasicBlock* bb, MIR* mir) { switch (static_cast<ExtendedMIROpcode>(mir->dalvikInsn.opcode)) { case kMirOpReserveVectorRegisters: |