Restore default 'sorry' 'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR' (was: [PATCH 1/3] STABS: remove -gstabs and -gxcoff functionality)

Message ID 87fsfviww8.fsf@euler.schwinge.homeip.net
State Committed
Headers
Series Restore default 'sorry' 'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR' (was: [PATCH 1/3] STABS: remove -gstabs and -gxcoff functionality) |

Commit Message

Thomas Schwinge Oct. 10, 2022, 2:19 p.m. UTC
  Hi!

On 2022-09-01T12:05:23+0200, Martin Liška <mliska@suse.cz> wrote:
> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>
> I've also built all cross compilers.

First: thanks for that: clean up plus "built all cross compilers"!

But yet, I've now tracked down an issue related to these changes,
apparently only visible via the nvptx back end -- and quite
non-obvious...  ;-)

> --- a/gcc/config/nvptx/nvptx.cc
> +++ b/gcc/config/nvptx/nvptx.cc
> @@ -52,7 +52,6 @@
>  #include "tm-preds.h"
>  #include "tm-constrs.h"
>  #include "langhooks.h"
> -#include "dbxout.h"
>  #include "cfgrtl.h"
>  #include "gimple.h"
>  #include "stor-layout.h"

> --- a/gcc/dbxout.cc
> +++ /dev/null
> @@ -1,3936 +0,0 @@
> -/* Output dbx-format symbol table information from GNU compiler.

The "dbx-format symbol table information" stuff indeed is not relevant
anymore, but:

> -/* Record an element in the table of global destructors.  SYMBOL is
> -   a SYMBOL_REF of the function to be called; PRIORITY is a number
> -   between 0 and MAX_INIT_PRIORITY.  */
> -
> -void
> -default_stabs_asm_out_destructor (rtx symbol ATTRIBUTE_UNUSED,
> -                               int priority ATTRIBUTE_UNUSED)
> -{
> -#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
> -  /* Tell GNU LD that this is part of the static destructor set.
> -     This will work for any system that uses stabs, most usefully
> -     aout systems.  */
> -  dbxout_begin_simple_stabs ("___DTOR_LIST__", 22 /* N_SETT */);
> -  dbxout_stab_value_label (XSTR (symbol, 0));
> -#else
> -  sorry ("global destructors not supported on this target");
> -#endif
> -}
> -
> -/* Likewise for global constructors.  */
> -
> -void
> -default_stabs_asm_out_constructor (rtx symbol ATTRIBUTE_UNUSED,
> -                                int priority ATTRIBUTE_UNUSED)
> -{
> -#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
> -  /* Tell GNU LD that this is part of the static destructor set.
> -     This will work for any system that uses stabs, most usefully
> -     aout systems.  */
> -  dbxout_begin_simple_stabs ("___CTOR_LIST__", 22 /* N_SETT */);
> -  dbxout_stab_value_label (XSTR (symbol, 0));
> -#else
> -  sorry ("global constructors not supported on this target");
> -#endif
> -}

> --- a/gcc/dbxout.h
> +++ /dev/null
> @@ -1,60 +0,0 @@
> -/* dbxout.h - Various declarations for functions found in dbxout.cc

> -extern void default_stabs_asm_out_destructor (rtx, int);
> -extern void default_stabs_asm_out_constructor (rtx, int);

... these two functions, 'default_stabs_asm_out_constructor',
'default_stabs_asm_out_destructor' (specifically, now their 'sorry'
branches only) used to serve as default 'TARGET_ASM_CONSTRUCTOR',
'TARGET_ASM_DESTRUCTOR' via...

> --- a/gcc/target-def.h
> +++ b/gcc/target-def.h

|  #if !defined(TARGET_ASM_CONSTRUCTOR) && !defined(USE_COLLECT2)
|  # ifdef CTORS_SECTION_ASM_OP
|  #  define TARGET_ASM_CONSTRUCTOR default_ctor_section_asm_out_constructor
>  # else
>  #  ifdef TARGET_ASM_NAMED_SECTION
>  #   define TARGET_ASM_CONSTRUCTOR default_named_section_asm_out_constructor
> -#  else
> -#   define TARGET_ASM_CONSTRUCTOR default_stabs_asm_out_constructor
>  #  endif
>  # endif
>  #endif
> @@ -74,8 +72,6 @@
|  #if !defined(TARGET_ASM_DESTRUCTOR) && !defined(USE_COLLECT2)
|  # ifdef DTORS_SECTION_ASM_OP
|  #  define TARGET_ASM_DESTRUCTOR default_dtor_section_asm_out_destructor
>  # else
>  #  ifdef TARGET_ASM_NAMED_SECTION
>  #   define TARGET_ASM_DESTRUCTOR default_named_section_asm_out_destructor
> -#  else
> -#   define TARGET_ASM_DESTRUCTOR default_stabs_asm_out_destructor
>  #  endif
>  # endif
>  #endif

... this setup here (manually added some more context to the 'diff').

That is, if a back end was not 'USE_COLLECT2', nor manually defined
'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR', or got pointed to the
respective 'default_[...]'  functions due to 'CTORS_SECTION_ASM_OP',
'DTORS_SECTION_ASM_OP', or 'TARGET_ASM_NAMED_SECTION', it got pointed to
'default_stabs_asm_out_constructor', 'default_stabs_asm_out_destructor'.
These would emit 'sorry' for any global constructor/destructor they're
run into.

This is now gone, and thus in such a back end configuration case
'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR' don't get defined
anymore, and thus the subsequently following:

    #if !defined(TARGET_HAVE_CTORS_DTORS)
    # if defined(TARGET_ASM_CONSTRUCTOR) && defined(TARGET_ASM_DESTRUCTOR)
    # define TARGET_HAVE_CTORS_DTORS true
    # endif
    #endif

... doesn't define 'TARGET_HAVE_CTORS_DTORS' anymore, and thus per my
understanding, 'gcc/final.cc:rest_of_handle_final':

    if (DECL_STATIC_CONSTRUCTOR (current_function_decl)
        && targetm.have_ctors_dtors)
      targetm.asm_out.constructor (XEXP (DECL_RTL (current_function_decl), 0),
                                   decl_init_priority_lookup
                                     (current_function_decl));
    if (DECL_STATIC_DESTRUCTOR (current_function_decl)
        && targetm.have_ctors_dtors)
      targetm.asm_out.destructor (XEXP (DECL_RTL (current_function_decl), 0),
                                  decl_fini_priority_lookup
                                    (current_function_decl));

... simply does nothing anymore for a 'DECL_STATIC_CONSTRUCTOR',
'DECL_STATIC_DESTRUCTOR'.

This, effectively, means that GCC/nvptx now suddenly appears to "support"
global constructors/destructors, which means that a ton of test cases now
erroneously PASS that previously used to FAIL:

    sorry, unimplemented: global constructors not supported on this target

Of course, such support didn't magically happen due to
"STABS: remove -gstabs and -gxcoff functionality", so this is bad.  And,
corresponding execution testing then regularly FAILs (due to the global
constructor/destructor functions never being invoked), for example:

    [-UNSUPPORTED:-]{+PASS:+} gcc.dg/initpri1.c {+(test for excess errors)+}
    {+FAIL: gcc.dg/initpri1.c execution test+}

    [-UNSUPPORTED:-]{+PASS:+} g++.dg/special/conpr-1.C {+(test for excess errors)+}
    {+FAIL: g++.dg/special/conpr-1.C execution test+}

To restore the previous GCC/nvptx behavior, I seek permission to first
push the attached
"Restore default 'sorry' 'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR'".
For traceability, this simply restores the previous code, stripped down
to the bare minimum.

As a next step, I'd then prepare a patch to re-work this thing, to make
it more obvious what's actually happening there.  (Details to be done.
For example, do we want to continue to have 'sorry' functions called via
'gcc/target-def.h', as done previously?  Or, should that be an '#error'
case there, and the nvptx back end provides its own 'sorry' functions for
'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR'?  Or, emit 'sorry' in
'gcc/final.cc:rest_of_handle_final'?  Or, something else?)


In addition to 'gcc/config/nvptx/nvptx.cc' (as quoted above) three more
files did '#include "dbxout.h"', and thus potentially could use these
'sorry' default functions.

Per my testing of '--target=pdp11-aout' as well as
'--target=powerpc64-darwin', re-introducing '#include "dbxout.h"' is not
relevant for 'gcc/config/pdp11/pdp11.cc' as well as for
'gcc/config/rs6000/rs6000-call.cc' and
'gcc/config/rs6000/rs6000-logue.cc' (for 'TARGET_MACHO' only).

Target pdp11-aout is not affected, because of 'gcc/config.gcc' setting:

    # On a.out targets, we need to use collect2.
    case ${target} in
    *-*-*aout*)
            use_collect2=yes
            ;;
    esac

Target powerpc64-darwin is not affected, because it defines
'TARGET_ASM_NAMED_SECTION'.

I'll thus remove those changes/TODO markers that are still present in the
attached
"Restore default 'sorry' 'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR'".
With that, OK to push?


Grüße
 Thomas


-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
  

Comments

Tom de Vries Oct. 10, 2022, 2:23 p.m. UTC | #1
On 10/10/22 16:19, Thomas Schwinge wrote:
> With that, OK to push?

FWIW, nvptx change looks in the obvious category to me.

Thanks,
- Tom
  
Richard Biener Oct. 11, 2022, 6:40 a.m. UTC | #2
On Mon, Oct 10, 2022 at 4:23 PM Tom de Vries <tdevries@suse.de> wrote:
>
> On 10/10/22 16:19, Thomas Schwinge wrote:
> > With that, OK to push?
>
> FWIW, nvptx change looks in the obvious category to me.

Can you rename the functions as default_asm_out_* and instead of
reviving dbxout.cc
put them into targhooks.cc?

OK with that change.

Richard.

> Thanks,
> - Tom
  
Martin Liška Oct. 12, 2022, 9:21 a.m. UTC | #3
On 10/10/22 16:19, Thomas Schwinge wrote:
> Hi!
> 
> On 2022-09-01T12:05:23+0200, Martin Liška <mliska@suse.cz> wrote:
>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>>
>> I've also built all cross compilers.
> 
> First: thanks for that: clean up plus "built all cross compilers"!
> 
> But yet, I've now tracked down an issue related to these changes,
> apparently only visible via the nvptx back end -- and quite
> non-obvious...  ;-)
> 
>> --- a/gcc/config/nvptx/nvptx.cc
>> +++ b/gcc/config/nvptx/nvptx.cc
>> @@ -52,7 +52,6 @@
>>  #include "tm-preds.h"
>>  #include "tm-constrs.h"
>>  #include "langhooks.h"
>> -#include "dbxout.h"
>>  #include "cfgrtl.h"
>>  #include "gimple.h"
>>  #include "stor-layout.h"
> 
>> --- a/gcc/dbxout.cc
>> +++ /dev/null
>> @@ -1,3936 +0,0 @@
>> -/* Output dbx-format symbol table information from GNU compiler.
> 
> The "dbx-format symbol table information" stuff indeed is not relevant
> anymore, but:
> 
>> -/* Record an element in the table of global destructors.  SYMBOL is
>> -   a SYMBOL_REF of the function to be called; PRIORITY is a number
>> -   between 0 and MAX_INIT_PRIORITY.  */
>> -
>> -void
>> -default_stabs_asm_out_destructor (rtx symbol ATTRIBUTE_UNUSED,
>> -                               int priority ATTRIBUTE_UNUSED)
>> -{
>> -#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
>> -  /* Tell GNU LD that this is part of the static destructor set.
>> -     This will work for any system that uses stabs, most usefully
>> -     aout systems.  */
>> -  dbxout_begin_simple_stabs ("___DTOR_LIST__", 22 /* N_SETT */);
>> -  dbxout_stab_value_label (XSTR (symbol, 0));
>> -#else
>> -  sorry ("global destructors not supported on this target");
>> -#endif
>> -}
>> -
>> -/* Likewise for global constructors.  */
>> -
>> -void
>> -default_stabs_asm_out_constructor (rtx symbol ATTRIBUTE_UNUSED,
>> -                                int priority ATTRIBUTE_UNUSED)
>> -{
>> -#if defined DBX_DEBUGGING_INFO || defined XCOFF_DEBUGGING_INFO
>> -  /* Tell GNU LD that this is part of the static destructor set.
>> -     This will work for any system that uses stabs, most usefully
>> -     aout systems.  */
>> -  dbxout_begin_simple_stabs ("___CTOR_LIST__", 22 /* N_SETT */);
>> -  dbxout_stab_value_label (XSTR (symbol, 0));
>> -#else
>> -  sorry ("global constructors not supported on this target");
>> -#endif
>> -}
> 
>> --- a/gcc/dbxout.h
>> +++ /dev/null
>> @@ -1,60 +0,0 @@
>> -/* dbxout.h - Various declarations for functions found in dbxout.cc
> 
>> -extern void default_stabs_asm_out_destructor (rtx, int);
>> -extern void default_stabs_asm_out_constructor (rtx, int);
> 
> ... these two functions, 'default_stabs_asm_out_constructor',
> 'default_stabs_asm_out_destructor' (specifically, now their 'sorry'
> branches only) used to serve as default 'TARGET_ASM_CONSTRUCTOR',
> 'TARGET_ASM_DESTRUCTOR' via...
> 
>> --- a/gcc/target-def.h
>> +++ b/gcc/target-def.h
> 
> |  #if !defined(TARGET_ASM_CONSTRUCTOR) && !defined(USE_COLLECT2)
> |  # ifdef CTORS_SECTION_ASM_OP
> |  #  define TARGET_ASM_CONSTRUCTOR default_ctor_section_asm_out_constructor
>>  # else
>>  #  ifdef TARGET_ASM_NAMED_SECTION
>>  #   define TARGET_ASM_CONSTRUCTOR default_named_section_asm_out_constructor
>> -#  else
>> -#   define TARGET_ASM_CONSTRUCTOR default_stabs_asm_out_constructor
>>  #  endif
>>  # endif
>>  #endif
>> @@ -74,8 +72,6 @@
> |  #if !defined(TARGET_ASM_DESTRUCTOR) && !defined(USE_COLLECT2)
> |  # ifdef DTORS_SECTION_ASM_OP
> |  #  define TARGET_ASM_DESTRUCTOR default_dtor_section_asm_out_destructor
>>  # else
>>  #  ifdef TARGET_ASM_NAMED_SECTION
>>  #   define TARGET_ASM_DESTRUCTOR default_named_section_asm_out_destructor
>> -#  else
>> -#   define TARGET_ASM_DESTRUCTOR default_stabs_asm_out_destructor
>>  #  endif
>>  # endif
>>  #endif
> 
> ... this setup here (manually added some more context to the 'diff').
> 
> That is, if a back end was not 'USE_COLLECT2', nor manually defined
> 'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR', or got pointed to the
> respective 'default_[...]'  functions due to 'CTORS_SECTION_ASM_OP',
> 'DTORS_SECTION_ASM_OP', or 'TARGET_ASM_NAMED_SECTION', it got pointed to
> 'default_stabs_asm_out_constructor', 'default_stabs_asm_out_destructor'.
> These would emit 'sorry' for any global constructor/destructor they're
> run into.
> 
> This is now gone, and thus in such a back end configuration case
> 'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR' don't get defined
> anymore, and thus the subsequently following:
> 
>     #if !defined(TARGET_HAVE_CTORS_DTORS)
>     # if defined(TARGET_ASM_CONSTRUCTOR) && defined(TARGET_ASM_DESTRUCTOR)
>     # define TARGET_HAVE_CTORS_DTORS true
>     # endif
>     #endif
> 
> ... doesn't define 'TARGET_HAVE_CTORS_DTORS' anymore, and thus per my
> understanding, 'gcc/final.cc:rest_of_handle_final':
> 
>     if (DECL_STATIC_CONSTRUCTOR (current_function_decl)
>         && targetm.have_ctors_dtors)
>       targetm.asm_out.constructor (XEXP (DECL_RTL (current_function_decl), 0),
>                                    decl_init_priority_lookup
>                                      (current_function_decl));
>     if (DECL_STATIC_DESTRUCTOR (current_function_decl)
>         && targetm.have_ctors_dtors)
>       targetm.asm_out.destructor (XEXP (DECL_RTL (current_function_decl), 0),
>                                   decl_fini_priority_lookup
>                                     (current_function_decl));
> 
> ... simply does nothing anymore for a 'DECL_STATIC_CONSTRUCTOR',
> 'DECL_STATIC_DESTRUCTOR'.
> 
> This, effectively, means that GCC/nvptx now suddenly appears to "support"
> global constructors/destructors, which means that a ton of test cases now
> erroneously PASS that previously used to FAIL:
> 
>     sorry, unimplemented: global constructors not supported on this target
> 
> Of course, such support didn't magically happen due to
> "STABS: remove -gstabs and -gxcoff functionality", so this is bad.  And,
> corresponding execution testing then regularly FAILs (due to the global
> constructor/destructor functions never being invoked), for example:
> 
>     [-UNSUPPORTED:-]{+PASS:+} gcc.dg/initpri1.c {+(test for excess errors)+}
>     {+FAIL: gcc.dg/initpri1.c execution test+}
> 
>     [-UNSUPPORTED:-]{+PASS:+} g++.dg/special/conpr-1.C {+(test for excess errors)+}
>     {+FAIL: g++.dg/special/conpr-1.C execution test+}
> 
> To restore the previous GCC/nvptx behavior, I seek permission to first
> push the attached
> "Restore default 'sorry' 'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR'".
> For traceability, this simply restores the previous code, stripped down
> to the bare minimum.
> 
> As a next step, I'd then prepare a patch to re-work this thing, to make
> it more obvious what's actually happening there.  (Details to be done.
> For example, do we want to continue to have 'sorry' functions called via
> 'gcc/target-def.h', as done previously?  Or, should that be an '#error'
> case there, and the nvptx back end provides its own 'sorry' functions for
> 'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR'?  Or, emit 'sorry' in
> 'gcc/final.cc:rest_of_handle_final'?  Or, something else?)
> 
> 
> In addition to 'gcc/config/nvptx/nvptx.cc' (as quoted above) three more
> files did '#include "dbxout.h"', and thus potentially could use these
> 'sorry' default functions.
> 
> Per my testing of '--target=pdp11-aout' as well as
> '--target=powerpc64-darwin', re-introducing '#include "dbxout.h"' is not
> relevant for 'gcc/config/pdp11/pdp11.cc' as well as for
> 'gcc/config/rs6000/rs6000-call.cc' and
> 'gcc/config/rs6000/rs6000-logue.cc' (for 'TARGET_MACHO' only).
> 
> Target pdp11-aout is not affected, because of 'gcc/config.gcc' setting:
> 
>     # On a.out targets, we need to use collect2.
>     case ${target} in
>     *-*-*aout*)
>             use_collect2=yes
>             ;;
>     esac
> 
> Target powerpc64-darwin is not affected, because it defines
> 'TARGET_ASM_NAMED_SECTION'.
> 
> I'll thus remove those changes/TODO markers that are still present in the
> attached
> "Restore default 'sorry' 'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR'".
> With that, OK to push?
> 
> 
> Grüße
>  Thomas
> 
> 
> -----------------
> Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955

Hi Thomas.

Thanks for the fix, really appreciated!

Martin
  
Thomas Schwinge Nov. 4, 2022, 9:04 a.m. UTC | #4
Hi!

On 2022-10-12T11:21:19+0200, Martin Liška <mliska@suse.cz> wrote:
> On 10/10/22 16:19, Thomas Schwinge wrote:
>> attached
>> "Restore default 'sorry' 'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR'".

> Thanks for the fix, really appreciated!

Pushed to master branch commit 4ee35c11fd328728c12f3e086ae016ca94624bf8
"Restore default 'sorry' 'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR'",
see attached.


Grüße
 Thomas
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
  
Thomas Schwinge Nov. 4, 2022, 9:07 a.m. UTC | #5
Hi!

On 2022-11-04T10:04:59+0100,  wrote:
> On 2022-10-12T11:21:19+0200, Martin Liška <mliska@suse.cz> wrote:
>> On 10/10/22 16:19, Thomas Schwinge wrote:
>>> attached
>>> "Restore default 'sorry' 'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR'".
>
>> Thanks for the fix, really appreciated!
>
> Pushed to master branch commit 4ee35c11fd328728c12f3e086ae016ca94624bf8
> "Restore default 'sorry' 'TARGET_ASM_CONSTRUCTOR', 'TARGET_ASM_DESTRUCTOR'"

..., see attached now.  ;-)


Grüße
 Thomas


-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
  

Patch

From a2fd19176bb1d9111ba0826b979ae0cdf50957dc Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>
Date: Sun, 9 Oct 2022 22:39:02 +0200
Subject: [PATCH] [WIP] Restore default 'sorry' 'TARGET_ASM_CONSTRUCTOR',
 'TARGET_ASM_DESTRUCTOR'

... that got lost in
commit 7e0db0cdf01e9c885a29cb37415f5bc00d90c029
"STABS: remove -gstabs and -gxcoff functionality".
---
 gcc/Makefile.in                   |  1 +
 gcc/config/nvptx/nvptx.cc         |  1 +
 gcc/config/pdp11/pdp11.cc         |  1 +
 gcc/config/rs6000/rs6000-call.cc  |  4 +++
 gcc/config/rs6000/rs6000-logue.cc |  3 +++
 gcc/dbxout.cc                     | 43 +++++++++++++++++++++++++++++++
 gcc/dbxout.h                      | 25 ++++++++++++++++++
 gcc/target-def.h                  |  4 +++
 8 files changed, 82 insertions(+)
 create mode 100644 gcc/dbxout.cc
 create mode 100644 gcc/dbxout.h

diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 59b67d994415..4808f6770ca1 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1354,6 +1354,7 @@  OBJS = \
 	data-streamer.o \
 	data-streamer-in.o \
 	data-streamer-out.o \
+	dbxout.o \
 	dbgcnt.o \
 	dce.o \
 	ddg.o \
diff --git a/gcc/config/nvptx/nvptx.cc b/gcc/config/nvptx/nvptx.cc
index 2fe120b38730..4cb5d02d40cd 100644
--- a/gcc/config/nvptx/nvptx.cc
+++ b/gcc/config/nvptx/nvptx.cc
@@ -52,6 +52,7 @@ 
 #include "tm-preds.h"
 #include "tm-constrs.h"
 #include "langhooks.h"
+#include "dbxout.h"
 #include "cfgrtl.h"
 #include "gimple.h"
 #include "stor-layout.h"
diff --git a/gcc/config/pdp11/pdp11.cc b/gcc/config/pdp11/pdp11.cc
index 380223439a47..ae73c1f7bb98 100644
--- a/gcc/config/pdp11/pdp11.cc
+++ b/gcc/config/pdp11/pdp11.cc
@@ -44,6 +44,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "calls.h"
 #include "expr.h"
 #include "builtins.h"
+//TODO #include "dbxout.h"
 #include "explow.h"
 #include "expmed.h"
 
diff --git a/gcc/config/rs6000/rs6000-call.cc b/gcc/config/rs6000/rs6000-call.cc
index ac3cb7e3d362..27971ecd0333 100644
--- a/gcc/config/rs6000/rs6000-call.cc
+++ b/gcc/config/rs6000/rs6000-call.cc
@@ -67,6 +67,10 @@ 
 
 #include "rs6000-internal.h"
 
+#if TARGET_MACHO
+//TODO #include "dbxout.h" /* dbxout_ */
+#endif
+
 #ifndef TARGET_PROFILE_KERNEL
 #define TARGET_PROFILE_KERNEL 0
 #endif
diff --git a/gcc/config/rs6000/rs6000-logue.cc b/gcc/config/rs6000/rs6000-logue.cc
index a11d020ccd0c..3aa60719f3b8 100644
--- a/gcc/config/rs6000/rs6000-logue.cc
+++ b/gcc/config/rs6000/rs6000-logue.cc
@@ -47,6 +47,9 @@ 
 #include "diagnostic-core.h"
 #include "alias.h"
 #include "rs6000-internal.h"
+#if TARGET_MACHO
+//TODO #include "dbxout.h" /* dbxout_ */
+#endif
 
 static int rs6000_ra_ever_killed (void);
 static void is_altivec_return_reg (rtx, void *);
diff --git a/gcc/dbxout.cc b/gcc/dbxout.cc
new file mode 100644
index 000000000000..161eeb196537
--- /dev/null
+++ b/gcc/dbxout.cc
@@ -0,0 +1,43 @@ 
+/* Copyright (C) 1987-2022 Free Software Foundation, Inc.
+
+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/>.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "diagnostic-core.h"
+#include "dbxout.h"
+
+/* Record an element in the table of global destructors.  SYMBOL is
+   a SYMBOL_REF of the function to be called; PRIORITY is a number
+   between 0 and MAX_INIT_PRIORITY.  */
+
+void
+default_stabs_asm_out_destructor (rtx symbol ATTRIBUTE_UNUSED,
+				  int priority ATTRIBUTE_UNUSED)
+{
+  sorry ("global destructors not supported on this target");
+}
+
+/* Likewise for global constructors.  */
+
+void
+default_stabs_asm_out_constructor (rtx symbol ATTRIBUTE_UNUSED,
+				   int priority ATTRIBUTE_UNUSED)
+{
+  sorry ("global constructors not supported on this target");
+}
diff --git a/gcc/dbxout.h b/gcc/dbxout.h
new file mode 100644
index 000000000000..ad0b538cabf1
--- /dev/null
+++ b/gcc/dbxout.h
@@ -0,0 +1,25 @@ 
+/* Copyright (C) 1998-2022 Free Software Foundation, Inc.
+
+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/>.  */
+
+#ifndef GCC_DBXOUT_H
+#define GCC_DBXOUT_H
+
+extern void default_stabs_asm_out_destructor (rtx, int);
+extern void default_stabs_asm_out_constructor (rtx, int);
+
+#endif /* GCC_DBXOUT_H */
diff --git a/gcc/target-def.h b/gcc/target-def.h
index f81f8fe3bb39..1c4aa2963dc4 100644
--- a/gcc/target-def.h
+++ b/gcc/target-def.h
@@ -62,6 +62,8 @@ 
 # else
 #  ifdef TARGET_ASM_NAMED_SECTION
 #   define TARGET_ASM_CONSTRUCTOR default_named_section_asm_out_constructor
+#  else
+#   define TARGET_ASM_CONSTRUCTOR default_stabs_asm_out_constructor
 #  endif
 # endif
 #endif
@@ -72,6 +74,8 @@ 
 # else
 #  ifdef TARGET_ASM_NAMED_SECTION
 #   define TARGET_ASM_DESTRUCTOR default_named_section_asm_out_destructor
+#  else
+#   define TARGET_ASM_DESTRUCTOR default_stabs_asm_out_destructor
 #  endif
 # endif
 #endif
-- 
2.35.1