dwarf2out.c (XCOFF_DEBUGGING_INFO): Default 0 definition.
authorDavid Edelsohn <dje.gcc@gmail.com>
Sat, 26 Sep 2015 15:31:35 +0000 (15:31 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Sat, 26 Sep 2015 15:31:35 +0000 (11:31 -0400)
        * dwarf2out.c (XCOFF_DEBUGGING_INFO): Default 0 definition.
        (HAVE_XCOFF_DWARF_EXTRAS): Default to 0 definition.
        (output_fde): Don't output length for debug_frame on AIX.
        (output_call_frame_info): Don't output length for debug_frame on AIX.
        (have_macinfo): Force to False for XCOFF_DEBUGGING_INFO and not
        HAVE_XCOFF_DWARF_EXTRAS.
        (add_AT_loc_list): Return early if XCOFF_DEBUGGING_INFO and not
        HAVE_XCOFF_DWARF_EXTRAS.
        (output_compilation_unit_header): Don't output length on AIX.
        (output_pubnames): Don't output length on AIX.
        (output_aranges): Delete argument. Compute length locally. Don't
        output length on AIX.
        (output_line_info): Don't output length on AIX.
        (dwarf2out_finish): Don't compute aranges_length.
        * dwarf2asm.c (XCOFF_DEBUGGING_INFO): Default 0 definition.
        (dw2_asm_output_nstring): Emit .byte not .ascii on AIX.
        * config/rs6000/rs6000.c (rs6000_output_dwarf_dtprel): Emit correct
        symbol decoration for AIX.
        (rs6000_xcoff_debug_unwind_info): New.
        (rs6000_xcoff_asm_named_section): Emit .dwsect pseudo-op
        for SECTION_DEBUG.
        (rs6000_xcoff_declare_function_name): Emit different
        .function pseudo-op when DWARF2_DEBUG. Don't call
        xcoffout_declare_function for DWARF2_DEBUG.
        * config/rs6000/xcoff.h (TARGET_DEBUG_UNWIND_INFO):
        Redefine.
        * config/rs6000/aix71.h: New.
        * configure.ac (gcc_cv_as_aix_dwloc): Check AIX as for DWARF
        locations support.
        * configure: Regenerate.
        * config.gcc (powerpc-ibm-aix[789]+): New stanza for AIX 7.1+ with
        DWARF support.

From-SVN: r228167

gcc/ChangeLog
gcc/config.gcc
gcc/config/rs6000/aix71.h [new file with mode: 0644]
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/xcoff.h
gcc/configure
gcc/configure.ac
gcc/dwarf2asm.c
gcc/dwarf2out.c

index 01fac466660956b2f86875e297fc2da4476154a5..d45eb70235a0b6c16bcee385166f5061c4765288 100644 (file)
@@ -1,3 +1,38 @@
+2015-09-26  David Edelsohn  <dje.gcc@gmail.com>
+
+       * dwarf2out.c (XCOFF_DEBUGGING_INFO): Default 0 definition.
+       (HAVE_XCOFF_DWARF_EXTRAS): Default to 0 definition.
+       (output_fde): Don't output length for debug_frame on AIX.
+       (output_call_frame_info): Don't output length for debug_frame on AIX.
+       (have_macinfo): Force to False for XCOFF_DEBUGGING_INFO and not
+       HAVE_XCOFF_DWARF_EXTRAS.
+       (add_AT_loc_list): Return early if XCOFF_DEBUGGING_INFO and not
+       HAVE_XCOFF_DWARF_EXTRAS.
+       (output_compilation_unit_header): Don't output length on AIX.
+       (output_pubnames): Don't output length on AIX.
+       (output_aranges): Delete argument. Compute length locally. Don't
+       output length on AIX.
+       (output_line_info): Don't output length on AIX.
+       (dwarf2out_finish): Don't compute aranges_length.
+       * dwarf2asm.c (XCOFF_DEBUGGING_INFO): Default 0 definition.
+       (dw2_asm_output_nstring): Emit .byte not .ascii on AIX.
+       * config/rs6000/rs6000.c (rs6000_output_dwarf_dtprel): Emit correct
+       symbol decoration for AIX.
+       (rs6000_xcoff_debug_unwind_info): New.
+       (rs6000_xcoff_asm_named_section): Emit .dwsect pseudo-op
+       for SECTION_DEBUG.
+       (rs6000_xcoff_declare_function_name): Emit different
+       .function pseudo-op when DWARF2_DEBUG. Don't call
+       xcoffout_declare_function for DWARF2_DEBUG.
+       * config/rs6000/xcoff.h (TARGET_DEBUG_UNWIND_INFO):
+       Redefine.
+       * config/rs6000/aix71.h: New.
+       * configure.ac (gcc_cv_as_aix_dwloc): Check AIX as for DWARF
+       locations support.
+       * configure: Regenerate.
+       * config.gcc (powerpc-ibm-aix[789]+): New stanza for AIX 7.1+ with
+       DWARF support.
+
 2015-09-26  Jeff Law  <law@redhat.com>
 
        * config/arc/arc.c (arc_output_addsi): Fix left shift undefined
index c4c11f979e0e6e6aff179ac9996c34362a7b218b..c52f5a8975a20c8a798cd6793c9f0b477cfcafef 100644 (file)
@@ -2527,7 +2527,7 @@ rs6000-ibm-aix5.3.* | powerpc-ibm-aix5.3.*)
        use_gcc_stdint=wrap
        extra_headers=altivec.h
        ;;
-rs6000-ibm-aix[6789].* | powerpc-ibm-aix[6789].*)
+rs6000-ibm-aix6.* | powerpc-ibm-aix6.*)
        tm_file="${tm_file} rs6000/aix.h rs6000/aix61.h rs6000/xcoff.h rs6000/aix-stdint.h"
        tmake_file="rs6000/t-aix52 t-slibgcc"
        extra_options="${extra_options} rs6000/aix64.opt"
@@ -2536,6 +2536,15 @@ rs6000-ibm-aix[6789].* | powerpc-ibm-aix[6789].*)
        use_gcc_stdint=wrap
        extra_headers=altivec.h
        ;;
+rs6000-ibm-aix[789].* | powerpc-ibm-aix[789].*)
+       tm_file="${tm_file} rs6000/aix.h rs6000/aix71.h rs6000/xcoff.h rs6000/aix-stdint.h"
+       tmake_file="rs6000/t-aix52 t-slibgcc"
+       extra_options="${extra_options} rs6000/aix64.opt"
+       use_collect2=yes
+       thread_file='aix'
+       use_gcc_stdint=wrap
+       extra_headers=altivec.h
+       ;;
 rl78-*-elf*)
        tm_file="dbxelf.h elfos.h newlib-stdint.h ${tm_file}"
        target_has_targetm_common=no
diff --git a/gcc/config/rs6000/aix71.h b/gcc/config/rs6000/aix71.h
new file mode 100644 (file)
index 0000000..2e676b0
--- /dev/null
@@ -0,0 +1,231 @@
+/* Definitions of target machine for GNU compiler,
+   for IBM RS/6000 POWER running AIX V7.1.
+   Copyright (C) 2002-2015 Free Software Foundation, Inc.
+   Contributed by David Edelsohn (edelsohn@gnu.org).
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3, or (at your
+   option) any later version.
+
+   GCC is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+   License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+/* The macro SUBTARGET_OVERRIDE_OPTIONS is provided for subtargets, to
+   get control in TARGET_OPTION_OVERRIDE.  */
+
+#define SUBTARGET_OVERRIDE_OPTIONS                                     \
+do {                                                                   \
+  if (TARGET_64BIT && ! TARGET_POWERPC64)                              \
+    {                                                                  \
+      rs6000_isa_flags |= OPTION_MASK_POWERPC64;                       \
+      warning (0, "-maix64 requires PowerPC64 architecture remain enabled"); \
+    }                                                                  \
+  if (TARGET_SOFT_FLOAT && TARGET_LONG_DOUBLE_128)                     \
+    {                                                                  \
+      rs6000_long_double_type_size = 64;                               \
+      if (global_options_set.x_rs6000_long_double_type_size)           \
+       warning (0, "soft-float and long-double-128 are incompatible"); \
+    }                                                                  \
+  if (TARGET_POWERPC64 && ! TARGET_64BIT)                              \
+    {                                                                  \
+      error ("-maix64 required: 64-bit computation with 32-bit addressing not yet supported"); \
+    }                                                                  \
+  if ((rs6000_isa_flags_explicit                                       \
+       & OPTION_MASK_MINIMAL_TOC) != 0)                                        \
+    {                                                                  \
+      if (global_options_set.x_rs6000_current_cmodel                   \
+         && rs6000_current_cmodel != CMODEL_SMALL)                     \
+       error ("-mcmodel incompatible with other toc options");         \
+      SET_CMODEL (CMODEL_SMALL);                                       \
+    }                                                                  \
+  if (rs6000_current_cmodel != CMODEL_SMALL)                           \
+    {                                                                  \
+      TARGET_NO_FP_IN_TOC = 0;                                         \
+      TARGET_NO_SUM_IN_TOC = 0;                                                \
+    }                                                                  \
+  if (rs6000_current_cmodel == CMODEL_MEDIUM)                          \
+    {                                                                  \
+      rs6000_current_cmodel = CMODEL_LARGE;                            \
+    }                                                                  \
+} while (0);
+
+#undef ASM_SPEC
+#define ASM_SPEC "-u %{maix64:-a64 %{!mcpu*:-mppc64}} %(asm_cpu)"
+
+/* Common ASM definitions used by ASM_SPEC amongst the various targets for
+   handling -mcpu=xxx switches.  There is a parallel list in driver-rs6000.c to
+   provide the default assembler options if the user uses -mcpu=native, so if
+   you make changes here, make them there also.  */
+#undef ASM_CPU_SPEC
+#define ASM_CPU_SPEC \
+"%{!mcpu*: %{!maix64: \
+  %{mpowerpc64: -mppc64} \
+  %{maltivec: -m970} \
+  %{!maltivec: %{!mpowerpc64: %(asm_default)}}}} \
+%{mcpu=native: %(asm_cpu_native)} \
+%{mcpu=power3: -m620} \
+%{mcpu=power4: -mpwr4} \
+%{mcpu=power5: -mpwr5} \
+%{mcpu=power5+: -mpwr5x} \
+%{mcpu=power6: -mpwr6} \
+%{mcpu=power6x: -mpwr6} \
+%{mcpu=power7: -mpwr7} \
+%{mcpu=power8: -mpwr8} \
+%{mcpu=powerpc: -mppc} \
+%{mcpu=rs64a: -mppc} \
+%{mcpu=603: -m603} \
+%{mcpu=603e: -m603} \
+%{mcpu=604: -m604} \
+%{mcpu=604e: -m604} \
+%{mcpu=620: -m620} \
+%{mcpu=630: -m620} \
+%{mcpu=970: -m970} \
+%{mcpu=G5: -m970} \
+%{mvsx: %{!mcpu*: -mpwr6}} \
+-many"
+
+#undef ASM_DEFAULT_SPEC
+#define ASM_DEFAULT_SPEC "-mpwr4"
+
+#undef TARGET_OS_CPP_BUILTINS
+#define TARGET_OS_CPP_BUILTINS()     \
+  do                                 \
+    {                                \
+      builtin_define ("_AIX43");     \
+      builtin_define ("_AIX51");     \
+      builtin_define ("_AIX52");     \
+      builtin_define ("_AIX53");     \
+      builtin_define ("_AIX61");     \
+      builtin_define ("_AIX71");     \
+      TARGET_OS_AIX_CPP_BUILTINS (); \
+    }                                \
+  while (0)
+
+#undef CPP_SPEC
+#define CPP_SPEC "%{posix: -D_POSIX_SOURCE}    \
+  %{ansi: -D_ANSI_C_SOURCE}                    \
+  %{maix64: -D__64BIT__}                       \
+  %{mpe: -I%R/usr/lpp/ppe.poe/include}         \
+  %{pthread: -D_THREAD_SAFE}"
+
+/* The GNU C++ standard library requires that these macros be 
+   defined.  Synchronize with libstdc++ os_defines.h.  */
+#undef CPLUSPLUS_CPP_SPEC                       
+#define CPLUSPLUS_CPP_SPEC                     \
+  "-D_ALL_SOURCE -D__COMPATMATH__              \
+   %{maix64: -D__64BIT__}                      \
+   %{mpe: -I%R/usr/lpp/ppe.poe/include}                \
+   %{pthread: -D_THREAD_SAFE}"
+
+#undef  TARGET_DEFAULT
+#define TARGET_DEFAULT (MASK_PPC_GPOPT | MASK_PPC_GFXOPT | MASK_MFCRF)
+
+#undef  PROCESSOR_DEFAULT
+#define PROCESSOR_DEFAULT PROCESSOR_POWER7
+#undef  PROCESSOR_DEFAULT64
+#define PROCESSOR_DEFAULT64 PROCESSOR_POWER7
+
+/* AIX 7.1 kernel and assembler have necessary support for Altivec and VSX.  */
+#undef OS_MISSING_ALTIVEC
+
+/* Define this macro as a C expression for the initializer of an
+   array of string to tell the driver program which options are
+   defaults for this target and thus do not need to be handled
+   specially when using `MULTILIB_OPTIONS'.
+
+   Do not define this macro if `MULTILIB_OPTIONS' is not defined in
+   the target makefile fragment or if none of the options listed in
+   `MULTILIB_OPTIONS' are set by default.  *Note Target Fragment::.  */
+
+#undef MULTILIB_DEFAULTS
+
+#undef LIB_SPEC
+#define LIB_SPEC "%{pg:-L%R/lib/profiled -L%R/usr/lib/profiled}\
+   %{p:-L%R/lib/profiled -L%R/usr/lib/profiled}\
+   %{!maix64:%{!shared:%{g*:-lg}}}\
+   %{fprofile-arcs|fprofile-generate*|coverage:-lpthreads}\
+   %{mpe:-L%R/usr/lpp/ppe.poe/lib -lmpi -lvtd}\
+   %{pthread:-lpthreads} -lc"
+
+#undef LINK_SPEC
+#define LINK_SPEC "-bpT:0x10000000 -bpD:0x20000000 %{!r:-btextro}\
+   %{static:-bnso %(link_syscalls) } %{shared:-bM:SRE %{!e:-bnoentry}}\
+   %{!maix64:%{!shared:%{g*: %(link_libg) }}} %{maix64:-b64}\
+   %{mpe:-binitfini:poe_remote_main}"
+
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC "%{!shared:\
+   %{maix64:%{pg:gcrt0_64%O%s;:%{p:mcrt0_64%O%s;:crt0_64%O%s}};:\
+     %{pthread:%{pg:gcrt0_r%O%s;:%{p:mcrt0_r%O%s;:crt0_r%O%s}};:\
+       %{pg:gcrt0%O%s;:%{p:mcrt0%O%s;:crt0%O%s}}}}}\
+   %{shared:crtcxa_s%O%s;:crtcxa%O%s} crtdbase%O%s"
+
+/* AIX V5 typedefs ptrdiff_t as "long" while earlier releases used "int".  */
+
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "long int"
+
+/* Type used for wchar_t, as a string used in a declaration.  */
+#undef  WCHAR_TYPE
+#define WCHAR_TYPE (!TARGET_64BIT ? "short unsigned int" : "unsigned int")
+
+/* Width of wchar_t in bits.  */
+#undef  WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE (!TARGET_64BIT ? 16 : 32)
+
+/* AIX 4.2 and above provides initialization and finalization function
+   support from linker command line.  */
+#undef HAS_INIT_SECTION
+#define HAS_INIT_SECTION
+
+#undef LD_INIT_SWITCH
+#define LD_INIT_SWITCH "-binitfini"
+
+#ifndef _AIX52
+extern long long int    atoll(const char *);  
+#endif
+
+/* This target uses the aix64.opt file.  */
+#define TARGET_USES_AIX64_OPT 1
+
+/* Large TOC Support */
+#ifdef HAVE_LD_LARGE_TOC
+#undef TARGET_CMODEL
+#define TARGET_CMODEL rs6000_current_cmodel
+#define SET_CMODEL(opt) rs6000_current_cmodel = opt
+#else
+#define SET_CMODEL(opt) do {} while (0)
+#endif
+
+/* This target defines SUPPORTS_WEAK and TARGET_ASM_NAMED_SECTION,
+   but does not have crtbegin/end.  */
+
+#define TARGET_USE_JCR_SECTION 0
+
+#define TARGET_AIX_VERSION 71
+
+/* AIX 7.1 supports DWARF3 debugging, but XCOFF remains the default.  */
+#define DWARF2_DEBUGGING_INFO 1
+#define PREFERRED_DEBUGGING_TYPE XCOFF_DEBUG
+#define DEBUG_INFO_SECTION     "0x10000"
+#define DEBUG_LINE_SECTION     "0x20000"
+#define DEBUG_PUBNAMES_SECTION "0x30000"
+#define DEBUG_PUBTYPES_SECTION "0x40000"
+#define DEBUG_ARANGES_SECTION  "0x50000"
+#define DEBUG_ABBREV_SECTION   "0x60000"
+#define DEBUG_STR_SECTION      "0x70000"
+#define DEBUG_RANGES_SECTION   "0x80000"
+#define DEBUG_LOC_SECTION      "0x90000"
+#define DEBUG_FRAME_SECTION    "0xA0000"
+#define DEBUG_MACINFO_SECTION  "0xB0000"
+#define DEBUG_MACRO_SECTION    "0xB0000"
+
index f8638f93de5f19bd69451fca47521e63aee15d79..34b1d32f8f86feeaeccf8583a876b38efc22d6de 100644 (file)
@@ -7204,7 +7204,28 @@ rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
       gcc_unreachable ();
     }
   output_addr_const (file, x);
-  fputs ("@dtprel+0x8000", file);
+  if (TARGET_ELF)
+    fputs ("@dtprel+0x8000", file);
+  else if (TARGET_XCOFF && GET_CODE (x) == SYMBOL_REF)
+    {
+      switch (SYMBOL_REF_TLS_MODEL (x))
+       {
+       case 0:
+         break;
+       case TLS_MODEL_LOCAL_EXEC:
+         fputs ("@le", file);
+         break;
+       case TLS_MODEL_INITIAL_EXEC:
+         fputs ("@ie", file);
+         break;
+       case TLS_MODEL_GLOBAL_DYNAMIC:
+       case TLS_MODEL_LOCAL_DYNAMIC:
+         fputs ("@m", file);
+         break;
+       default:
+         gcc_unreachable ();
+       }
+    }
 }
 
 /* Return true if X is a symbol that refers to real (rather than emulated)
@@ -27316,17 +27337,21 @@ output_toc (FILE *file, rtx x, int labelno, machine_mode mode)
     output_addr_const (file, x);
 
 #if HAVE_AS_TLS
-  if (TARGET_XCOFF && GET_CODE (base) == SYMBOL_REF
-      && SYMBOL_REF_TLS_MODEL (base) != 0)
+  if (TARGET_XCOFF && GET_CODE (base) == SYMBOL_REF)
     {
-      if (SYMBOL_REF_TLS_MODEL (base) == TLS_MODEL_LOCAL_EXEC)
-       fputs ("@le", file);
-      else if (SYMBOL_REF_TLS_MODEL (base) == TLS_MODEL_INITIAL_EXEC)
-       fputs ("@ie", file);
-      /* Use global-dynamic for local-dynamic.  */
-      else if (SYMBOL_REF_TLS_MODEL (base) == TLS_MODEL_GLOBAL_DYNAMIC
-              || SYMBOL_REF_TLS_MODEL (base) == TLS_MODEL_LOCAL_DYNAMIC)
+      switch (SYMBOL_REF_TLS_MODEL (base))
        {
+       case 0:
+         break;
+       case TLS_MODEL_LOCAL_EXEC:
+         fputs ("@le", file);
+         break;
+       case TLS_MODEL_INITIAL_EXEC:
+         fputs ("@ie", file);
+         break;
+       /* Use global-dynamic for local-dynamic.  */
+       case TLS_MODEL_GLOBAL_DYNAMIC:
+       case TLS_MODEL_LOCAL_DYNAMIC:
          putc ('\n', file);
          (*targetm.asm_out.internal_label) (file, "LCM", labelno);
          fputs ("\t.tc .", file);
@@ -27334,6 +27359,9 @@ output_toc (FILE *file, rtx x, int labelno, machine_mode mode)
          fputs ("[TC],", file);
          output_addr_const (file, x);
          fputs ("@m", file);
+         break;
+       default:
+         gcc_unreachable ();
        }
     }
 #endif
@@ -30684,6 +30712,20 @@ rs6000_elf_file_end (void)
 #endif
 
 #if TARGET_XCOFF
+
+#ifndef HAVE_XCOFF_DWARF_EXTRAS
+#define HAVE_XCOFF_DWARF_EXTRAS 0
+#endif
+
+static enum unwind_info_type
+rs6000_xcoff_debug_unwind_info (void)
+{
+  if (HAVE_XCOFF_DWARF_EXTRAS)
+    return UI_DWARF2;
+  else
+    return UI_NONE;
+}
+
 static void
 rs6000_xcoff_asm_output_anchor (rtx symbol)
 {
@@ -30805,6 +30847,11 @@ rs6000_xcoff_asm_named_section (const char *name, unsigned int flags,
   int smclass;
   static const char * const suffix[4] = { "PR", "RO", "RW", "TL" };
 
+  if (flags & SECTION_DEBUG)
+    {
+      fprintf (asm_out_file, "\t.dwsect %s\n", name);
+      return;
+    }
   if (flags & SECTION_CODE)
     smclass = 0;
   else if (flags & SECTION_TLS)
@@ -31140,8 +31187,16 @@ rs6000_xcoff_declare_function_name (FILE *file, const char *name, tree decl)
   fputs (":\n", file);
   data.function_descriptor = true;
   symtab_node::get (decl)->call_for_symbol_and_aliases (rs6000_declare_alias, &data, true);
-  if (write_symbols != NO_DEBUG && !DECL_IGNORED_P (decl))
-    xcoffout_declare_function (file, decl, buffer);
+  if (!DECL_IGNORED_P (decl))
+    {
+      if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
+       xcoffout_declare_function (file, decl, buffer);
+      else if (write_symbols == DWARF2_DEBUG)
+       {
+         name = (*targetm.strip_name_encoding) (name);
+         fprintf (file, "\t.function .%s,.%s,2,0\n", name, name);
+       }
+    }
   return;
 }
 
index be1f708b857f1f81fd3b0a059420609e0d860085..5cdf87ce2c5b349c072421fddd47382e480a7666 100644 (file)
@@ -86,6 +86,8 @@
               || (SCALAR_FLOAT_MODE_P (GET_MODE (X))                   \
                   && ! TARGET_NO_FP_IN_TOC)))))
 
+#undef TARGET_DEBUG_UNWIND_INFO
+#define TARGET_DEBUG_UNWIND_INFO  rs6000_xcoff_debug_unwind_info
 #define TARGET_ASM_OUTPUT_ANCHOR  rs6000_xcoff_asm_output_anchor
 #define TARGET_ASM_GLOBALIZE_LABEL  rs6000_xcoff_asm_globalize_label
 #define TARGET_ASM_INIT_SECTIONS  rs6000_xcoff_asm_init_sections
index 608d2645c4cbb385e2debb3090b675fd45f67d85..4d6e153e2952f90c19f8ff5ba6869dbbe1162e6a 100755 (executable)
@@ -26452,6 +26452,46 @@ $as_echo "#define HAVE_AS_REF 1" >>confdefs.h
 fi
        ;;
     esac
+
+    case $target in
+      *-*-aix*)
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for dwarf location lists section support" >&5
+$as_echo_n "checking assembler for dwarf location lists section support... " >&6; }
+if test "${gcc_cv_as_aix_dwloc+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  gcc_cv_as_aix_dwloc=no
+    if test $in_tree_gas = yes; then
+    if test $gcc_cv_gas_vers -ge `expr \( \( 2 \* 1000 \) + 21 \) \* 1000 + 0`
+  then gcc_cv_as_aix_dwloc=yes
+fi
+  elif test x$gcc_cv_as != x; then
+    $as_echo ' .dwsect 0xB0000
+          ' > conftest.s
+    if { ac_try='$gcc_cv_as $gcc_cv_as_flags  -o conftest.o conftest.s >&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+    then
+        gcc_cv_as_aix_dwloc=yes
+    else
+      echo "configure: failed program was" >&5
+      cat conftest.s >&5
+    fi
+    rm -f conftest.o conftest.s
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_aix_dwloc" >&5
+$as_echo "$gcc_cv_as_aix_dwloc" >&6; }
+if test $gcc_cv_as_aix_dwloc = yes; then
+
+$as_echo "#define HAVE_XCOFF_DWARF_EXTRAS 1" >>confdefs.h
+
+fi
+        ;;
+    esac
     ;;
 
   mips*-*-*)
index 65b5d704e3b74a19378b868018a0f3c4a61d6bca..451acfa0cd748e9dcefc58fd19af303e5165a9e6 100644 (file)
@@ -4328,6 +4328,18 @@ LCF0:
     esac
     ;;
 
+    case $target in
+      *-*-aix*)
+       gcc_GAS_CHECK_FEATURE([dwarf location lists section support],
+         gcc_cv_as_aix_dwloc, [2,21,0],,
+         [     .dwsect 0xB0000
+         ],,
+         [AC_DEFINE(HAVE_XCOFF_DWARF_EXTRAS, 1,
+           [Define if your assembler supports .dwsect 0xB0000])])
+       ;;
+    esac
+    ;;
+
   mips*-*-*)
     gcc_GAS_CHECK_FEATURE([explicit relocation support],
       gcc_cv_as_mips_explicit_relocs, [2,14,0],,
@@ -4336,6 +4348,7 @@ LCF0:
        then target_cpu_default=MASK_EXPLICIT_RELOCS
        else target_cpu_default="($target_cpu_default)|MASK_EXPLICIT_RELOCS"
        fi])
+
     gcc_GAS_CHECK_FEATURE([-mno-shared support],
       gcc_cv_as_mips_no_shared, [2,16,0], [-mno-shared], [nop],,
       [AC_DEFINE(HAVE_AS_NO_SHARED, 1,
index 3a30fe443a8638baca807d5d4c44f59a56ecd9d5..53140253f8dc4a9f7262d9b72cc40fcad5b8593f 100644 (file)
@@ -34,6 +34,10 @@ along with GCC; see the file COPYING3.  If not see
 #include "dwarf2.h"
 #include "tm_p.h"
 
+#ifndef XCOFF_DEBUGGING_INFO
+#define XCOFF_DEBUGGING_INFO 0
+#endif
+
 \f
 /* Output an unaligned integer with the given value and size.  Prefer not
    to print a newline, since the caller may want to add a comment.  */
@@ -306,7 +310,11 @@ dw2_asm_output_nstring (const char *str, size_t orig_len,
 
   if (flag_debug_asm && comment)
     {
-      fputs ("\t.ascii \"", asm_out_file);
+      if (XCOFF_DEBUGGING_INFO)
+       fputs ("\t.byte \"", asm_out_file);
+      else
+       fputs ("\t.ascii \"", asm_out_file);
+
       for (i = 0; i < len; i++)
        {
          int c = str[i];
index 598ba536b54a735f6c107562e3903929483644cd..4edc2ae19e46c4d29fd9d7e2e19670ddb933190b 100644 (file)
@@ -108,6 +108,14 @@ static rtx_insn *last_var_location_insn;
 static rtx_insn *cached_next_real_insn;
 static void dwarf2out_decl (tree);
 
+#ifndef XCOFF_DEBUGGING_INFO
+#define XCOFF_DEBUGGING_INFO 0
+#endif
+
+#ifndef HAVE_XCOFF_DWARF_EXTRAS
+#define HAVE_XCOFF_DWARF_EXTRAS 0
+#endif
+
 #ifdef VMS_DEBUGGING_INFO
 int vms_file_stats_name (const char *, long long *, long *, char *, int *);
 
@@ -594,11 +602,14 @@ output_fde (dw_fde_ref fde, bool for_eh, bool second,
                                  for_eh + j);
   ASM_GENERATE_INTERNAL_LABEL (l1, FDE_AFTER_SIZE_LABEL, for_eh + j);
   ASM_GENERATE_INTERNAL_LABEL (l2, FDE_END_LABEL, for_eh + j);
-  if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4 && !for_eh)
-    dw2_asm_output_data (4, 0xffffffff, "Initial length escape value"
-                        " indicating 64-bit DWARF extension");
-  dw2_asm_output_delta (for_eh ? 4 : DWARF_OFFSET_SIZE, l2, l1,
-                       "FDE Length");
+  if (!XCOFF_DEBUGGING_INFO || for_eh)
+    {
+      if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4 && !for_eh)
+       dw2_asm_output_data (4, 0xffffffff, "Initial length escape value"
+                            " indicating 64-bit DWARF extension");
+      dw2_asm_output_delta (for_eh ? 4 : DWARF_OFFSET_SIZE, l2, l1,
+                           "FDE Length");
+    }
   ASM_OUTPUT_LABEL (asm_out_file, l1);
 
   if (for_eh)
@@ -794,11 +805,14 @@ output_call_frame_info (int for_eh)
   /* Output the CIE.  */
   ASM_GENERATE_INTERNAL_LABEL (l1, CIE_AFTER_SIZE_LABEL, for_eh);
   ASM_GENERATE_INTERNAL_LABEL (l2, CIE_END_LABEL, for_eh);
-  if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4 && !for_eh)
-    dw2_asm_output_data (4, 0xffffffff,
-      "Initial length escape value indicating 64-bit DWARF extension");
-  dw2_asm_output_delta (for_eh ? 4 : DWARF_OFFSET_SIZE, l2, l1,
-                       "Length of Common Information Entry");
+  if (!XCOFF_DEBUGGING_INFO || for_eh)
+    {
+      if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4 && !for_eh)
+       dw2_asm_output_data (4, 0xffffffff,
+         "Initial length escape value indicating 64-bit DWARF extension");
+      dw2_asm_output_delta (for_eh ? 4 : DWARF_OFFSET_SIZE, l2, l1,
+                           "Length of Common Information Entry");
+    }
   ASM_OUTPUT_LABEL (asm_out_file, l1);
 
   /* Now that the CIE pointer is PC-relative for EH,
@@ -2995,7 +3009,8 @@ static GTY (()) vec<macinfo_entry, va_gc> *macinfo_table;
 /* True if .debug_macinfo or .debug_macros section is going to be
    emitted.  */
 #define have_macinfo \
-  (debug_info_level >= DINFO_LEVEL_VERBOSE \
+  ((!XCOFF_DEBUGGING_INFO || HAVE_XCOFF_DWARF_EXTRAS) \
+   && debug_info_level >= DINFO_LEVEL_VERBOSE \
    && !macinfo_table->is_empty ())
 
 /* Array of dies for which we should generate .debug_ranges info.  */
@@ -3202,7 +3217,7 @@ static void add_enumerator_pubname (const char *, dw_die_ref);
 static void add_pubname_string (const char *, dw_die_ref);
 static void add_pubtype (tree, dw_die_ref);
 static void output_pubnames (vec<pubname_entry, va_gc> *);
-static void output_aranges (unsigned long);
+static void output_aranges (void);
 static unsigned int add_ranges_num (int);
 static unsigned int add_ranges (const_tree);
 static void add_ranges_by_labels (dw_die_ref, const char *, const char *,
@@ -4236,6 +4251,9 @@ add_AT_loc_list (dw_die_ref die, enum dwarf_attribute attr_kind, dw_loc_list_ref
 {
   dw_attr_node attr;
 
+  if (XCOFF_DEBUGGING_INFO && !HAVE_XCOFF_DWARF_EXTRAS)
+    return;
+
   attr.dw_attr = attr_kind;
   attr.dw_attr_val.val_class = dw_val_class_loc_list;
   attr.dw_attr_val.val_entry = NULL;
@@ -9197,12 +9215,16 @@ output_compilation_unit_header (void)
      DWARFv5 draft DIE tags in DWARFv4 format.  */
   int ver = dwarf_version < 5 ? dwarf_version : 4;
 
-  if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
-    dw2_asm_output_data (4, 0xffffffff,
-      "Initial length escape value indicating 64-bit DWARF extension");
-  dw2_asm_output_data (DWARF_OFFSET_SIZE,
-                      next_die_offset - DWARF_INITIAL_LENGTH_SIZE,
-                      "Length of Compilation Unit Info");
+  if (!XCOFF_DEBUGGING_INFO)
+    {
+      if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
+       dw2_asm_output_data (4, 0xffffffff,
+         "Initial length escape value indicating 64-bit DWARF extension");
+      dw2_asm_output_data (DWARF_OFFSET_SIZE,
+                          next_die_offset - DWARF_INITIAL_LENGTH_SIZE,
+                          "Length of Compilation Unit Info");
+    }
+
   dw2_asm_output_data (2, ver, "DWARF version number");
   dw2_asm_output_offset (DWARF_OFFSET_SIZE, abbrev_section_label,
                         debug_abbrev_section,
@@ -9632,10 +9654,14 @@ output_pubnames (vec<pubname_entry, va_gc> *names)
   unsigned long pubnames_length = size_of_pubnames (names);
   pubname_entry *pub;
 
-  if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
-    dw2_asm_output_data (4, 0xffffffff,
-      "Initial length escape value indicating 64-bit DWARF extension");
-  dw2_asm_output_data (DWARF_OFFSET_SIZE, pubnames_length, "Pub Info Length");
+  if (!XCOFF_DEBUGGING_INFO)
+    {
+      if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
+       dw2_asm_output_data (4, 0xffffffff,
+         "Initial length escape value indicating 64-bit DWARF extension");
+      dw2_asm_output_data (DWARF_OFFSET_SIZE, pubnames_length,
+                          "Pub Info Length");
+    }
 
   /* Version number for pubnames/pubtypes is independent of dwarf version.  */
   dw2_asm_output_data (2, 2, "DWARF Version");
@@ -9705,15 +9731,20 @@ output_pubtables (void)
    text section generated for this compilation unit.  */
 
 static void
-output_aranges (unsigned long aranges_length)
+output_aranges (void)
 {
   unsigned i;
+  unsigned long aranges_length = size_of_aranges ();
+  
+  if (!XCOFF_DEBUGGING_INFO)
+    {
+      if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
+       dw2_asm_output_data (4, 0xffffffff,
+         "Initial length escape value indicating 64-bit DWARF extension");
+      dw2_asm_output_data (DWARF_OFFSET_SIZE, aranges_length,
+                          "Length of Address Ranges Info");
+    }
 
-  if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
-    dw2_asm_output_data (4, 0xffffffff,
-      "Initial length escape value indicating 64-bit DWARF extension");
-  dw2_asm_output_data (DWARF_OFFSET_SIZE, aranges_length,
-                      "Length of Address Ranges Info");
   /* Version number for aranges is still 2, even up to DWARF5.  */
   dw2_asm_output_data (2, 2, "DWARF Version");
   if (dwarf_split_debug_info)
@@ -10397,11 +10428,15 @@ output_line_info (bool prologue_only)
   ASM_GENERATE_INTERNAL_LABEL (p1, LN_PROLOG_AS_LABEL, 0);
   ASM_GENERATE_INTERNAL_LABEL (p2, LN_PROLOG_END_LABEL, 0);
 
-  if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
-    dw2_asm_output_data (4, 0xffffffff,
-      "Initial length escape value indicating 64-bit DWARF extension");
-  dw2_asm_output_delta (DWARF_OFFSET_SIZE, l2, l1,
-                       "Length of Source Line Info");
+  if (!XCOFF_DEBUGGING_INFO)
+    {
+      if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
+       dw2_asm_output_data (4, 0xffffffff,
+         "Initial length escape value indicating 64-bit DWARF extension");
+      dw2_asm_output_delta (DWARF_OFFSET_SIZE, l2, l1,
+                           "Length of Source Line Info");
+    }
+
   ASM_OUTPUT_LABEL (asm_out_file, l1);
 
   dw2_asm_output_data (2, ver, "DWARF Version");
@@ -22031,7 +22066,7 @@ dwarf_file_hasher::hash (dwarf_file_data *p)
    just a unique number which is associated with only that one filename.  We
    need such numbers for the sake of generating labels (in the .debug_sfnames
    section) and references to those files numbers (in the .debug_srcinfo
-   and.debug_macinfo sections).  If the filename given as an argument is not
+   and .debug_macinfo sections).  If the filename given as an argument is not
    found in our current list, add it to the list and assign it the next
    available unique index number.  */
 
@@ -25502,10 +25537,8 @@ dwarf2out_finish (const char *filename)
      generate a table that would have contained data.  */
   if (info_section_emitted)
     {
-      unsigned long aranges_length = size_of_aranges ();
-
       switch_to_section (debug_aranges_section);
-      output_aranges (aranges_length);
+      output_aranges ();
     }
 
   /* Output ranges section if necessary.  */