This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [build, driver] RFC: Support compressed debug sections
- From: Rainer Orth <ro at CeBiTec dot Uni-Bielefeld dot DE>
- To: "Joseph S. Myers" <joseph at codesourcery dot com>
- Cc: <gcc-patches at gcc dot gnu dot org>, Paolo Bonzini <bonzini at gnu dot org>
- Date: Thu, 22 May 2014 13:45:19 +0200
- Subject: Re: [build, driver] RFC: Support compressed debug sections
- Authentication-results: sourceware.org; auth=none
- References: <yddvc7tmhx9 dot fsf at lokon dot CeBiTec dot Uni-Bielefeld dot DE> <Pine dot LNX dot 4 dot 64 dot 1304261553200 dot 27966 at digraph dot polyomino dot org dot uk> <yddd2tcazm5 dot fsf at lokon dot CeBiTec dot Uni-Bielefeld dot DE> <Pine dot LNX dot 4 dot 64 dot 1305032000020 dot 30366 at digraph dot polyomino dot org dot uk> <yddfvy2l9xa dot fsf at CeBiTec dot Uni-Bielefeld dot DE> <Pine dot LNX dot 4 dot 64 dot 1305051411440 dot 16386 at digraph dot polyomino dot org dot uk>
"Joseph S. Myers" <joseph@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 <ro@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