diff options
Diffstat (limited to 'lldb/source/Symbol/DWARFCallFrameInfo.cpp')
| -rw-r--r-- | lldb/source/Symbol/DWARFCallFrameInfo.cpp | 207 |
1 files changed, 97 insertions, 110 deletions
diff --git a/lldb/source/Symbol/DWARFCallFrameInfo.cpp b/lldb/source/Symbol/DWARFCallFrameInfo.cpp index 572648d05f0..1bf9ff99e01 100644 --- a/lldb/source/Symbol/DWARFCallFrameInfo.cpp +++ b/lldb/source/Symbol/DWARFCallFrameInfo.cpp @@ -27,8 +27,8 @@ using namespace lldb_private; //---------------------------------------------------------------------- // GetDwarfEHPtr // -// Used for calls when the value type is specified by a DWARF EH Frame -// pointer encoding. +// Used for calls when the value type is specified by a DWARF EH Frame pointer +// encoding. //---------------------------------------------------------------------- static uint64_t GetGNUEHPointer(const DataExtractor &DE, offset_t *offset_ptr, @@ -83,8 +83,8 @@ GetGNUEHPointer(const DataExtractor &DE, offset_t *offset_ptr, break; case DW_EH_PE_aligned: { - // SetPointerSize should be called prior to extracting these so the - // pointer size is cached + // SetPointerSize should be called prior to extracting these so the pointer + // size is cached assert(addr_size != 0); if (addr_size) { // Align to a address size boundary first @@ -154,8 +154,8 @@ DWARFCallFrameInfo::DWARFCallFrameInfo(ObjectFile &objfile, bool DWARFCallFrameInfo::GetUnwindPlan(Address addr, UnwindPlan &unwind_plan) { FDEEntryMap::Entry fde_entry; - // Make sure that the Address we're searching for is the same object file - // as this DWARFCallFrameInfo, we only store File offsets in m_fde_index. + // Make sure that the Address we're searching for is the same object file as + // this DWARFCallFrameInfo, we only store File offsets in m_fde_index. ModuleSP module_sp = addr.GetModule(); if (module_sp.get() == nullptr || module_sp->GetObjectFile() == nullptr || module_sp->GetObjectFile() != &m_objfile) @@ -168,8 +168,8 @@ bool DWARFCallFrameInfo::GetUnwindPlan(Address addr, UnwindPlan &unwind_plan) { bool DWARFCallFrameInfo::GetAddressRange(Address addr, AddressRange &range) { - // Make sure that the Address we're searching for is the same object file - // as this DWARFCallFrameInfo, we only store File offsets in m_fde_index. + // Make sure that the Address we're searching for is the same object file as + // this DWARFCallFrameInfo, we only store File offsets in m_fde_index. ModuleSP module_sp = addr.GetModule(); if (module_sp.get() == nullptr || module_sp->GetObjectFile() == nullptr || module_sp->GetObjectFile() != &m_objfile) @@ -291,8 +291,8 @@ DWARFCallFrameInfo::ParseCIE(const dw_offset_t cie_offset) { return nullptr; } - // m_cfi_data uses address size from target architecture of the process - // may ignore these fields? + // m_cfi_data uses address size from target architecture of the process may + // ignore these fields? if (m_type == DWARF && cie_sp->version >= CFI_VERSION4) { cie_sp->address_size = m_cfi_data.GetU8(&offset); cie_sp->segment_size = m_cfi_data.GetU8(&offset); @@ -307,15 +307,15 @@ DWARFCallFrameInfo::ParseCIE(const dw_offset_t cie_offset) { : m_cfi_data.GetU8(&offset); if (cie_sp->augmentation[0]) { - // Get the length of the eh_frame augmentation data - // which starts with a ULEB128 length in bytes + // Get the length of the eh_frame augmentation data which starts with a + // ULEB128 length in bytes const size_t aug_data_len = (size_t)m_cfi_data.GetULEB128(&offset); const size_t aug_data_end = offset + aug_data_len; const size_t aug_str_len = strlen(cie_sp->augmentation); // A 'z' may be present as the first character of the string. - // If present, the Augmentation Data field shall be present. - // The contents of the Augmentation Data shall be interpreted - // according to other characters in the Augmentation String. + // If present, the Augmentation Data field shall be present. The contents + // of the Augmentation Data shall be interpreted according to other + // characters in the Augmentation String. if (cie_sp->augmentation[0] == 'z') { // Extract the Augmentation Data size_t aug_str_idx = 0; @@ -323,31 +323,27 @@ DWARFCallFrameInfo::ParseCIE(const dw_offset_t cie_offset) { char aug = cie_sp->augmentation[aug_str_idx]; switch (aug) { case 'L': - // Indicates the presence of one argument in the - // Augmentation Data of the CIE, and a corresponding - // argument in the Augmentation Data of the FDE. The - // argument in the Augmentation Data of the CIE is - // 1-byte and represents the pointer encoding used - // for the argument in the Augmentation Data of the - // FDE, which is the address of a language-specific - // data area (LSDA). The size of the LSDA pointer is - // specified by the pointer encoding used. + // Indicates the presence of one argument in the Augmentation Data + // of the CIE, and a corresponding argument in the Augmentation + // Data of the FDE. The argument in the Augmentation Data of the + // CIE is 1-byte and represents the pointer encoding used for the + // argument in the Augmentation Data of the FDE, which is the + // address of a language-specific data area (LSDA). The size of the + // LSDA pointer is specified by the pointer encoding used. cie_sp->lsda_addr_encoding = m_cfi_data.GetU8(&offset); break; case 'P': - // Indicates the presence of two arguments in the - // Augmentation Data of the CIE. The first argument - // is 1-byte and represents the pointer encoding - // used for the second argument, which is the - // address of a personality routine handler. The - // size of the personality routine pointer is - // specified by the pointer encoding used. + // Indicates the presence of two arguments in the Augmentation Data + // of the CIE. The first argument is 1-byte and represents the + // pointer encoding used for the second argument, which is the + // address of a personality routine handler. The size of the + // personality routine pointer is specified by the pointer encoding + // used. // - // The address of the personality function will - // be stored at this location. Pre-execution, it - // will be all zero's so don't read it until we're - // trying to do an unwind & the reloc has been + // The address of the personality function will be stored at this + // location. Pre-execution, it will be all zero's so don't read it + // until we're trying to do an unwind & the reloc has been // resolved. { uint8_t arg_ptr_encoding = m_cfi_data.GetU8(&offset); @@ -360,22 +356,21 @@ DWARFCallFrameInfo::ParseCIE(const dw_offset_t cie_offset) { case 'R': // A 'R' may be present at any position after the - // first character of the string. The Augmentation - // Data shall include a 1 byte argument that - // represents the pointer encoding for the address - // pointers used in the FDE. - // Example: 0x1B == DW_EH_PE_pcrel | DW_EH_PE_sdata4 + // first character of the string. The Augmentation Data shall + // include a 1 byte argument that represents the pointer encoding + // for the address pointers used in the FDE. Example: 0x1B == + // DW_EH_PE_pcrel | DW_EH_PE_sdata4 cie_sp->ptr_encoding = m_cfi_data.GetU8(&offset); break; } } } else if (strcmp(cie_sp->augmentation, "eh") == 0) { - // If the Augmentation string has the value "eh", then - // the EH Data field shall be present + // If the Augmentation string has the value "eh", then the EH Data + // field shall be present } - // Set the offset to be the end of the augmentation data just in case - // we didn't understand any of the data. + // Set the offset to be the end of the augmentation data just in case we + // didn't understand any of the data. offset = (uint32_t)aug_data_end; } @@ -408,10 +403,8 @@ void DWARFCallFrameInfo::GetCFIData() { } } // Scan through the eh_frame or debug_frame section looking for FDEs and noting -// the start/end addresses -// of the functions and a pointer back to the function's FDE for later -// expansion. -// Internalize CIEs as we come across them. +// the start/end addresses of the functions and a pointer back to the +// function's FDE for later expansion. Internalize CIEs as we come across them. void DWARFCallFrameInfo::GetFDEIndex() { if (m_section_sp.get() == nullptr || m_section_sp->IsEncrypted()) @@ -469,8 +462,8 @@ void DWARFCallFrameInfo::GetFDEIndex() { } // An FDE entry contains CIE_pointer in debug_frame in same place as cie_id - // in eh_frame. CIE_pointer is an offset into the .debug_frame section. - // So, variable cie_offset should be equal to cie_id for debug_frame. + // in eh_frame. CIE_pointer is an offset into the .debug_frame section. So, + // variable cie_offset should be equal to cie_id for debug_frame. // FDE entries with cie_id == 0 shouldn't be ignored for it. if ((cie_id == 0 && m_type == EH) || cie_id == UINT32_MAX || len == 0) { auto cie_sp = ParseCIE(current_entry); @@ -556,9 +549,8 @@ bool DWARFCallFrameInfo::FDEToUnwindPlan(dw_offset_t dwarf_offset, // FDE entries with zeroth cie_offset may occur for debug_frame. assert(!(m_type == EH && 0 == cie_offset) && cie_offset != UINT32_MAX); - // Translate the CIE_id from the eh_frame format, which - // is relative to the FDE offset, into a __eh_frame section - // offset + // Translate the CIE_id from the eh_frame format, which is relative to the + // FDE offset, into a __eh_frame section offset if (m_type == EH) { unwind_plan.SetSourceName("eh_frame CFI"); cie_offset = current_entry + (is_64bit ? 12 : 4) - cie_offset; @@ -652,10 +644,10 @@ bool DWARFCallFrameInfo::FDEToUnwindPlan(dw_offset_t dwarf_offset, case DW_CFA_advance_loc: // (Row Creation Instruction) { // 0x40 - high 2 bits are 0x1, lower 6 bits are delta // takes a single argument that represents a constant delta. The - // required action is to create a new table row with a location - // value that is computed by taking the current entry's location - // value and adding (delta * code_align). All other - // values in the new row are initially identical to the current row. + // required action is to create a new table row with a location value + // that is computed by taking the current entry's location value and + // adding (delta * code_align). All other values in the new row are + // initially identical to the current row. unwind_plan.AppendRow(row); UnwindPlan::Row *newrow = new UnwindPlan::Row; *newrow = *row.get(); @@ -670,11 +662,10 @@ bool DWARFCallFrameInfo::FDEToUnwindPlan(dw_offset_t dwarf_offset, // required action is to change the rule for the indicated register // to the rule assigned it by the initial_instructions in the CIE. uint32_t reg_num = extended_opcode; - // We only keep enough register locations around to - // unwind what is in our thread, and these are organized - // by the register index in that state, so we need to convert our - // eh_frame register number from the EH frame info, to a register - // index + // We only keep enough register locations around to unwind what is in + // our thread, and these are organized by the register index in that + // state, so we need to convert our eh_frame register number from the + // EH frame info, to a register index if (unwind_plan.IsValidRowIndex(0) && unwind_plan.GetRowAtIndex(0)->GetRegisterInfo(reg_num, @@ -756,8 +747,8 @@ bool DWARFCallFrameInfo::FDEToUnwindPlan(dw_offset_t dwarf_offset, case DW_CFA_remember_state: // 0xA { // These instructions define a stack of information. Encountering the - // DW_CFA_remember_state instruction means to save the rules for every - // register on the current row on the stack. Encountering the + // DW_CFA_remember_state instruction means to save the rules for + // every register on the current row on the stack. Encountering the // DW_CFA_restore_state instruction means to pop the set of rules off // the stack and place them in the current row. (This operation is // useful for compilers that move epilogue code into the body of a @@ -772,8 +763,8 @@ bool DWARFCallFrameInfo::FDEToUnwindPlan(dw_offset_t dwarf_offset, case DW_CFA_restore_state: // 0xB { // These instructions define a stack of information. Encountering the - // DW_CFA_remember_state instruction means to save the rules for every - // register on the current row on the stack. Encountering the + // DW_CFA_remember_state instruction means to save the rules for + // every register on the current row on the stack. Encountering the // DW_CFA_restore_state instruction means to pop the set of rules off // the stack and place them in the current row. (This operation is // useful for compilers that move epilogue code into the body of a @@ -798,10 +789,9 @@ bool DWARFCallFrameInfo::FDEToUnwindPlan(dw_offset_t dwarf_offset, case DW_CFA_GNU_args_size: // 0x2e { // The DW_CFA_GNU_args_size instruction takes an unsigned LEB128 - // operand - // representing an argument size. This instruction specifies the total - // of - // the size of the arguments which have been pushed onto the stack. + // operand representing an argument size. This instruction specifies + // the total of the size of the arguments which have been pushed onto + // the stack. // TODO: Figure out how we should handle this. m_cfi_data.GetULEB128(&offset); @@ -834,9 +824,9 @@ bool DWARFCallFrameInfo::HandleCommonDwarfOpcode(uint8_t primary_opcode, // register // takes two arguments: an unsigned LEB128 constant representing a // factored offset and a register number. The required action is to - // change the rule for the register indicated by the register number - // to be an offset(N) rule with a value of - // (N = factored offset * data_align). + // change the rule for the register indicated by the register number to + // be an offset(N) rule with a value of (N = factored offset * + // data_align). uint8_t reg_num = extended_opcode; int32_t op_offset = (int32_t)m_cfi_data.GetULEB128(&offset) * data_align; reg_location.SetAtCFAPlusOffset(op_offset); @@ -851,8 +841,8 @@ bool DWARFCallFrameInfo::HandleCommonDwarfOpcode(uint8_t primary_opcode, case DW_CFA_offset_extended: // 0x5 { - // takes two unsigned LEB128 arguments representing a register number - // and a factored offset. This instruction is identical to DW_CFA_offset + // takes two unsigned LEB128 arguments representing a register number and + // a factored offset. This instruction is identical to DW_CFA_offset // except for the encoding and size of the register argument. uint32_t reg_num = (uint32_t)m_cfi_data.GetULEB128(&offset); int32_t op_offset = (int32_t)m_cfi_data.GetULEB128(&offset) * data_align; @@ -888,9 +878,9 @@ bool DWARFCallFrameInfo::HandleCommonDwarfOpcode(uint8_t primary_opcode, case DW_CFA_register: // 0x9 { - // takes two unsigned LEB128 arguments representing register numbers. - // The required action is to set the rule for the first register to be - // the second register. + // takes two unsigned LEB128 arguments representing register numbers. The + // required action is to set the rule for the first register to be the + // second register. uint32_t reg_num = (uint32_t)m_cfi_data.GetULEB128(&offset); uint32_t other_reg_num = (uint32_t)m_cfi_data.GetULEB128(&offset); UnwindPlan::Row::RegisterLocation reg_location; @@ -901,10 +891,9 @@ bool DWARFCallFrameInfo::HandleCommonDwarfOpcode(uint8_t primary_opcode, case DW_CFA_def_cfa: // 0xC (CFA Definition Instruction) { - // Takes two unsigned LEB128 operands representing a register - // number and a (non-factored) offset. The required action - // is to define the current CFA rule to use the provided - // register and offset. + // Takes two unsigned LEB128 operands representing a register number and + // a (non-factored) offset. The required action is to define the current + // CFA rule to use the provided register and offset. uint32_t reg_num = (uint32_t)m_cfi_data.GetULEB128(&offset); int32_t op_offset = (int32_t)m_cfi_data.GetULEB128(&offset); row.GetCFAValue().SetIsRegisterPlusOffset(reg_num, op_offset); @@ -914,8 +903,8 @@ bool DWARFCallFrameInfo::HandleCommonDwarfOpcode(uint8_t primary_opcode, case DW_CFA_def_cfa_register: // 0xD (CFA Definition Instruction) { // takes a single unsigned LEB128 argument representing a register - // number. The required action is to define the current CFA rule to - // use the provided register (but to keep the old offset). + // number. The required action is to define the current CFA rule to use + // the provided register (but to keep the old offset). uint32_t reg_num = (uint32_t)m_cfi_data.GetULEB128(&offset); row.GetCFAValue().SetIsRegisterPlusOffset(reg_num, row.GetCFAValue().GetOffset()); @@ -924,10 +913,9 @@ bool DWARFCallFrameInfo::HandleCommonDwarfOpcode(uint8_t primary_opcode, case DW_CFA_def_cfa_offset: // 0xE (CFA Definition Instruction) { - // Takes a single unsigned LEB128 operand representing a - // (non-factored) offset. The required action is to define - // the current CFA rule to use the provided offset (but - // to keep the old register). + // Takes a single unsigned LEB128 operand representing a (non-factored) + // offset. The required action is to define the current CFA rule to use + // the provided offset (but to keep the old register). int32_t op_offset = (int32_t)m_cfi_data.GetULEB128(&offset); row.GetCFAValue().SetIsRegisterPlusOffset( row.GetCFAValue().GetRegisterNumber(), op_offset); @@ -945,14 +933,13 @@ bool DWARFCallFrameInfo::HandleCommonDwarfOpcode(uint8_t primary_opcode, case DW_CFA_expression: // 0x10 { - // Takes two operands: an unsigned LEB128 value representing - // a register number, and a DW_FORM_block value representing a DWARF - // expression. The required action is to change the rule for the - // register indicated by the register number to be an expression(E) - // rule where E is the DWARF expression. That is, the DWARF - // expression computes the address. The value of the CFA is - // pushed on the DWARF evaluation stack prior to execution of - // the DWARF expression. + // Takes two operands: an unsigned LEB128 value representing a register + // number, and a DW_FORM_block value representing a DWARF expression. The + // required action is to change the rule for the register indicated by + // the register number to be an expression(E) rule where E is the DWARF + // expression. That is, the DWARF expression computes the address. The + // value of the CFA is pushed on the DWARF evaluation stack prior to + // execution of the DWARF expression. uint32_t reg_num = (uint32_t)m_cfi_data.GetULEB128(&offset); uint32_t block_len = (uint32_t)m_cfi_data.GetULEB128(&offset); const uint8_t *block_data = @@ -965,10 +952,10 @@ bool DWARFCallFrameInfo::HandleCommonDwarfOpcode(uint8_t primary_opcode, case DW_CFA_offset_extended_sf: // 0x11 { - // takes two operands: an unsigned LEB128 value representing a - // register number and a signed LEB128 factored offset. This - // instruction is identical to DW_CFA_offset_extended except - // that the second operand is signed and factored. + // takes two operands: an unsigned LEB128 value representing a register + // number and a signed LEB128 factored offset. This instruction is + // identical to DW_CFA_offset_extended except that the second operand is + // signed and factored. uint32_t reg_num = (uint32_t)m_cfi_data.GetULEB128(&offset); int32_t op_offset = (int32_t)m_cfi_data.GetSLEB128(&offset) * data_align; UnwindPlan::Row::RegisterLocation reg_location; @@ -979,10 +966,10 @@ bool DWARFCallFrameInfo::HandleCommonDwarfOpcode(uint8_t primary_opcode, case DW_CFA_def_cfa_sf: // 0x12 (CFA Definition Instruction) { - // Takes two operands: an unsigned LEB128 value representing - // a register number and a signed LEB128 factored offset. - // This instruction is identical to DW_CFA_def_cfa except - // that the second operand is signed and factored. + // Takes two operands: an unsigned LEB128 value representing a register + // number and a signed LEB128 factored offset. This instruction is + // identical to DW_CFA_def_cfa except that the second operand is signed + // and factored. uint32_t reg_num = (uint32_t)m_cfi_data.GetULEB128(&offset); int32_t op_offset = (int32_t)m_cfi_data.GetSLEB128(&offset) * data_align; row.GetCFAValue().SetIsRegisterPlusOffset(reg_num, op_offset); @@ -991,9 +978,9 @@ bool DWARFCallFrameInfo::HandleCommonDwarfOpcode(uint8_t primary_opcode, case DW_CFA_def_cfa_offset_sf: // 0x13 (CFA Definition Instruction) { - // takes a signed LEB128 operand representing a factored - // offset. This instruction is identical to DW_CFA_def_cfa_offset - // except that the operand is signed and factored. + // takes a signed LEB128 operand representing a factored offset. This + // instruction is identical to DW_CFA_def_cfa_offset except that the + // operand is signed and factored. int32_t op_offset = (int32_t)m_cfi_data.GetSLEB128(&offset) * data_align; uint32_t cfa_regnum = row.GetCFAValue().GetRegisterNumber(); row.GetCFAValue().SetIsRegisterPlusOffset(cfa_regnum, op_offset); @@ -1003,9 +990,9 @@ bool DWARFCallFrameInfo::HandleCommonDwarfOpcode(uint8_t primary_opcode, case DW_CFA_val_expression: // 0x16 { // takes two operands: an unsigned LEB128 value representing a register - // number, and a DW_FORM_block value representing a DWARF expression. - // The required action is to change the rule for the register indicated - // by the register number to be a val_expression(E) rule where E is the + // number, and a DW_FORM_block value representing a DWARF expression. The + // required action is to change the rule for the register indicated by + // the register number to be a val_expression(E) rule where E is the // DWARF expression. That is, the DWARF expression computes the value of // the given register. The value of the CFA is pushed on the DWARF // evaluation stack prior to execution of the DWARF expression. |

