From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28899 invoked by alias); 5 Nov 2007 07:19:27 -0000 Received: (qmail 28891 invoked by uid 22791); 5 Nov 2007 07:19:26 -0000 X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 05 Nov 2007 07:19:24 +0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.13.8/8.13.1) with ESMTP id lA57JMa8001063; Mon, 5 Nov 2007 02:19:22 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [10.11.255.20]) by int-mx1.corp.redhat.com (8.13.1/8.13.1) with ESMTP id lA57JM9m016379; Mon, 5 Nov 2007 02:19:22 -0500 Received: from free.oliva.athome.lsd.ic.unicamp.br (vpn-14-147.rdu.redhat.com [10.11.14.147]) by pobox.corp.redhat.com (8.13.1/8.13.1) with ESMTP id lA57JKhW004231; Mon, 5 Nov 2007 02:19:21 -0500 Received: from free.oliva.athome.lsd.ic.unicamp.br (localhost.localdomain [127.0.0.1]) by free.oliva.athome.lsd.ic.unicamp.br (8.14.1/8.14.1) with ESMTP id lA57JJnL007335; Mon, 5 Nov 2007 05:19:19 -0200 Received: (from aoliva@localhost) by free.oliva.athome.lsd.ic.unicamp.br (8.14.1/8.14.1/Submit) id lA57JHMC007023; Mon, 5 Nov 2007 05:19:17 -0200 To: gcc-patches@gcc.gnu.org, dj@redhat.com Subject: stabilize .gcc_except_table with or without -g From: Alexandre Oliva Errors-To: aoliva@oliva.athome.lsd.ic.unicamp.br Date: Mon, 05 Nov 2007 07:19:00 -0000 Message-ID: User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.1 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2007-11/txt/msg00164.txt.bz2 --=-=-= Content-length: 1255 In Java, on x86_64-linux-gnu (both -m32 and -m64 IIRC) .gcc_except_table action record tables are sometimes output using dw2_asm_output_encoded_addr_rtx(), which, with indirect addressing, forces expressions into memory using a splay tree that uses string *pointers* as keys. These pointers are not stable, so the order in which the splay tree entries are output by dw2_output_indirect_constants() varies depending on where the symbol names are located in memory. Their locations often change when -g is given, so we end up generating code that wouldn't pass compare-debug. I haven't completed bootstrap-testing of this patch yet, but it has shaved off more than half of the remaining compare-debug differences between libjava compiled with -fvar-tracking-assignments enabled or disabled on x86_64-linux-gnu. Ok to install if it passes bootstrap? Should new the compare function be moved into libiberty proper? Does the assertion check seem safe in the context of this use, that when pointers differ then the strings they point to must differ as well? It's not necessary, but I thought it would be nice to make sure we weren't goofing with identical symbol names at different locations before. I could be easily convinced to take it out, though. --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=gcc-stabilize-dw2-force-const-mem.patch Content-length: 1548 for gcc/ChangeLog .vta? from Alexandre Oliva * dwarf2asm.c (splay_tree_compare_strings): New function. (dw2_force_const_mem): Use it. Index: gcc/dwarf2asm.c =================================================================== --- gcc/dwarf2asm.c.orig 2007-11-05 04:51:08.000000000 -0200 +++ gcc/dwarf2asm.c 2007-11-05 02:20:11.000000000 -0200 @@ -701,6 +701,28 @@ static GTY(()) int dw2_const_labelno; # define USE_LINKONCE_INDIRECT 0 #endif +/* Compare C strings used as keys in a splay tree, optimizing the case + in which the pointers are identical. We need to use string rather + than pointer comparison in order to make Java exception action + records stable in the presence of different debug info options. */ + +static int +splay_tree_compare_strings (splay_tree_key k1, splay_tree_key k2) +{ + const char *s1 = (const char *)k1; + const char *s2 = (const char *)k2; + int ret; + + if (s1 == s2) + return 0; + + ret = strcmp (s1, s2); + + gcc_assert (ret); + + return ret; +} + /* Put X, a SYMBOL_REF, in memory. Return a SYMBOL_REF to the allocated memory. Differs from force_const_mem in that a single pool is used for the entire unit of translation, and the memory is not guaranteed to be @@ -715,7 +737,7 @@ dw2_force_const_mem (rtx x, bool public) tree decl; if (! indirect_pool) - indirect_pool = splay_tree_new_ggc (splay_tree_compare_pointers); + indirect_pool = splay_tree_new_ggc (splay_tree_compare_strings); gcc_assert (GET_CODE (x) == SYMBOL_REF); --=-=-= Content-length: 249 -- Alexandre Oliva http://www.lsd.ic.unicamp.br/~oliva/ FSF Latin America Board Member http://www.fsfla.org/ Red Hat Compiler Engineer aoliva@{redhat.com, gcc.gnu.org} Free Software Evangelist oliva@{lsd.ic.unicamp.br, gnu.org} --=-=-=--