< prev index next >

src/jdk.hotspot.agent/linux/native/libsaproc/dwarf.cpp

Print this page

        

*** 73,94 **** _buf += 4; // Skip ID (This value of CIE would be always 0) _buf++; // Skip version (assume to be "1") char *augmentation_string = reinterpret_cast<char *>(_buf); bool has_ehdata = (strcmp("eh", augmentation_string) == 0); - bool fde_encoded = (strchr(augmentation_string, 'R') != NULL); _buf += strlen(augmentation_string) + 1; // includes '\0' if (has_ehdata) { _buf += sizeof(void *); // Skip EH data } _code_factor = read_leb(false); _data_factor = static_cast<int>(read_leb(true)); _return_address_reg = static_cast<enum DWARF_Register>(*_buf++); ! if (fde_encoded) { ! uintptr_t augmentation_length = read_leb(false); _encoding = *_buf++; } // Clear state _current_pc = 0L; --- 73,101 ---- _buf += 4; // Skip ID (This value of CIE would be always 0) _buf++; // Skip version (assume to be "1") char *augmentation_string = reinterpret_cast<char *>(_buf); bool has_ehdata = (strcmp("eh", augmentation_string) == 0); _buf += strlen(augmentation_string) + 1; // includes '\0' if (has_ehdata) { _buf += sizeof(void *); // Skip EH data } _code_factor = read_leb(false); _data_factor = static_cast<int>(read_leb(true)); _return_address_reg = static_cast<enum DWARF_Register>(*_buf++); ! if (strpbrk(augmentation_string, "LP") != NULL) { ! // Language personality routine (P) and LSDA (L) are not supported ! // because we need compliant Unwind Library Interface, ! // but we want to unwind without it. ! // ! // Unwind Library Interface (SysV ABI AMD64 6.2) ! // https://software.intel.com/sites/default/files/article/402129/mpx-linux64-abi.pdf ! return false; ! } else if (strchr(augmentation_string, 'R') != NULL) { ! read_leb(false); // augmentation length _encoding = *_buf++; } // Clear state _current_pc = 0L;
*** 283,293 **** } bool DwarfParser::process_dwarf(const uintptr_t pc) { // https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html _buf = _lib->eh_frame.data; ! while (true) { uint64_t length = get_entry_length(); if (length == 0L) { return false; } unsigned char *next_entry = _buf + length; --- 290,300 ---- } bool DwarfParser::process_dwarf(const uintptr_t pc) { // https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html _buf = _lib->eh_frame.data; ! while (_buf <= (_buf + _lib->eh_frame.size)) { uint64_t length = get_entry_length(); if (length == 0L) { return false; } unsigned char *next_entry = _buf + length;
*** 308,321 **** uintptr_t augmentation_length = read_leb(false); _buf += augmentation_length; // skip // Process FDE parse_dwarf_instructions(pc_begin, pc, next_entry); ! break; } } _buf = next_entry; } ! return true; } --- 315,328 ---- uintptr_t augmentation_length = read_leb(false); _buf += augmentation_length; // skip // Process FDE parse_dwarf_instructions(pc_begin, pc, next_entry); ! return true; } } _buf = next_entry; } ! return false; }
< prev index next >