From: David Edelsohn Date: Sat, 26 Sep 2015 15:31:35 +0000 (+0000) Subject: dwarf2out.c (XCOFF_DEBUGGING_INFO): Default 0 definition. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=51fbbb92b44bcc8fea372bb55bda3f26b5857de5;p=gcc.git dwarf2out.c (XCOFF_DEBUGGING_INFO): Default 0 definition. * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 01fac466660..d45eb70235a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,38 @@ +2015-09-26 David Edelsohn + + * 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 * config/arc/arc.c (arc_output_addsi): Fix left shift undefined diff --git a/gcc/config.gcc b/gcc/config.gcc index c4c11f979e0..c52f5a8975a 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -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 index 00000000000..2e676b0f3e0 --- /dev/null +++ b/gcc/config/rs6000/aix71.h @@ -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 + . */ + +/* 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" + diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index f8638f93de5..34b1d32f8f8 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -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; } diff --git a/gcc/config/rs6000/xcoff.h b/gcc/config/rs6000/xcoff.h index be1f708b857..5cdf87ce2c5 100644 --- a/gcc/config/rs6000/xcoff.h +++ b/gcc/config/rs6000/xcoff.h @@ -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 diff --git a/gcc/configure b/gcc/configure index 608d2645c4c..4d6e153e295 100755 --- a/gcc/configure +++ b/gcc/configure @@ -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*-*-*) diff --git a/gcc/configure.ac b/gcc/configure.ac index 65b5d704e3b..451acfa0cd7 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -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, diff --git a/gcc/dwarf2asm.c b/gcc/dwarf2asm.c index 3a30fe443a8..53140253f8d 100644 --- a/gcc/dwarf2asm.c +++ b/gcc/dwarf2asm.c @@ -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 + /* 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]; diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 598ba536b54..4edc2ae19e4 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -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_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 *); -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 *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. */