From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14449 invoked by alias); 14 May 2002 16:01:09 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 14414 invoked from network); 14 May 2002 16:01:04 -0000 Received: from unknown (HELO maxipes.logix.cz) (217.11.251.37) by sources.redhat.com with SMTP; 14 May 2002 16:01:04 -0000 Received: (qmail 17021 invoked from network); 14 May 2002 16:01:02 -0000 Received: from styx.suse.cz (HELO suse.cz) (hajzl@213.210.157.162) by broucek.logix.cz with SMTP; 14 May 2002 16:01:02 -0000 Message-ID: <3CE134BE.1000202@suse.cz> Date: Tue, 14 May 2002 09:01:00 -0000 From: Michal Ludvig Organization: SuSE CR User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0rc2) Gecko/20020510 X-Accept-Language: cs, cz, en MIME-Version: 1.0 To: gdb-patches@sources.redhat.com Subject: [RFA] eh_frame handling Content-Type: multipart/mixed; boundary="------------090604050707040809060005" X-SW-Source: 2002-05/txt/msg00546.txt.bz2 This is a multi-part message in MIME format. --------------090604050707040809060005 Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 7bit Content-length: 551 Hi all, these changes will allow backtrace even through objects without debug_frame section. Note that gcc must produce all information necessary in eh_frame (perhaps -fasynchronous-unwind-tables flag?). 2002-05-14 Michal Ludvig * dwarf2cfi.c (frame_state_for): Added safety check for a valid fde->cie_ptr. (dwarf2_build_frame_info): Added handling for eh_frame. OK to commit to mainline and branch? Michal Ludvig -- * SuSE CR, s.r.o * mludvig@suse.cz * +420 2 9654 5373 * http://www.suse.cz --------------090604050707040809060005 Content-Type: text/plain; name="cfi-eh.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="cfi-eh.diff" Content-length: 3517 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; --------------090604050707040809060005--