From patchwork Fri Jun 17 23:46:34 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sandra Loosemore X-Patchwork-Id: 100881 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 9CE8EB6FE2 for ; Sat, 18 Jun 2011 09:47:47 +1000 (EST) Received: (qmail 16380 invoked by alias); 17 Jun 2011 23:47:46 -0000 Received: (qmail 16370 invoked by uid 22791); 17 Jun 2011 23:47:45 -0000 X-SWARE-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL, BAYES_00, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 17 Jun 2011 23:47:31 +0000 Received: (qmail 9603 invoked from network); 17 Jun 2011 23:47:30 -0000 Received: from unknown (HELO ?192.168.2.2?) (sandra@127.0.0.2) by mail.codesourcery.com with ESMTPA; 17 Jun 2011 23:47:30 -0000 Message-ID: <4DFBE75A.6010405@codesourcery.com> Date: Fri, 17 Jun 2011 17:46:34 -0600 From: Sandra Loosemore User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101208 Lightning/1.0b2 Thunderbird/3.1.7 MIME-Version: 1.0 To: gcc-patches@gcc.gnu.org Subject: PATCH: fix collect2 handling of --demangle and --no-demangle 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 We had a bug report from a customer that the linker was ignoring the --demangle and --no-demangle options when generating map files. Moreover, it was failing in a host-dependent way; on Windows hosts, it was always emitting demangled names in the map file, while on Linux hosts, it never did. Moreover, on Windows hosts it also ignored the setting of the COLLECT_NO_DEMANGLE environment variable. This turns out to be a problem in collect2, or actually, three problems: (1) By default, collect2 is configured to filter out --demangle and --no-demangle from the linker options, and it tries to do demangling on symbol names in stdout and stderr itself instead. But, it is too stupid to know about the map file. (2) Collect2 is trying to set COLLECT_NO_DEMANGLE to disable demangling in ld, but in a nonportable way that causes it to be always unset instead on Windows. (3) If you configure with --with-demangler-in-ld to try to disable the collect2 demangling, there's another bug that causes it to ignore any explicit --demangle or --no-demangle options and only pay attention to whether or not COLLECT_NO_DEMANGLE is set. The attached patch addresses all three problems: (1) I've flipped the default to --with-demangler-in-ld=yes. Note that configure.ac already takes care not to let this percolate through to collect2 without verifying that the linker is GNU ld and that it is a version that supports --demangle. Perhaps back in 2004 when this option was first added, the ld demangling support was deemed too experimental to make it the default, but that's surely not the case any more. Also, since this has been broken since 2004, I'm not sure there's much reason to be concerned with backwards compatibility, here.... (2) I fixed the COLLECT_NO_DEMANGLE environment variable setting recipe. (3) I simplified the argument processing for --demangle and --no-demangle to pass them straight through to the linker when HAVE_LD_DEMANGLE is defined. OK to commit? -Sandra 2011-06-17 Sandra Loosemore gcc/ * configure.ac (demangler_in_ld): Default to yes. * configure: Regenerated. * collect2.c (main): When HAVE_LD_DEMANGLE is defined, don't mess with COLLECT_NO_DEMANGLE, and just pass --demangle and --no-demangle options straight through to ld. When HAVE_LD_DEMANGLE is not defined, set COLLECT_NO_DEMANGLE in a way that has the intended effect on Windows. Index: configure.ac =================================================================== --- configure.ac (revision 175123) +++ configure.ac (working copy) @@ -222,7 +222,7 @@ fi AC_ARG_WITH(demangler-in-ld, [AS_HELP_STRING([--with-demangler-in-ld], [try to use demangler in GNU ld])], demangler_in_ld="$with_demangler_in_ld", -demangler_in_ld=no) +demangler_in_ld=yes) # ---------------------- # Find default assembler Index: configure =================================================================== --- configure (revision 175123) +++ configure (working copy) @@ -3413,7 +3413,7 @@ fi if test "${with_demangler_in_ld+set}" = set; then : withval=$with_demangler_in_ld; demangler_in_ld="$with_demangler_in_ld" else - demangler_in_ld=no + demangler_in_ld=yes fi Index: collect2.c =================================================================== --- collect2.c (revision 175123) +++ collect2.c (working copy) @@ -1112,10 +1112,12 @@ main (int argc, char **argv) num_c_args = argc + 9; +#ifndef HAVE_LD_DEMANGLE no_demangle = !! getenv ("COLLECT_NO_DEMANGLE"); /* Suppress demangling by the real linker, which may be broken. */ - putenv (xstrdup ("COLLECT_NO_DEMANGLE=")); + putenv (xstrdup ("COLLECT_NO_DEMANGLE=1")); +#endif #if defined (COLLECT2_HOST_INITIALIZATION) /* Perform system dependent initialization, if necessary. */ @@ -1405,12 +1407,6 @@ main (int argc, char **argv) /* After the first file, put in the c++ rt0. */ first_file = 1; -#ifdef HAVE_LD_DEMANGLE - if (!demangle_flag && !no_demangle) - demangle_flag = "--demangle"; - if (demangle_flag) - *ld1++ = *ld2++ = demangle_flag; -#endif while ((arg = *++argv) != (char *) 0) { *ld1++ = *ld2++ = arg; @@ -1514,16 +1510,16 @@ main (int argc, char **argv) case '-': if (strcmp (arg, "--no-demangle") == 0) { - demangle_flag = arg; +#ifndef HAVE_LD_DEMANGLE no_demangle = 1; ld1--; ld2--; +#endif } else if (strncmp (arg, "--demangle", 10) == 0) { - demangle_flag = arg; - no_demangle = 0; #ifndef HAVE_LD_DEMANGLE + no_demangle = 0; if (arg[10] == '=') { enum demangling_styles style @@ -1533,9 +1529,9 @@ main (int argc, char **argv) else current_demangling_style = style; } -#endif ld1--; ld2--; +#endif } else if (strncmp (arg, "--sysroot=", 10) == 0) target_system_root = arg + 10;