From patchwork Tue May 22 00:15:57 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cary Coutant X-Patchwork-Id: 160504 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 27F1EB6EF3 for ; Tue, 22 May 2012 10:16:31 +1000 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1338250592; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Received:Received:Received:Received:To:Subject:Message-Id:Date: From:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=Q8GVdas BubsStNj33IqNhBJPdbs=; b=OsEWhVGSMz4VfjhjSscRpti3BTn2pjjvMpLvV/C S2A5v1q2cp8cH+nUwid6W21k48+/j19+jsn2MP+UilqY5azCeItsFqCvImot65BL Rg16/sYf1m1JtPSv8KAaco/PaN/GwCVCQPcYKaoryk26xBevglygc9VheU2oVkT5 K/Qg= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:X-Google-DKIM-Signature:Received:Received:Received:Received:Received:To:Subject:Message-Id:Date:From:X-Gm-Message-State:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=pMJ7C0fIq2nJHn4uzB2CP0VY6qZ7ikZt36Imc52x+QTvB80B3s6V2UJWSf3i1E cZhutwnYNDWNLcb2CZwhvCNtHMQXM/U99wyqtGiy9T4+5/1ztLR75zpi/nL4PFRE a03C0r/kyL7bnQIHQfuoNVvWbT261ILafgNZSDlFA35gQ=; Received: (qmail 15844 invoked by alias); 22 May 2012 00:16:21 -0000 Received: (qmail 15816 invoked by uid 22791); 22 May 2012 00:16:17 -0000 X-SWARE-Spam-Status: No, hits=-4.2 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, KHOP_RCVD_TRUST, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE, TW_CX, TW_GD, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail-lb0-f201.google.com (HELO mail-lb0-f201.google.com) (209.85.217.201) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 22 May 2012 00:16:01 +0000 Received: by lbdb5 with SMTP id b5so332901lbd.2 for ; Mon, 21 May 2012 17:15:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=to:subject:message-id:date:from:x-gm-message-state; bh=GHitCteiHG12DwFHcjQarxEM4oZIuepcYqzZYmu3aIs=; b=ctQfxU8bFengKzPXxSqQCu+EY/+E44+LYLo3U97/TPwS0tOdoLzcxZtcDteObeiUAn +U0VednrkMilCtqd9LrMBXZFiA4QfAmqCHhSTFmjX9kDb9pzlDhXG9TSJDNBtEYNxFow bbHopyGlSU4nCXgwQRVs/y8KpGllR2WAOAewV2YGHjbo5sRwgzFPk3AvOWME1LMaJ8rw YANRKqgugl5bxlzjdhzrdaQt6FAEM1kbRJxFIzKJWqxGxJXphGOU1lMPB2RoUzMhNYHL /cNsQ+VQ1w0muN2PmMcZz1TsLryL3wz+8xF/FINJSaBorXdR8lG4WqT0G6lA+aEJlLq3 L4Ww== Received: by 10.213.28.193 with SMTP id n1mr4006543ebc.0.1337645759118; Mon, 21 May 2012 17:15:59 -0700 (PDT) Received: by 10.213.28.193 with SMTP id n1mr4006540ebc.0.1337645759038; Mon, 21 May 2012 17:15:59 -0700 (PDT) Received: from hpza10.eem.corp.google.com ([74.125.121.33]) by gmr-mx.google.com with ESMTPS id b16si19567014eeg.3.2012.05.21.17.15.59 (version=TLSv1/SSLv3 cipher=AES128-SHA); Mon, 21 May 2012 17:15:59 -0700 (PDT) Received: from ccoutant.mtv.corp.google.com (ccoutant.mtv.corp.google.com [172.18.110.42]) by hpza10.eem.corp.google.com (Postfix) with ESMTP id 885DC200057; Mon, 21 May 2012 17:15:58 -0700 (PDT) Received: by ccoutant.mtv.corp.google.com (Postfix, from userid 62097) id 83FFBE0EA7; Mon, 21 May 2012 17:15:57 -0700 (PDT) To: reply@codereview.appspotmail.com, dnovillo@google.com, gcc-patches@gcc.gnu.org Subject: [google/gcc-4_6] More Fission updates (issue6219049) Message-Id: <20120522001557.83FFBE0EA7@ccoutant.mtv.corp.google.com> Date: Mon, 21 May 2012 17:15:57 -0700 (PDT) From: ccoutant@google.com (Cary Coutant) X-Gm-Message-State: ALoCoQmsrGWJR/ZSo0qUn0MamaDu126S6Urnqr7YzR0UvFOXBTyuKUEbKHo2mQ8maBSluaVbSxx4PAQeeMGnBXS8OMdrHexbK6F/uRTm57Bug9j2G4w2kuJkUqh7ZurKfCUCTo8GUaiqjy2hMK5/9LDJPxPk6krmeA== X-IsSubscribed: yes 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 This patch is for the google/gcc-4_6 branch. Fission improvements and bug fixes. Adds new DW_OP_GNU_const_index to handle TLS offsets in debug info. Adds -gpubnames/-gno-pubnames options to explicitly request .debug_pubnames/pubtypes sections. Adds style parameter to C/C++ pretty-printer so that we can get canonical pubnames without affecting diagnostic output. Bootstrapped and tested on x86_64. 2012-05-18 Sterling Augustine Cary Coutant include/ * dwarf2.h: Add DW_OP_GNU_const_index. gcc/ * opts.c (finish_options): -gfission implies -gpubnames. (common_handle_option): Pass empty arg string to set_debug_level. * common.opt (gno-fission): New option. (gfission): Remove JoinedOrMissing, add RejectNegative. (gno-pubnames, gpubnames): New options. * target.def (want_debug_pub_sections): Change default to false. * gcc.c (check_live_switch): Check -g options for -gno- options. * c-family/c-pretty-print.c (pp_c_specifier_qualifier_list): Add support for gnu_v3 style. * c-family/c-pretty-print.h (pp_c_flag_gnu_v3): New enum constant. * cp/error.c (dump_decl): Add support for gnu_v3 style. (decl_as_string): Likewise. (lang_decl_name): Likewise. * cp/cp-lang.c (cxx_dwarf_name): Likewise. * cp/cp-tree.h (enum overload_flags): Add TFF_MATCH_GNU_V3_DEMANGLER. * dwarf2out.c (dwarf_stack_op_name): Add DW_OP_GNU_const_index. (size_of_loc_descr): Likewise. (output_loc_operands): Likewise. (output_loc_operands_raw): Likewise. (want_pubnames): New macro. (dw_addr_op): New function. (new_addr_loc_descr): Call dw_addr_op. (add_AT_pubnames): Add DW_AT_GNU_pubnames/pubtypes only if generating .debug_pubnames/pubtypes sections. (add_pubname_string): Check for -gpubnames option. (add_pubname): Likewise. (add_pubtype): Likewise. (output_pubnames): Likewise. (mem_loc_descriptor): Call new_addr_loc_desc for TLS vars. (loc_list_from_tree): Likewise. (output_addr_table): Handle DW_OP_GNU_const_index. Add missing newline. (hash_loc_operands): Add DW_OP_GNU_const_index. (compare_loc_operands): Likewise. * testsuite/g++.old-deja/g++.pt/memtemp77.C: Revert earlier change to expected results. * testsuite/g++.dg/ext/pretty3.C: Likewise. * testsuite/g++.dg/warn/Wuninitializable-member.C: Likewise. * testsuite/g++.dg/warn/pr35711.C: Likewise. * testsuite/g++.dg/pr44486.C: Likewise. --- This patch is available for review at http://codereview.appspot.com/6219049 Index: include/dwarf2.h =================================================================== --- include/dwarf2.h (revision 187751) +++ include/dwarf2.h (working copy) @@ -546,8 +546,9 @@ enum dwarf_location_atom DW_OP_GNU_uninit = 0xf0, DW_OP_GNU_encoded_addr = 0xf1, DW_OP_GNU_implicit_pointer = 0xf2, - /* Extension for Fission. See http://gcc.gnu.org/wiki/DebugFission. */ + /* Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission. */ DW_OP_GNU_addr_index = 0xfb, + DW_OP_GNU_const_index = 0xfc, /* HP extensions. */ DW_OP_HP_unknown = 0xe0, /* Ouch, the same as GNU_push_tls_address. */ DW_OP_HP_is_value = 0xe1, Index: gcc/c-family/c-pretty-print.c =================================================================== --- gcc/c-family/c-pretty-print.c (revision 187751) +++ gcc/c-family/c-pretty-print.c (working copy) @@ -445,6 +445,9 @@ pp_c_specifier_qualifier_list (c_pretty_ { const enum tree_code code = TREE_CODE (t); + if (!(pp->flags & pp_c_flag_gnu_v3) && TREE_CODE (t) != POINTER_TYPE) + pp_c_type_qualifier_list (pp, t); + switch (code) { case REFERENCE_TYPE: @@ -489,7 +492,7 @@ pp_c_specifier_qualifier_list (c_pretty_ pp_simple_type_specifier (pp, t); break; } - if (TREE_CODE (t) != POINTER_TYPE) + if ((pp->flags & pp_c_flag_gnu_v3) && TREE_CODE (t) != POINTER_TYPE) pp_c_type_qualifier_list (pp, t); } Index: gcc/c-family/c-pretty-print.h =================================================================== --- gcc/c-family/c-pretty-print.h (revision 187751) +++ gcc/c-family/c-pretty-print.h (working copy) @@ -30,7 +30,8 @@ along with GCC; see the file COPYING3. typedef enum { pp_c_flag_abstract = 1 << 1, - pp_c_flag_last_bit = 2 + pp_c_flag_last_bit = 2, + pp_c_flag_gnu_v3 = 4 } pp_c_pretty_print_flags; Index: gcc/target.def =================================================================== --- gcc/target.def (revision 187751) +++ gcc/target.def (working copy) @@ -2795,7 +2795,7 @@ DEFHOOKPOD "True if the @code{.debug_pubtypes} and @code{.debug_pubnames} sections\ should be emitted. These sections are not used on most platforms, and\ in particular GDB does not use them.", - bool, true) + bool, false) DEFHOOKPOD (delay_sched2, "True if sched2 is not to be run at its normal place. \ Index: gcc/gcc.c =================================================================== --- gcc/gcc.c (revision 187751) +++ gcc/gcc.c (working copy) @@ -448,7 +448,7 @@ ignored. White space may also appear an colon in these constructs, except between . or * and the corresponding word. -The -O, -f, -m, and -W switches are handled specifically in these +The -O, -f, -g, -m, and -W switches are handled specifically in these constructs. If another value of -O or the negated form of a -f, -m, or -W switch is found later in the command line, the earlier switch value is ignored, except with {S*} where S is just one letter; this @@ -5867,7 +5867,7 @@ process_brace_body (const char *p, const on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*} spec, or -1 if either exact match or %* is used. - A -O switch is obsoleted by a later -O switch. A -f, -m, or -W switch + A -O switch is obsoleted by a later -O switch. A -f, -g, -m, or -W switch whose value does not begin with "no-" is obsoleted by the same value with the "no-", similarly for a switch with the "no-" prefix. */ @@ -5904,7 +5904,7 @@ check_live_switch (int switchnum, int pr } break; - case 'W': case 'f': case 'm': + case 'W': case 'f': case 'm': case 'g': if (! strncmp (name + 1, "no-", 3)) { /* We have Xno-YYY, search for XYYY. */ Index: gcc/testsuite/g++.old-deja/g++.pt/memtemp77.C =================================================================== --- gcc/testsuite/g++.old-deja/g++.pt/memtemp77.C (revision 187751) +++ gcc/testsuite/g++.old-deja/g++.pt/memtemp77.C (working copy) @@ -19,7 +19,7 @@ const char* S3::h(int) { return __ int main() { if (strcmp (S3::h(7), - "static char const* S3::h(U) [with U = int, T = double]") == 0) + "static const char* S3::h(U) [with U = int, T = double]") == 0) return 0; else return 1; Index: gcc/testsuite/g++.dg/ext/pretty3.C =================================================================== --- gcc/testsuite/g++.dg/ext/pretty3.C (revision 187751) +++ gcc/testsuite/g++.dg/ext/pretty3.C (working copy) @@ -16,4 +16,4 @@ int main () { printf ("%s\n", D().foo (0)); } -// { dg-final { scan-assembler "char const\\* D::foo\\(typename B::X\\)" } } +// { dg-final { scan-assembler "const char\\* D::foo\\(typename B::X\\)" } } Index: gcc/testsuite/g++.dg/warn/Wuninitializable-member.C =================================================================== --- gcc/testsuite/g++.dg/warn/Wuninitializable-member.C (revision 187751) +++ gcc/testsuite/g++.dg/warn/Wuninitializable-member.C (working copy) @@ -8,7 +8,7 @@ public: }; class Y { - const int var;// { dg-warning "non-static const member 'int const Y::var' in class without a constructor" } + const int var;// { dg-warning "non-static const member 'const int Y::var' in class without a constructor" } public: int g(){ return 2*var; } }; Index: gcc/testsuite/g++.dg/warn/pr35711.C =================================================================== --- gcc/testsuite/g++.dg/warn/pr35711.C (revision 187751) +++ gcc/testsuite/g++.dg/warn/pr35711.C (working copy) @@ -4,5 +4,5 @@ int* foo (volatile int *p) { - return (int*)p; // { dg-warning "cast from type 'int volatile\\*' to type 'int\\*' casts away qualifiers" } + return (int*)p; // { dg-warning "cast from type 'volatile int\\*' to type 'int\\*' casts away qualifiers" } } Index: gcc/testsuite/g++.dg/pr44486.C =================================================================== --- gcc/testsuite/g++.dg/pr44486.C (revision 187751) +++ gcc/testsuite/g++.dg/pr44486.C (working copy) @@ -7,4 +7,4 @@ namespace { S f() { const char * s = __P int main() { f(); } -// { dg-final { scan-assembler "S \\(anonymous namespace\\)::f" } } +// { dg-final { scan-assembler "S \{anonymous\}::f" } } Index: gcc/cp/error.c =================================================================== --- gcc/cp/error.c (revision 187751) +++ gcc/cp/error.c (working copy) @@ -974,7 +974,12 @@ dump_decl (tree t, int flags) dump_scope (CP_DECL_CONTEXT (t), flags); flags &= ~TFF_UNQUALIFIED_NAME; if (DECL_NAME (t) == NULL_TREE) - pp_cxx_ws_string (cxx_pp, M_("(anonymous namespace)")); + { + if (!(pp_c_base (cxx_pp)->flags & pp_c_flag_gnu_v3)) + pp_cxx_ws_string (cxx_pp, M_("{anonymous}")); + else + pp_cxx_ws_string (cxx_pp, M_("(anonymous namespace)")); + } else pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t)); } @@ -2459,7 +2464,10 @@ decl_as_string (tree decl, int flags) { reinit_cxx_pp (); pp_translate_identifiers (cxx_pp) = false; + if (flags & TFF_MATCH_GNU_V3_DEMANGLER) + pp_c_base (cxx_pp)->flags |= pp_c_flag_gnu_v3; dump_decl (decl, flags); + pp_c_base (cxx_pp)->flags &= ~pp_c_flag_gnu_v3; return pp_formatted_text (cxx_pp); } @@ -2494,8 +2502,9 @@ lang_decl_name (tree decl, int v, bool t if (TREE_CODE (decl) == FUNCTION_DECL) dump_function_name (decl, TFF_PLAIN_IDENTIFIER); - else if (DECL_NAME (decl) == NULL && TREE_CODE (decl) == NAMESPACE_DECL) - pp_string (cxx_pp, M_("(anonymous namespace)")); + else if ((DECL_NAME (decl) == NULL_TREE) + && TREE_CODE (decl) == NAMESPACE_DECL) + dump_decl (decl, TFF_PLAIN_IDENTIFIER); else dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER); Index: gcc/cp/cp-lang.c =================================================================== --- gcc/cp/cp-lang.c (revision 187751) +++ gcc/cp/cp-lang.c (working copy) @@ -185,8 +185,14 @@ cxx_dwarf_name (tree t, int verbosity) if (verbosity >= 2) return decl_as_string (t, TFF_DECL_SPECIFIERS | TFF_UNQUALIFIED_NAME - | TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS); + | TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS + | TFF_MATCH_GNU_V3_DEMANGLER); + /* decl_as_string handles namespaces--especially anonymous ones--more + appropriately for debugging than cxx_printable_name. But + cxx_printable_name handles templates and global ctors and dtors better. */ + if (TREE_CODE (t) == NAMESPACE_DECL) + return decl_as_string (t, TFF_MATCH_GNU_V3_DEMANGLER); return cxx_printable_name (t, verbosity); } Index: gcc/cp/cp-tree.h =================================================================== --- gcc/cp/cp-tree.h (revision 187751) +++ gcc/cp/cp-tree.h (working copy) @@ -4365,7 +4365,9 @@ enum overload_flags { NO_SPECIAL = 0, DT TFF_UNQUALIFIED_NAME: do not print the qualifying scope of the top-level entity. TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS: do not omit template arguments - identical to their defaults. */ + identical to their defaults. + TFF_MATCH_GNU_V3_DEMANGLER: match the GNU v3 demangler's names for anonymous + namespaces and order of type-qualifiers vs type-specifiers. */ #define TFF_PLAIN_IDENTIFIER (0) #define TFF_SCOPE (1) @@ -4381,6 +4383,7 @@ enum overload_flags { NO_SPECIAL = 0, DT #define TFF_NO_FUNCTION_ARGUMENTS (1 << 10) #define TFF_UNQUALIFIED_NAME (1 << 11) #define TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS (1 << 12) +#define TFF_MATCH_GNU_V3_DEMANGLER (1 << 13) /* Returns the TEMPLATE_DECL associated to a TEMPLATE_TEMPLATE_PARM node. */ Index: gcc/dwarf2out.c =================================================================== --- gcc/dwarf2out.c (revision 187751) +++ gcc/dwarf2out.c (working copy) @@ -4782,6 +4782,8 @@ dwarf_stack_op_name (unsigned int op) return "DW_OP_GNU_implicit_pointer"; case DW_OP_GNU_addr_index: return "DW_OP_GNU_addr_index"; + case DW_OP_GNU_const_index: + return "DW_OP_GNU_const_index"; default: return "OP_"; @@ -4903,6 +4905,7 @@ size_of_loc_descr (dw_loc_descr_ref loc) size += DWARF2_ADDR_SIZE; break; case DW_OP_GNU_addr_index: + case DW_OP_GNU_const_index: size += size_of_uleb128 (loc->dw_loc_oprnd1.val_index); break; case DW_OP_const1u: @@ -5284,8 +5287,9 @@ output_loc_operands (dw_loc_descr_ref lo break; case DW_OP_GNU_addr_index: + case DW_OP_GNU_const_index: dw2_asm_output_data_uleb128 (loc->dw_loc_oprnd1.val_index, - "(address index)"); + "(index into .debug_addr)"); break; case DW_OP_GNU_implicit_pointer: @@ -5357,6 +5361,7 @@ output_loc_operands_raw (dw_loc_descr_re { case DW_OP_addr: case DW_OP_GNU_addr_index: + case DW_OP_GNU_const_index: case DW_OP_implicit_value: /* We cannot output addresses in .cfi_escape, only bytes. */ gcc_unreachable (); @@ -5820,6 +5825,14 @@ const struct gcc_debug_hooks dwarf2_debu representation is done after the entire program has been compiled. The types below are used to describe the internal representation. */ +/* Whether to generate the DWARF accelerator tables in .debug_pubnames + and .debug_pubtypes. This is configured per-target, but can be + overridden by the -gpubnames or -gno-pubnames options. */ + +#define want_pubnames (debug_generate_pub_sections != -1 \ + ? debug_generate_pub_sections \ + : targetm.want_debug_pub_sections) + /* Various DIE's use offsets relative to the beginning of the .debug_info section to refer to each other. */ @@ -6589,17 +6602,30 @@ static bool generic_type_p (tree); static void schedule_generic_params_dies_gen (tree t); static void gen_scheduled_generic_parms_dies (void); +/* DW_OP_addr is relocated by the debug info consumer, while + tls relative operands should not be. */ + +static inline enum dwarf_location_atom dw_addr_op (bool dtprel) +{ + if (dtprel) + return (dwarf_split_debug_info ? DW_OP_GNU_const_index + : (DWARF2_ADDR_SIZE == 4 ? DW_OP_const4u : DW_OP_const8u)); + else + return (dwarf_split_debug_info ? DW_OP_GNU_addr_index : DW_OP_addr); +} + /* Return a pointer to a newly allocated address location description. If dwarf_split_debug_info is true, then record the address with the appropriate relocation. */ static inline dw_loc_descr_ref new_addr_loc_descr (rtx addr, int dtprel) { - dw_loc_descr_ref ref = new_loc_descr (DW_OP_addr, 0, 0); + dw_loc_descr_ref ref = new_loc_descr (dw_addr_op (dtprel), 0, 0); ref->dw_loc_oprnd1.val_class = dw_val_class_addr; ref->dw_loc_oprnd1.val_index = -1U; ref->dw_loc_oprnd1.v.val_addr = addr; + ref->dtprel = dtprel; if (dwarf_split_debug_info) { dw_attr_node attr; @@ -6610,7 +6636,6 @@ new_addr_loc_descr (rtx addr, int dtprel attr.dw_attr_val.val_index = -1U; attr.dw_attr_val.v.val_addr = addr; - ref->dw_loc_opc = DW_OP_GNU_addr_index; ref->dw_loc_oprnd1.val_index = add_addr_table_entry (&attr); } return ref; @@ -11931,10 +11956,13 @@ output_comp_unit (dw_die_ref die, int ou static void add_AT_pubnames (dw_die_ref die) { - /* FIXME: Should use add_AT_pubnamesptr. This works because most targets - don't care what the base section is. */ - add_AT_lineptr (die, DW_AT_GNU_pubnames, debug_pubnames_section_label); - add_AT_lineptr (die, DW_AT_GNU_pubtypes, debug_pubtypes_section_label); + if (want_pubnames) + { + /* FIXME: Should use add_AT_pubnamesptr. This works because most targets + don't care what the base section is. */ + add_AT_lineptr (die, DW_AT_GNU_pubnames, debug_pubnames_section_label); + add_AT_lineptr (die, DW_AT_GNU_pubtypes, debug_pubtypes_section_label); + } } /* Helper function to generate top-level dies for skeleton debug_info and @@ -12136,7 +12164,7 @@ dwarf2_name (tree decl, int scope) static void add_pubname_string (const char *str, dw_die_ref die) { - if (!GENERATE_MINIMUM_LINE_TABLE && targetm.want_debug_pub_sections) + if (!GENERATE_MINIMUM_LINE_TABLE && want_pubnames) { pubname_entry e; @@ -12149,7 +12177,7 @@ add_pubname_string (const char *str, dw_ static void add_pubname (tree decl, dw_die_ref die) { - if (!GENERATE_MINIMUM_LINE_TABLE && targetm.want_debug_pub_sections) + if (!GENERATE_MINIMUM_LINE_TABLE && want_pubnames) { if ((TREE_PUBLIC (decl) && !is_class_die (die->die_parent)) || is_cu_die (die->die_parent) || is_namespace_die (die->die_parent)) @@ -12182,7 +12210,7 @@ add_pubtype (tree decl, dw_die_ref die) { pubname_entry e; - if (!targetm.want_debug_pub_sections) + if (!want_pubnames) return; if ((TREE_PUBLIC (decl) @@ -12243,7 +12271,7 @@ output_pubnames (VEC (pubname_entry, gc) unsigned long pubnames_length = size_of_pubnames (names); pubname_ref pub; - if (!targetm.want_debug_pub_sections || !info_section_emitted) + if (!want_pubnames || !info_section_emitted) return; if (names == pubname_table) { @@ -14528,15 +14556,7 @@ mem_loc_descriptor (rtx rtl, enum machin if (!targetm.have_tls || !targetm.asm_out.output_dwarf_dtprel) break; - /* We used to emit DW_OP_addr here, but that's wrong, since - DW_OP_addr should be relocated by the debug info consumer, - while DW_OP_GNU_push_tls_address operand should not. */ - temp = new_loc_descr (DWARF2_ADDR_SIZE == 4 - ? DW_OP_const4u : DW_OP_const8u, 0, 0); - temp->dw_loc_oprnd1.val_class = dw_val_class_addr; - temp->dw_loc_oprnd1.val_index = -1U; - temp->dw_loc_oprnd1.v.val_addr = rtl; - temp->dtprel = true; + temp = new_addr_loc_descr (rtl, true); mem_loc_result = new_loc_descr (DW_OP_GNU_push_tls_address, 0, 0); add_loc_descr (&mem_loc_result, temp); @@ -16113,8 +16133,7 @@ loc_list_from_tree (tree loc, int want_a if (DECL_THREAD_LOCAL_P (loc)) { rtx rtl; - enum dwarf_location_atom first_op; - enum dwarf_location_atom second_op; + enum dwarf_location_atom tls_op; bool dtprel = false; if (targetm.have_tls) @@ -16132,9 +16151,8 @@ loc_list_from_tree (tree loc, int want_a operand shouldn't be. */ if (DECL_EXTERNAL (loc) && !targetm.binds_local_p (loc)) return 0; - first_op = DWARF2_ADDR_SIZE == 4 ? DW_OP_const4u : DW_OP_const8u; dtprel = true; - second_op = DW_OP_GNU_push_tls_address; + tls_op = DW_OP_GNU_push_tls_address; } else { @@ -16146,8 +16164,7 @@ loc_list_from_tree (tree loc, int want_a no longer appear in gimple code. We used the control variable in specific so that we could pick it up here. */ loc = DECL_VALUE_EXPR (loc); - first_op = DW_OP_addr; - second_op = DW_OP_form_tls_address; + tls_op = DW_OP_form_tls_address; } rtl = rtl_for_decl_location (loc); @@ -16160,19 +16177,8 @@ loc_list_from_tree (tree loc, int want_a if (! CONSTANT_P (rtl)) return 0; - if (dwarf_split_debug_info && first_op == DW_OP_addr) - ret = new_addr_loc_descr (rtl, dtprel); - else - { - ret = new_loc_descr (first_op, 0, 0); - ret->dw_loc_oprnd1.val_class = dw_val_class_addr; - ret->dw_loc_oprnd1.val_index = -1U; - ret->dw_loc_oprnd1.v.val_addr = rtl; - } - - ret->dtprel = dtprel; - - ret1 = new_loc_descr (second_op, 0, 0); + ret = new_addr_loc_descr (rtl, dtprel); + ret1 = new_loc_descr (tls_op, 0, 0); add_loc_descr (&ret, ret1); have_address = 1; @@ -23195,7 +23201,8 @@ output_addr_table (void) gcc_assert (targetm.asm_out.output_dwarf_dtprel); targetm.asm_out.output_dwarf_dtprel (asm_out_file, DWARF2_ADDR_SIZE, - AT_addr (node)); + node->dw_attr_val.v.val_addr); + fputc ('\n', asm_out_file); break; case dw_val_class_lbl_id: dw2_asm_output_addr (DWARF2_ADDR_SIZE, AT_lbl (node), "%s", name); @@ -23949,6 +23956,7 @@ hash_loc_operands (dw_loc_descr_ref loc, hash = iterative_hash_rtx (val1->v.val_addr, hash); break; case DW_OP_GNU_addr_index: + case DW_OP_GNU_const_index: { dw_attr_ref attr = VEC_index (dw_attr_node, addr_index_table, val1->val_index); @@ -24116,6 +24124,7 @@ compare_loc_operands (dw_loc_descr_ref x hash_addr: return rtx_equal_p (valx1->v.val_addr, valy1->v.val_addr); case DW_OP_GNU_addr_index: + case DW_OP_GNU_const_index: { dw_attr_node *attrx1 = VEC_index (dw_attr_node, addr_index_table, Index: gcc/opts.c =================================================================== --- gcc/opts.c (revision 187751) +++ gcc/opts.c (working copy) @@ -850,6 +850,10 @@ finish_options (struct gcc_options *opts /* Turn on -ffunction-sections when -freorder-functions=* is used. */ if (opts->x_flag_reorder_functions > 1) opts->x_flag_function_sections = 1; + + /* The -gfission option requires -gpubnames. */ + if (opts->x_dwarf_split_debug_info) + opts->x_debug_generate_pub_sections = 1; } #define LEFT_COLUMN 27 @@ -1714,7 +1718,7 @@ common_handle_option (struct gcc_options break; case OPT_gfission: - set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set, + set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "", opts, opts_set, loc); break; Index: gcc/common.opt =================================================================== --- gcc/common.opt (revision 187751) +++ gcc/common.opt (working copy) @@ -2374,8 +2374,12 @@ gdwarf- Common Joined UInteger Var(dwarf_version) Init(2) Negative(gstabs) Generate debug information in DWARF v2 (or later) format +gno-fission +Common Driver RejectNegative Var(dwarf_split_debug_info,0) Init(0) +Don't generate debug information in separate .dwo files + gfission -Common Driver JoinedOrMissing Var(dwarf_split_debug_info,1) +Common Driver RejectNegative Var(dwarf_split_debug_info,1) Generate debug information in separate .dwo files ggdb @@ -2386,6 +2390,14 @@ gmlt Common RejectNegative Generate debug information at level 1 with minimal line table +gno-pubnames +Common RejectNegative Var(debug_generate_pub_sections, 0) Init(-1) +Don't generate DWARF pubnames and pubtypes sections. + +gpubnames +Common RejectNegative Var(debug_generate_pub_sections, 1) +Generate DWARF pubnames and pubtypes sections. + gstabs Common JoinedOrMissing Negative(gstabs+) Generate debug information in STABS format