Index: dwarf2cfi.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2cfi.c,v retrieving revision 1.5 diff -c -3 -p -r1.5 dwarf2cfi.c *** dwarf2cfi.c 14 May 2002 08:24:26 -0000 1.5 --- dwarf2cfi.c 14 May 2002 15:49:26 -0000 *************** frame_state_for (struct context *context *** 802,812 **** context->args_size = 0; context->lsda = 0; ! if ((fde = get_fde_for_addr (context->ra - 1)) != NULL) ! { ! fs->pc = fde->initial_location; cie = fde->cie_ptr; fs->code_align = cie->code_align; fs->data_align = cie->data_align; fs->retaddr_column = cie->ra; --- 802,816 ---- context->args_size = 0; context->lsda = 0; ! if ((fde = get_fde_for_addr (context->ra - 1)) == NULL) ! return; ! ! fs->pc = fde->initial_location; + if (fde->cie_ptr) + { cie = fde->cie_ptr; + fs->code_align = cie->code_align; fs->data_align = cie->data_align; fs->retaddr_column = cie->ra; *************** frame_state_for (struct context *context *** 817,823 **** cie->data + cie->data_length, context, fs); execute_cfa_program (cie->objfile, fde->data, fde->data + fde->data_length, context, fs); ! } } static void --- 821,831 ---- cie->data + cie->data_length, context, fs); execute_cfa_program (cie->objfile, fde->data, fde->data + fde->data_length, context, fs); ! } ! else ! internal_error (__FILE__, __LINE__, ! "%s(): Internal error: fde->cie_ptr==NULL !", ! __func__); } static void *************** dwarf2_build_frame_info (struct objfile *** 1367,1372 **** --- 1375,1381 ---- bfd *abfd = objfile->obfd; char *start = NULL; char *end = NULL; + int from_eh = 0; obstack_init (&unwind_tmp_obstack); *************** dwarf2_build_frame_info (struct objfile *** 1389,1394 **** --- 1398,1405 ---- start = dwarf_frame_buffer; end = dwarf_frame_buffer + dwarf_eh_frame_size; + + from_eh = 1; } if (start) *************** dwarf2_build_frame_info (struct objfile *** 1410,1416 **** cie_id = read_length (abfd, start, &bytes_read, dwarf64); start += bytes_read; ! if (is_cie (cie_id, dwarf64)) { struct cie_unit *cie = cie_unit_alloc (); char *aug; --- 1421,1427 ---- cie_id = read_length (abfd, start, &bytes_read, dwarf64); start += bytes_read; ! if ((from_eh && cie_id == 0) || is_cie (cie_id, dwarf64)) { struct cie_unit *cie = cie_unit_alloc (); char *aug; *************** dwarf2_build_frame_info (struct objfile *** 1479,1486 **** fde->initial_location = read_pointer (abfd, &start); fde->address_range = read_pointer (abfd, &start); ! for (cie = cie_chunks; cie && (cie->offset != cie_id); cie = cie->next); if (!cie) error ("dwarf cfi error: can't find CIE pointer"); fde->cie_ptr = cie; --- 1490,1503 ---- fde->initial_location = read_pointer (abfd, &start); fde->address_range = read_pointer (abfd, &start); ! if(from_eh) ! for (cie = cie_chunks; ! cie && (cie->offset != (unit_offset + bytes_read - cie_id)); ! cie = cie->next); ! else ! for (cie = cie_chunks; cie && (cie->offset != cie_id); cie = cie->next); + if (!cie) error ("dwarf cfi error: can't find CIE pointer"); fde->cie_ptr = cie;