"Joseph S. Myers" <jos...@codesourcery.com> writes: [Sorry for dropping the ball on this for so long.]
> I still have no idea from your answer how a user is meant to know whether > to use the option when compiling, linking or both, which is what needs to > be clear from invoke.texi. > > What does it mean for the option to be supported for compiling but not > linking? What in that case will the linker do with compressed debug > sections on input? Combine them in some way, good or bad? Uncompress > them? > > Likewise, for it to be supported for linking but not compiling? Will the > linker then compress the uncompressed sections it receives on input? > > I think it would be better if the option semantics are more like "if you > pass the same option when both compiling and linking, the linked output > will have the sections appropriately compressed as specified by the > option, whether or not the individual .o files do" - and if this can't be > supported with the tools being used, don't allow the option. Ok, makes sense: although it may lose some of the capabilities of the toolchain (like gas/gld, where gas can write compressed debug, gld can read, but not write it), the user experience is certainly better. I thought about warning for an assembler not supporting compressed debug when -gz is passed, but that would only produce noise. So here's the revised patch. Tested on * i386-pc-solaris2.10 with gas/ld: gas could write but ld cannot read compressed debug, so reject all -gz options. * i386-pc-solaris2.11 with gas/ld: gas can write zlib-gnu format, ld can read and write all of them * x86_64-unknown-linux-gnu with gas/gold: gas can write, gold can read and write zlib-gnu format In every case, -gz and -gz=<format> behaved as expected as checked by inspecting the assembler and linker invocations and the resulting object files and executables. Ok for mainline now? Thanks. Rainer 2013-04-10 Rainer Orth <r...@cebitec.uni-bielefeld.de> gcc: * configure.ac (gcc_cv_as_compress_debug): Check for assembler compressed debug support. (gcc_cv_ld_compress_debug): Check for linker compressed debug support. * configure: Regenerate. * config.in: Regenerate. * common.opt (compressed_debug_sections): New enum. (gz, gz=): New options. * gcc.c (LINK_COMPRESS_DEBUG_SPEC, ASM_COMPRESS_DEBUG_SPEC): Define. (LINK_COMMAND_SPEC): Invoke LINK_COMPRESS_DEBUG_SPEC. (asm_options): Invoke ASM_COMPRESS_DEBUG_SPEC. * config/darwin.h (LINK_COMMAND_SPEC_A): Invoke LINK_COMPRESS_DEBUG_SPEC. * config/i386/djgpp.h (LINK_COMMAND_SPEC): Likewise. * opts.c (common_handle_option): Handle OPT_gz, OPT_gz_. * doc/invoke.texi (Option Summary, Debugging Options): Add -gz[=type]. (Debugging Options): Document -gz[=type].
# HG changeset patch # Parent 461334df01269c96bf9f041380cfc901c395307d Enable --compress-debug-sections diff --git a/gcc/common.opt b/gcc/common.opt --- a/gcc/common.opt +++ b/gcc/common.opt @@ -2518,6 +2518,28 @@ gxcoff+ Common JoinedOrMissing Negative(gcoff) Generate debug information in extended XCOFF format +Enum +Name(compressed_debug_sections) Type(int) + +; Since -gz= is completely handled in specs, the values aren't used and we +; assign arbitrary constants. +EnumValue +Enum(compressed_debug_sections) String(none) Value(0) + +EnumValue +Enum(compressed_debug_sections) String(zlib) Value(1) + +EnumValue +Enum(compressed_debug_sections) String(zlib-gnu) Value(2) + +gz +Common Driver +Generate compressed debug sections + +gz= +Common Driver Joined Enum(compressed_debug_sections) +-gz=<format> Generate compressed debug sections in format <format> + h Driver Joined Separate diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h --- a/gcc/config/darwin.h +++ b/gcc/config/darwin.h @@ -171,7 +171,8 @@ extern GTY(()) int darwin_ms_struct; LINK_PLUGIN_SPEC \ "%{flto*:%<fcompare-debug*} \ %{flto*} \ - %l %X %{s} %{t} %{Z} %{u*} \ + %l " LINK_COMPRESS_DEBUG_SPEC \ + "%X %{s} %{t} %{Z} %{u*} \ %{e*} %{r} \ %{o*}%{!o:-o a.out} \ %{!nostdlib:%{!nostartfiles:%S}} \ diff --git a/gcc/config/i386/djgpp.h b/gcc/config/i386/djgpp.h --- a/gcc/config/i386/djgpp.h +++ b/gcc/config/i386/djgpp.h @@ -80,7 +80,8 @@ along with GCC; see the file COPYING3. #undef LINK_COMMAND_SPEC #define LINK_COMMAND_SPEC \ "%{!fsyntax-only: \ -%{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{e*} %{N} %{n} \ +%{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l " LINK_COMPRESS_DEBUG_SPEC \ +"%X %{o*} %{e*} %{N} %{n} \ \t%{r} %{s} %{t} %{u*} %{z} %{Z}\ \t%{!nostdlib:%{!nostartfiles:%S}}\ \t%{static:} %{L*} %D %o\ diff --git a/gcc/configure.ac b/gcc/configure.ac --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -4370,6 +4370,30 @@ if test x"$insn" != x; then [Define if your assembler supports the --debug-prefix-map option.])]) fi +gcc_GAS_CHECK_FEATURE([compressed debug sections], + gcc_cv_as_compress_debug,,[--compress-debug-sections],, + [# gas compiled without zlib cannot compress debug sections and warns + # about it, but still exits successfully. So check for this, too. + if $gcc_cv_as --compress-debug-sections -o conftest.o conftest.s 2>&1 | grep -i warning > /dev/null + then + gcc_cv_as_compress_debug=0 + elif $gcc_cv_as --compress-debug-sections -o conftest.o conftest.s > /dev/null 2>&1 + then + gcc_cv_as_compress_debug=1 + gcc_cv_as_compress_debug_option="--compress-debug-sections" + gcc_cv_as_no_compress_debug_option="--nocompress-debug-sections" + else + gcc_cv_as_compress_debug=0 + # FIXME: Future gas versions will support ELF gABI style via + # --compress-debug-sections[=type]. + fi]) +AC_DEFINE_UNQUOTED(HAVE_AS_COMPRESS_DEBUG, $gcc_cv_as_compress_debug, +[Define to the level of your assembler's compressed debug section support.]) +AC_DEFINE_UNQUOTED(AS_COMPRESS_DEBUG_OPTION, "$gcc_cv_as_compress_debug_option", +[Define to the assembler option to enable compressed debug sections.]) +AC_DEFINE_UNQUOTED(AS_NO_COMPRESS_DEBUG_OPTION, "$gcc_cv_as_no_compress_debug_option", +[Define to the assembler option to disable compressed debug sections.]) + gcc_GAS_CHECK_FEATURE([.lcomm with alignment], gcc_cv_as_lcomm_with_alignment, ,, [.lcomm bar,4,16],, @@ -4676,6 +4700,60 @@ if test x$gcc_cv_ld_eh_gc_sections_bug = fi AC_MSG_RESULT($gcc_cv_ld_eh_gc_sections_bug) +AC_MSG_CHECKING(linker for compressed debug sections) +# gold/gld support compressed debug sections since binutils 2.19/2.21 +if test $in_tree_ld = yes ; then + gcc_cv_ld_compress_debug=0 + if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 19 -o "$gcc_cv_gld_major_version" -gt 2 \ + && test $in_tree_ld_is_elf = yes && test $ld_is_gold = yes; then + gcc_cv_ld_compress_debug=2 + gcc_cv_ld_compress_debug_option="--compress-debug-sections" + elif test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 21 -o "$gcc_cv_gld_major_version" -gt 2 \ + && test $in_tree_ld_is_elf = yes; then + gcc_cv_ld_compress_debug=1 + fi +elif echo "$ld_ver" | grep GNU > /dev/null; then + gcc_cv_ld_compress_debug=1 + if test 0"$ld_date" -lt 20050308; then + if test -n "$ld_date"; then + # If there was date string, but was earlier than 2005-03-08, fail + gcc_cv_ld_compress_debug=0 + elif test "$ld_vers_major" -lt 2; then + gcc_cv_ld_compress_debug=0 + elif test "$ld_vers_major" -eq 2 -a "$ld_vers_minor" -lt 21; then + gcc_cv_ld_compress_debug=0 + fi + fi + if test $ld_is_gold = yes; then + gcc_cv_ld_compress_debug=2 + gcc_cv_ld_compress_debug_option="--compress-debug-sections" + fi +else +changequote(,)dnl + case "${target}" in + *-*-solaris2*) + # Introduced in Solaris 11.2. + if $gcc_cv_ld --help 2>&1 | grep -- '-z compress-sections' > /dev/null; then + gcc_cv_ld_compress_debug=3 + gcc_cv_ld_compress_debug_option="-z compress-sections" + else + gcc_cv_ld_compress_debug=0 + fi + ;; + *) + # Assume linkers other than GNU ld don't support compessed debug + # sections. + gcc_cv_ld_compress_debug=0 + ;; + esac +changequote([,])dnl +fi +AC_DEFINE_UNQUOTED(HAVE_LD_COMPRESS_DEBUG, $gcc_cv_ld_compress_debug, +[Define to the level of your linker's compressed debug section support.]) +AC_DEFINE_UNQUOTED(LD_COMPRESS_DEBUG_OPTION, "$gcc_cv_ld_compress_debug_option", +[Define to the linker option to enable compressed debug sections.]) +AC_MSG_RESULT($gcc_cv_ld_compress_debug) + # -------- # UNSORTED # -------- diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -344,7 +344,7 @@ Objective-C and Objective-C++ Dialects}. -g -g@var{level} -gtoggle -gcoff -gdwarf-@var{version} @gol -ggdb -grecord-gcc-switches -gno-record-gcc-switches @gol -gstabs -gstabs+ -gstrict-dwarf -gno-strict-dwarf @gol --gvms -gxcoff -gxcoff+ @gol +-gvms -gxcoff -gxcoff+ -gz@r{[}=@var{type}@r{]} @gol -fno-merge-debug-strings -fno-dwarf2-cfi-asm @gol -fdebug-prefix-map=@var{old}=@var{new} @gol -femit-struct-debug-baseonly -femit-struct-debug-reduced @gol @@ -5274,6 +5274,18 @@ DWARF extensions from later standard ver Allow using extensions of later DWARF standard version than selected with @option{-gdwarf-@var{version}}. +@item -gz@r{[}=@var{type}@r{]} +@opindex gz +Produce compressed debug sections in DWARF format, if that is supported. +If @var{type} is not given, the default type depends on the capabilities +of the assembler and linker used. If the linker doesn't support writing +compressed debug sections, the option is rejected. Otherwise, if the +assembler doesn't support them, @option{-gz} is silently ignored when +producing object files. @var{type} may be one of @option{none} (don't +compress debug sections), @option{zlib} (use zlib compression in ELF +gABI format), or @option{zlib-gnu} (use zlib compression in traditional +GNU format). + @item -gvms @opindex gvms Produce debugging information in Alpha/VMS debug format (if that is diff --git a/gcc/gcc.c b/gcc/gcc.c --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -597,6 +597,31 @@ proper position among the other output f #endif #endif +/* Linker options for compressed debug sections. */ +#if HAVE_LD_COMPRESS_DEBUG == 0 +/* No linker support. */ +#define LINK_COMPRESS_DEBUG_SPEC \ + " %{gz*:%e-gz is not supported in this configuration} " +#elif HAVE_LD_COMPRESS_DEBUG == 1 +/* GNU style on input, GNU ld options. Reject, not useful. */ +#define LINK_COMPRESS_DEBUG_SPEC \ + " %{gz*:%e-gz is not supported in this configuration} " +#elif HAVE_LD_COMPRESS_DEBUG == 2 +/* GNU style, GNU gold options. */ +#define LINK_COMPRESS_DEBUG_SPEC \ + " %{gz|gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \ + " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \ + " %{gz=zlib:%e-gz=zlib is not supported in this configuration} " +#elif HAVE_LD_COMPRESS_DEBUG == 3 +/* ELF gABI style. */ +#define LINK_COMPRESS_DEBUG_SPEC \ + " %{gz|gz=zlib:" LD_COMPRESS_DEBUG_OPTION "=zlib}" \ + " %{gz=none:" LD_COMPRESS_DEBUG_OPTION "=none}" \ + " %{gz=zlib-gnu:" LD_COMPRESS_DEBUG_OPTION "=zlib-gnu} " +#else +#error Unknown value for HAVE_LD_COMPRESS_DEBUG. +#endif + /* config.h can define LIBGCC_SPEC to override how and when libgcc.a is included. */ #ifndef LIBGCC_SPEC @@ -631,6 +656,33 @@ proper position among the other output f #define ASM_MAP "" #endif +/* Assembler options for compressed debug sections. */ +#if HAVE_LD_COMPRESS_DEBUG < 2 +/* Reject if the linker cannot write compressed debug sections. */ +#define ASM_COMPRESS_DEBUG_SPEC \ + " %{gz*:%e-gz is not supported in this configuration} " +#else /* HAVE_LD_COMPRESS_DEBUG >= 2 */ +#if HAVE_AS_COMPRESS_DEBUG == 0 +/* No assembler support. Ignore silently. */ +#define ASM_COMPRESS_DEBUG_SPEC \ + " %{gz*:} " +#elif HAVE_AS_COMPRESS_DEBUG == 1 +/* GNU style, GNU as options. */ +#define ASM_COMPRESS_DEBUG_SPEC \ + " %{gz|gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION "}" \ + " %{gz=none:" AS_NO_COMPRESS_DEBUG_OPTION "}" \ + " %{gz=zlib:%e-gz=zlib is not supported in this configuration} " +#elif HAVE_AS_COMPRESS_DEBUG == 2 +/* ELF gABI style. */ +#define ASM_COMPRESS_DEBUG_SPEC \ + " %{gz|gz=zlib:" AS_COMPRESS_DEBUG_OPTION "=zlib}" \ + " %{gz=none:" AS_COMPRESS_DEBUG_OPTION "=none}" \ + " %{gz=zlib-gnu:" AS_COMPRESS_DEBUG_OPTION "=zlib-gnu} " +#else +#error Unknown value for HAVE_AS_COMPRESS_DEBUG. +#endif +#endif /* HAVE_LD_COMPRESS_DEBUG >= 2 */ + /* Define ASM_DEBUG_SPEC to be a spec suitable for translating '-g' to the assembler. */ #ifndef ASM_DEBUG_SPEC @@ -761,8 +813,8 @@ proper position among the other output f LINK_PLUGIN_SPEC \ "%{flto|flto=*:%<fcompare-debug*} \ %{flto} %{flto=*} %l " LINK_PIE_SPEC \ - "%{fuse-ld=*:-fuse-ld=%*}\ - %X %{o*} %{e*} %{N} %{n} %{r}\ + "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \ + "%X %{o*} %{e*} %{N} %{n} %{r}\ %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} " VTABLE_VERIFICATION_SPEC " \ %{static:} %{L*} %(mfwrap) %(link_libgcc) " SANITIZER_EARLY_SPEC " %o\ %{fopenmp|ftree-parallelize-loops=*:%:include(libgomp.spec)%(link_gomp)}\ @@ -885,6 +937,7 @@ static const char *asm_options = to the assembler equivalents. */ "%{v} %{w:-W} %{I*} " #endif +ASM_COMPRESS_DEBUG_SPEC "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}"; static const char *invoke_as = diff --git a/gcc/opts.c b/gcc/opts.c --- a/gcc/opts.c +++ b/gcc/opts.c @@ -1867,6 +1867,11 @@ common_handle_option (struct gcc_options loc); break; + case OPT_gz: + case OPT_gz_: + /* Handled completely via specs. */ + break; + case OPT_pedantic_errors: dc->pedantic_errors = 1; control_warning_option (OPT_Wpedantic, DK_ERROR, value,
-- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University