As described in PR PR target/67973, newer assemblers on Mac OS X, which
are based on LLVM instead of gas, don't support .stab* directives any
longer. The following patch detects this situation and tries to fall
back to the older gas-based as if it is still accessible via as -Q.
Tested on x86_64-apple-darwin15.2.0 and as expected the -gstabs* tests
now pass.
However, I'm not really comfortable with this solution. Initially, I
forgot to wrap the -Q option to as in %{gstabs*:...}, which lead to a
bootstrap failure: the gas- and LLVM-based assemblers differ in a
number of other ways, as can be seen when comparing gcc/auto-host.h:
--- build.llvm-as/gcc/auto-host.h 2015-11-27 10:53:31.000000000 +0100
+++ build.gas/gcc/auto-host.h 2015-12-04 20:25:30.000000000 +0100
@@ -351 +357 @@
-/* #undef HAVE_AS_GDWARF2_DEBUG_FLAG */
+#define HAVE_AS_GDWARF2_DEBUG_FLAG 1
@@ -369 +375 @@
-/* #undef HAVE_AS_GSTABS_DEBUG_FLAG */
+#define HAVE_AS_GSTABS_DEBUG_FLAG 1
@@ -388 +394 @@
-/* #undef HAVE_AS_IX86_FFREEP */
+#define HAVE_AS_IX86_FFREEP 1
@@ -412 +418 @@
-#define HAVE_AS_IX86_INTERUNIT_MOVQ 1
+#define HAVE_AS_IX86_INTERUNIT_MOVQ 0
@@ -424 +430 @@
-#define HAVE_AS_IX86_REP_LOCK_PREFIX 1
+/* #undef HAVE_AS_IX86_REP_LOCK_PREFIX */
@@ -1176 +1182 @@
-#define HAVE_GAS_CFI_PERSONALITY_DIRECTIVE 1
+#define HAVE_GAS_CFI_PERSONALITY_DIRECTIVE 0
@@ -1179 +1185 @@
-#define HAVE_GAS_CFI_SECTIONS_DIRECTIVE 1
+#define HAVE_GAS_CFI_SECTIONS_DIRECTIVE 0
@@ -1183 +1189 @@
-#define HAVE_GAS_DISCRIMINATOR 1
+/* #undef HAVE_GAS_DISCRIMINATOR */
@@ -1298 +1304 @@
-#define HAVE_GNU_AS 0
+#define HAVE_GNU_AS 1
So, we can be pretty certain to hit cases where some file compiles and
assembles without -gstabs, but fails to assemble with -gstabs. Not
exactly the user experience I prefer.
Given this, I'd rather have us not support stabs at all than via this
half-hearted approach.
What do you think?
Rainer
2015-12-11 Rainer Orth <[email protected]>
PR target/67973
* configure.ac (gcc_cv_as_stabs_directive): New test.
(gcc_cv_as_darwin_stabs_Q): New test.
* configure: Regenerate.
* config.in: Regenerate.
* config/darwin.h (DBX_DEBUGGING_INFO): Wrap in
HAVE_AS_STABS_DIRECTIVE.
(PREFERRED_DEBUGGING_TYPE): Likewise.
* config/i386/darwin.h (PREFERRED_DEBUGGING_TYPE): Only include
DBX_DEBUG if HAVE_AS_STABS_DIRECTIVE.
(ASM_STABS_Q_SPEC): Define.
(ASM_SPEC): Use it.
# HG changeset patch
# Parent 7029fd86ac40d7ff34e1c43d729c6bf469416643
Only support -gstabs on Mac OS X if assember supports it (PR target/67973)
diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
--- a/gcc/config/darwin.h
+++ b/gcc/config/darwin.h
@@ -400,12 +400,13 @@ extern GTY(()) int darwin_ms_struct;
#define ASM_DEBUG_SPEC "%{g*:%{!g0:%{!gdwarf*:--gstabs}}}"
-/* We still allow output of STABS. */
-
+/* We still allow output of STABS if the assembler supports it. */
+#ifdef HAVE_AS_STABS_DIRECTIVE
#define DBX_DEBUGGING_INFO 1
+#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
+#endif
#define DWARF2_DEBUGGING_INFO 1
-#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
#define DEBUG_FRAME_SECTION "__DWARF,__debug_frame,regular,debug"
#define DEBUG_INFO_SECTION "__DWARF,__debug_info,regular,debug"
diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h
--- a/gcc/config/i386/darwin.h
+++ b/gcc/config/i386/darwin.h
@@ -111,9 +111,16 @@ extern int darwin_emit_branch_islands;
%{g: %{!fno-eliminate-unused-debug-symbols: -feliminate-unused-debug-symbols }} " \
DARWIN_CC1_SPEC
+/* Pass -Q to assembler if necessary for stabs support. */
+#ifdef HAVE_AS_DARWIN_STABS_Q
+#define ASM_STABS_Q_SPEC " %{gstabs*:-Q}"
+#else
+#define ASM_STABS_Q_SPEC ""
+#endif
+
#undef ASM_SPEC
#define ASM_SPEC "-arch %(darwin_arch) -force_cpusubtype_ALL \
- %{static}"
+ %{static}" ASM_STABS_Q_SPEC
#define DARWIN_ARCH_SPEC "%{m64:x86_64;:i386}"
#define DARWIN_SUBARCH_SPEC DARWIN_ARCH_SPEC
@@ -226,7 +233,11 @@ do { \
compiles default to stabs+. darwin9+ defaults to dwarf-2. */
#ifndef DARWIN_PREFER_DWARF
#undef PREFERRED_DEBUGGING_TYPE
+#ifdef HAVE_AS_STABS_DIRECTIVE
#define PREFERRED_DEBUGGING_TYPE (TARGET_64BIT ? DWARF2_DEBUG : DBX_DEBUG)
+#else
+#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
+#endif
#endif
/* Darwin uses the standard DWARF register numbers but the default
diff --git a/gcc/configure.ac b/gcc/configure.ac
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -2909,6 +2909,11 @@ AC_DEFINE_UNQUOTED(HAVE_GAS_SHF_MERGE,
[`if test $gcc_cv_as_shf_merge = yes; then echo 1; else echo 0; fi`],
[Define 0/1 if your assembler supports marking sections with SHF_MERGE flag.])
+gcc_GAS_CHECK_FEATURE([stabs directive], gcc_cv_as_stabs_directive, ,,
+[.stabs "gcc2_compiled.",60,0,0,0],,
+[AC_DEFINE(HAVE_AS_STABS_DIRECTIVE, 1,
+ [Define if your assembler supports .stabs.])])
+
gcc_GAS_CHECK_FEATURE([COMDAT group support (GNU as)],
gcc_cv_as_comdat_group,
[elf,2,16,0], [--fatal-warnings],
@@ -3619,6 +3624,26 @@ AC_DEFINE_UNQUOTED(HAVE_LTO_PLUGIN, $gcc
[Define to the level of your linker's plugin support.])
AC_MSG_RESULT($gcc_cv_lto_plugin)
+# Target OS-specific assembler checks.
+
+case "$target_os" in
+ darwin*)
+ # If the default assembler doesn't support .stabs, check if the
+ # gas-based one does.
+ if test x$gcc_cv_as_stabs_directive = xno; then
+ gcc_GAS_CHECK_FEATURE([.stabs directive via -Q],
+ gcc_cv_as_darwin_stabs_Q,, [-Q],
+ [.stabs "gcc2_compiled.",60,0,0,0],,
+ [AC_DEFINE(HAVE_AS_STABS_DIRECTIVE, 1,
+ [Define if your assembler supports .stabs.])
+ AC_DEFINE(HAVE_AS_DARWIN_STABS_Q, 1,
+ [Define if your assembler needs -Q to support .stabs.])])
+ fi
+ ;;
+esac
+
+# Target CPU-specific assembler checks.
+
case "$target" in
aarch64*-*-*)
gcc_GAS_CHECK_FEATURE([-mabi option], gcc_cv_as_aarch64_mabi,,
--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University