38 if (eh_ptr_enc == DW_EH_PE_omit)
41 uint64_t baseAddress = 0;
42 uint64_t addressValue = 0;
44 assert(addr_size == 4 || addr_size == 8);
46 bool signExtendValue =
false;
48 switch (eh_ptr_enc & 0x70) {
50 signExtendValue =
true;
51 baseAddress = *offset_ptr;
53 baseAddress += pc_rel_addr;
59 case DW_EH_PE_textrel:
60 signExtendValue =
true;
62 baseAddress = text_addr;
69 case DW_EH_PE_datarel:
70 signExtendValue =
true;
72 baseAddress = data_addr;
79 case DW_EH_PE_funcrel:
80 signExtendValue =
true;
83 case DW_EH_PE_aligned: {
86 assert(addr_size != 0);
89 uint32_t alignOffset = *offset_ptr % addr_size;
91 offset_ptr += addr_size - alignOffset;
101 case DW_EH_PE_absptr: {
107 case DW_EH_PE_uleb128:
110 case DW_EH_PE_udata2:
111 addressValue = DE.
GetU16(offset_ptr);
113 case DW_EH_PE_udata4:
114 addressValue = DE.
GetU32(offset_ptr);
116 case DW_EH_PE_udata8:
117 addressValue = DE.
GetU64(offset_ptr);
119 case DW_EH_PE_sleb128:
122 case DW_EH_PE_sdata2:
123 addressValue = (int16_t)DE.
GetU16(offset_ptr);
125 case DW_EH_PE_sdata4:
126 addressValue = (int32_t)DE.
GetU32(offset_ptr);
128 case DW_EH_PE_sdata8:
129 addressValue = (int64_t)DE.
GetU64(offset_ptr);
138 if (signExtendValue && addr_size <
sizeof(baseAddress)) {
139 uint64_t sign_bit = 1ull << ((addr_size * 8ull) - 1ull);
140 if (sign_bit & addressValue) {
141 uint64_t mask = ~sign_bit + 1;
142 addressValue |= mask;
145 return baseAddress + addressValue;
149 SectionSP §ion_sp,
Type type)
150 : m_objfile(objfile), m_section_sp(section_sp), m_type(type) {}
165 if (module_sp.get() ==
nullptr || module_sp->GetObjectFile() ==
nullptr ||
166 module_sp->GetObjectFile() != &
m_objfile)
179 if (module_sp.get() ==
nullptr || module_sp->GetObjectFile() ==
nullptr ||
180 module_sp->GetObjectFile() != &
m_objfile)
196 llvm::Optional<DWARFCallFrameInfo::FDEEntryMap::Entry>
217 function_info.
Clear();
220 for (
size_t i = 0; i < count; ++i) {
223 if (func_offset_data_entry) {
225 func_offset_data_entry->
base, func_offset_data_entry->
size);
226 function_info.
Append(function_offset_entry);
233 cie_map_t::iterator pos =
m_cie_map.find(cie_offset);
237 if (pos->second ==
nullptr)
240 return pos->second.get();
257 end_offset = cie_offset + length + 12;
260 end_offset = cie_offset + length + 4;
268 cie_sp->ptr_encoding = DW_EH_PE_absptr;
272 "CIE parse error: CFI version %d is not supported\n",
279 if (cie_sp->augmentation[i] ==
'\0') {
282 cie_sp->augmentation[j] =
'\0';
291 "CIE parse error: CIE augmentation string was too large "
292 "for the fixed sized buffer of %d bytes.\n",
307 cie_sp->return_addr_reg_num =
312 if (cie_sp->augmentation[0]) {
316 const size_t aug_data_end = offset + aug_data_len;
317 const size_t aug_str_len = strlen(cie_sp->augmentation);
322 if (cie_sp->augmentation[0] ==
'z') {
324 size_t aug_str_idx = 0;
325 for (aug_str_idx = 1; aug_str_idx < aug_str_len; aug_str_idx++) {
326 char aug = cie_sp->augmentation[aug_str_idx];
355 m_cfi_data, &offset, arg_ptr_encoding, pc_rel_addr,
370 }
else if (strcmp(cie_sp->augmentation,
"eh") == 0) {
380 if (end_offset > offset) {
381 cie_sp->inst_offset = offset;
382 cie_sp->inst_length = end_offset - offset;
384 while (offset < end_offset) {
386 uint8_t primary_opcode = inst & 0xC0;
387 uint8_t extended_opcode = inst & 0x3F;
390 cie_sp->data_align, offset,
391 cie_sp->initial_row))
427 bool clear_address_zeroth_bit =
false;
429 if (arch.GetTriple().getArch() == llvm::Triple::arm ||
430 arch.GetTriple().getArch() == llvm::Triple::thumb)
431 clear_address_zeroth_bit =
true;
445 next_entry = current_entry + len + 12;
446 cie_offset = current_entry + 12 - cie_id;
449 next_entry = current_entry + len + 4;
450 cie_offset = current_entry + 4 - cie_id;
455 "entry offset of 0x%x found in "
457 next_entry, current_entry);
470 auto cie_sp =
ParseCIE(current_entry);
478 m_cie_map[current_entry] = std::move(cie_sp);
488 "error: Invalid cie offset of 0x%x "
489 "found in cie/fde at 0x%x\n",
490 cie_offset, current_entry);
506 text_addr, data_addr);
507 if (clear_address_zeroth_bit)
512 pc_rel_addr, text_addr, data_addr);
517 "0x%8.8x for cie_id = 0x%8.8x for "
518 "entry at 0x%8.8x.\n",
519 cie_offset, cie_id, current_entry);
557 cie_offset = current_entry + (is_64bit ? 12 : 4) - cie_offset;
571 assert(cie !=
nullptr);
573 const dw_offset_t end_offset = current_entry + length + (is_64bit ? 12 : 4);
580 text_addr, data_addr);
583 pc_rel_addr, text_addr, data_addr);
594 lsda_data_file_address =
596 pc_rel_addr, text_addr, data_addr);
597 if (offset - saved_offset != aug_data_len) {
602 offset = saved_offset;
604 offset += aug_data_len;
610 Address personality_function_ptr;
617 personality_function_ptr);
636 std::vector<UnwindPlan::RowSP> stack;
641 uint8_t primary_opcode = inst & 0xC0;
642 uint8_t extended_opcode = inst & 0x3F;
646 if (primary_opcode) {
647 switch (primary_opcode) {
648 case DW_CFA_advance_loc:
657 *newrow = *row.get();
663 case DW_CFA_restore: {
677 row->SetRegisterInfo(reg_num, reg_location);
682 switch (extended_opcode) {
692 *newrow = *row.get();
699 case DW_CFA_advance_loc1:
706 *newrow = *row.get();
712 case DW_CFA_advance_loc2:
719 *newrow = *row.get();
725 case DW_CFA_advance_loc4:
732 *newrow = *row.get();
738 case DW_CFA_restore_extended:
747 row->SetRegisterInfo(reg_num, reg_location);
751 case DW_CFA_remember_state:
760 stack.push_back(row);
762 *newrow = *row.get();
767 case DW_CFA_restore_state:
778 "DWARFCallFrameInfo::%s(dwarf_offset: %" PRIx32
779 ", startaddr: %" PRIx64
780 " encountered DW_CFA_restore_state but state stack "
781 "is empty. Corrupt unwind info?",
788 row->SetOffset(offset);
792 case DW_CFA_GNU_args_size:
804 case DW_CFA_val_offset:
805 case DW_CFA_val_offset_sf:
818 uint8_t extended_opcode,
824 if (primary_opcode) {
825 switch (primary_opcode) {
826 case DW_CFA_offset: {
833 uint8_t reg_num = extended_opcode;
841 switch (extended_opcode) {
845 case DW_CFA_offset_extended:
858 case DW_CFA_undefined:
870 case DW_CFA_same_value:
882 case DW_CFA_register:
906 case DW_CFA_def_cfa_register:
917 case DW_CFA_def_cfa_offset:
928 case DW_CFA_def_cfa_expression:
931 const uint8_t *block_data =
937 case DW_CFA_expression:
948 const uint8_t *block_data =
956 case DW_CFA_offset_extended_sf:
970 case DW_CFA_def_cfa_sf:
982 case DW_CFA_def_cfa_offset_sf:
993 case DW_CFA_val_expression:
1004 const uint8_t *block_data =