From patchwork Tue Aug 1 15:41:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "REIX, Tony" X-Patchwork-Id: 796299 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-459537-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="PCv9+W6Z"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xMLD10v2xz9sR9 for ; Wed, 2 Aug 2017 01:42:08 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:content-type:mime-version; q=dns; s=default; b=n2XCoURgtV2yYKYQ3QFYdYDEPJ6eV47wNBvwq270djpgqPOOou h6CDTi0DAUHqMb99HkUErFZo/dAeDjdmKv9VebAuPELHMrqU9xYZuA3q96HIYj0N a6kCsfbjdN9KDXYs2WpU04P/EDYC1larhHGS8AOYXPaxCMZlZO8DyveM4= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:content-type:mime-version; s= default; bh=aVFO1y4S+kG/LGrnvC6qbxPyfMY=; b=PCv9+W6ZYaUdrC27b4Zu yB/UAqJPpqtQh9QPOkAoNMldNgHSsPf0zB9b4x7AW9/7DEshU2cSDjsQuQgD5atU oFr+Oczvbd4I8zE9L9fuQrXecamc4ET89Ka8h0EcpEbgs+VnfkfvDE9A+W/Idu0o 3e1bPLx+nshdb0rRRIJQUuo= Received: (qmail 98143 invoked by alias); 1 Aug 2017 15:41:56 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 98116 invoked by uid 89); 1 Aug 2017 15:41:54 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-14.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.2 spammy=H*MI:solutions, coop, bull, sects X-HELO: smtppost.atos.net Received: from smtppost.atos.net (HELO smtppost.atos.net) (193.56.114.165) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 01 Aug 2017 15:41:52 +0000 Received: from mail2-ext.my-it-solutions.net (mail2-ext.my-it-solutions.net) by smarthost5.atos.net with smtp (TLS: TLSv1/SSLv3,256bits,ECDHE-RSA-AES256-GCM-SHA384) id 09d4_55b3_69d919e9_8e3d_4d9c_bfb1_b83ea757712b; Tue, 01 Aug 2017 17:41:47 +0200 Received: from mail1-int.my-it-solutions.net ([10.92.32.11]) by mail2-ext.my-it-solutions.net (8.15.2/8.15.2) with ESMTPS id v71Fflsl004100 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 1 Aug 2017 17:41:47 +0200 Received: from FRAUVJ99ET1MSX.ww931.my-it-solutions.net ([172.23.231.40]) by mail1-int.my-it-solutions.net (8.15.2/8.15.2) with ESMTPS id v71Ffkvl003666 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 1 Aug 2017 17:41:46 +0200 Received: from FRAUVJ99ET3MSX.ww931.my-it-solutions.net (172.23.231.44) by FRAUVJ99ET1MSX.ww931.my-it-solutions.net (172.23.231.40) with Microsoft SMTP Server (TLS) id 14.3.352.0; Tue, 1 Aug 2017 17:41:46 +0200 Received: from FRCRPVV9EX3MSX.ww931.my-it-solutions.net ([169.254.6.169]) by FRAUVJ99ET3MSX.ww931.my-it-solutions.net ([172.23.231.44]) with mapi id 14.03.0352.000; Tue, 1 Aug 2017 17:41:46 +0200 From: "REIX, Tony" To: "gcc-patches@gcc.gnu.org" CC: "dje.gcc@gmail.com" Subject: [PATCH,AIX] Initial support for DWARF debug sections in XCOFF. Date: Tue, 1 Aug 2017 15:41:45 +0000 Message-ID: MIME-Version: 1.0 Description: * This patch provides an initial support for DWARF debug sections in XCOFF. Tests: * AIX: Build: SUCCESS - build made by means of gmake. ChangeLog: * xcoff.c: Initial support for DWARF debug sections in XCOFF. Cordialement, Tony Reix Bull - ATOS IBM Coop Architect & Technical Leader Office : +33 (0) 4 76 29 72 67 1 rue de Provence - 38432 Échirolles - France www.atos.net Index: libbacktrace/ChangeLog =================================================================== --- libbacktrace/ChangeLog (revision 250777) +++ libbacktrace/ChangeLog (working copy) @@ -1,3 +1,7 @@ +2017-08-01 Tony Reix + + * xcoff.c: Initial support for DWARF debug sections in XCOFF. + 2017-07-28 Tony Reix * xcoff.c: Don't leak a file descriptor if an archive is malformed. Index: libbacktrace/xcoff.c =================================================================== --- libbacktrace/xcoff.c (revision 250777) +++ libbacktrace/xcoff.c (working copy) @@ -124,9 +124,16 @@ typedef struct { #endif /* BACKTRACE_XCOFF_SIZE != 32 */ +#define STYP_DWARF 0x10 /* DWARF debugging section. */ #define STYP_TEXT 0x20 /* Executable text (code) section. */ #define STYP_OVRFLO 0x8000 /* Line-number field overflow section. */ +#define SSUBTYP_DWINFO 0x10000 /* DWARF info section. */ +#define SSUBTYP_DWLINE 0x20000 /* DWARF line-number section. */ +#define SSUBTYP_DWARNGE 0x50000 /* DWARF aranges section. */ +#define SSUBTYP_DWABREV 0x60000 /* DWARF abbreviation section. */ +#define SSUBTYP_DWSTR 0x70000 /* DWARF strings section. */ + /* XCOFF symbol. */ #define SYMNMLEN 8 @@ -367,7 +374,30 @@ struct xcoff_fileline_data struct xcoff_line_vector vec; }; +/* An index of DWARF sections we care about. */ +enum dwarf_section +{ + DWSECT_INFO, + DWSECT_LINE, + DWSECT_ABBREV, + DWSECT_RANGES, + DWSECT_STR, + DWSECT_MAX +}; + +/* Information we gather for the DWARF sections we care about. */ + +struct dwsect_info +{ + /* Section file offset. */ + off_t offset; + /* Section size. */ + size_t size; + /* Section contents, after read from file. */ + const unsigned char *data; +}; + /* A dummy callback function used when we can't find any debug info. */ static int @@ -1056,6 +1086,7 @@ xcoff_add (struct backtrace_state *state, int desc struct backtrace_view linenos_view; struct backtrace_view syms_view; struct backtrace_view str_view; + struct backtrace_view dwarf_view; b_xcoff_filhdr fhdr; const b_xcoff_scnhdr *sects; const b_xcoff_scnhdr *stext; @@ -1062,6 +1093,9 @@ xcoff_add (struct backtrace_state *state, int desc uint64_t lnnoptr; uint32_t nlnno; off_t str_off; + off_t min_offset; + off_t max_offset; + struct dwsect_info dwsect[DWSECT_MAX]; size_t sects_size; size_t syms_size; int32_t str_size; @@ -1069,6 +1103,7 @@ xcoff_add (struct backtrace_state *state, int desc int linenos_view_valid; int syms_view_valid; int str_view_valid; + int dwarf_view_valid; int magic_ok; int i; @@ -1078,7 +1113,10 @@ xcoff_add (struct backtrace_state *state, int desc linenos_view_valid = 0; syms_view_valid = 0; str_view_valid = 0; + dwarf_view_valid = 0; + str_size = 0; + /* Map the XCOFF file header. */ if (!backtrace_get_view (state, descriptor, offset, sizeof (b_xcoff_filhdr), error_callback, data, &fhdr_view)) @@ -1092,7 +1130,7 @@ xcoff_add (struct backtrace_state *state, int desc if (!magic_ok) { if (exe) - error_callback (data, "executable file is not XCOFF", 0); + error_callback (data, "executable file is not XCOFF", 0); goto fail; } @@ -1114,8 +1152,8 @@ xcoff_add (struct backtrace_state *state, int desc /* FIXME: assumes only one .text section. */ for (i = 0; i < fhdr.f_nscns; ++i) - if ((sects[i].s_flags & 0xffff) == STYP_TEXT) - break; + if ((sects[i].s_flags & 0xffff) == STYP_TEXT) + break; if (i == fhdr.f_nscns) goto fail; @@ -1134,12 +1172,12 @@ xcoff_add (struct backtrace_state *state, int desc /* Find the matching .ovrflo section. */ for (i = 0; i < fhdr.f_nscns; ++i) { - if (((sects[i].s_flags & 0xffff) == STYP_OVRFLO) - && sects[i].s_nlnno == sntext) - { - nlnno = sects[i].s_vaddr; - break; - } + if (((sects[i].s_flags & 0xffff) == STYP_OVRFLO) + && sects[i].s_nlnno == sntext) + { + nlnno = sects[i].s_vaddr; + break; + } } } #endif @@ -1194,10 +1232,92 @@ xcoff_add (struct backtrace_state *state, int desc xcoff_add_syminfo_data (state, sdata); } - /* Read the line number entries. */ + /* Read all the DWARF sections in a single view, since they are + probably adjacent in the file. We never release this view. */ - if (fhdr.f_symptr != 0 && lnnoptr != 0) + min_offset = 0; + max_offset = 0; + memset (dwsect, 0, sizeof dwsect); + for (i = 0; i < fhdr.f_nscns; ++i) { + off_t end; + int idx; + + if ((sects[i].s_flags & 0xffff) != STYP_DWARF + || sects[i].s_size == 0) + continue; + /* Map DWARF section to array index. */ + switch (sects[i].s_flags & 0xffff0000) + { + case SSUBTYP_DWINFO: + idx = DWSECT_INFO; + break; + case SSUBTYP_DWLINE: + idx = DWSECT_LINE; + break; + case SSUBTYP_DWABREV: + idx = DWSECT_ABBREV; + break; + case SSUBTYP_DWARNGE: + idx = DWSECT_RANGES; + break; + case SSUBTYP_DWSTR: + idx = DWSECT_STR; + break; + default: + continue; + } + if (min_offset == 0 || sects[i].s_scnptr < min_offset) + min_offset = sects[i].s_scnptr; + end = sects[i].s_scnptr + sects[i].s_size; + if (end > max_offset) + max_offset = end; + dwsect[idx].offset = sects[i].s_scnptr; + dwsect[idx].size = sects[i].s_size; + } + if (min_offset != 0 && max_offset != 0) + { + if (!backtrace_get_view (state, descriptor, offset + min_offset, + max_offset - min_offset, + error_callback, data, &dwarf_view)) + goto fail; + dwarf_view_valid = 1; + + for (i = 0; i < (int) DWSECT_MAX; ++i) + { + if (dwsect[i].offset == 0) + dwsect[i].data = NULL; + else + dwsect[i].data = ((const unsigned char *) dwarf_view.data + + (dwsect[i].offset - min_offset)); + } + + if (!backtrace_dwarf_add (state, 0, + dwsect[DWSECT_INFO].data, + dwsect[DWSECT_INFO].size, +#if BACKTRACE_XCOFF_SIZE == 32 + /* XXX workaround for broken lineoff */ + dwsect[DWSECT_LINE].data - 4, +#else + /* XXX workaround for broken lineoff */ + dwsect[DWSECT_LINE].data - 12, +#endif + dwsect[DWSECT_LINE].size, + dwsect[DWSECT_ABBREV].data, + dwsect[DWSECT_ABBREV].size, + dwsect[DWSECT_RANGES].data, + dwsect[DWSECT_RANGES].size, + dwsect[DWSECT_STR].data, + dwsect[DWSECT_STR].size, + 1, /* big endian */ + error_callback, data, fileline_fn)) + goto fail; + } + + /* Read the XCOFF line number entries if DWARF sections not found. */ + + if (!dwarf_view_valid && fhdr.f_symptr != 0 && lnnoptr != 0) + { size_t linenos_size = (size_t) nlnno * LINESZ; if (!backtrace_get_view (state, descriptor, offset + lnnoptr, @@ -1239,6 +1359,8 @@ xcoff_add (struct backtrace_state *state, int desc backtrace_release_view (state, &syms_view, error_callback, data); if (linenos_view_valid) backtrace_release_view (state, &linenos_view, error_callback, data); + if (dwarf_view_valid) + backtrace_release_view (state, &dwarf_view, error_callback, data); if (descriptor != -1 && offset == 0) backtrace_close (descriptor, error_callback, data); return 0;