From a0086b73d0e029c8888ab2f65a91e67a2502e4d4 Mon Sep 17 00:00:00 2001 From: Jozef Lawrynowicz Date: Wed, 30 Oct 2019 16:39:52 +0000 Subject: [PATCH 3/4] MSP430: Disable __cxa_atexit gcc/ChangeLog: 2019-11-07 Jozef Lawrynowicz * config.gcc (msp430*-*-*): Disable __cxa_atexit by default. * config/msp430/msp430.c (msp430_option_override): Emit an error if -fuse-cxa-atexit was used when __cxa_atexit was disabled at configure time. * config/msp430/msp430.h (TARGET_LIBGCC_REMOVE_DSO_HANDLE): Define if __cxa_atexit was disabled at configure time. gcc/testsuite/ChangeLog: 2019-11-07 Jozef Lawrynowicz * g++.dg/init/dso_handle1.C: Add dg-require-cxa-atexit. * g++.dg/init/dso_handle2.C: Likewise. * g++.dg/other/cxa-atexit1.C: Likewise. * lib/target-supports.exp (check_cxa_atexit_available): Add hard-coded case for msp430. --- gcc/config.gcc | 7 +++++++ gcc/config/msp430/msp430.c | 9 +++++++++ gcc/config/msp430/msp430.h | 6 ++++++ gcc/testsuite/g++.dg/init/dso_handle1.C | 1 + gcc/testsuite/g++.dg/init/dso_handle2.C | 1 + gcc/testsuite/g++.dg/other/cxa-atexit1.C | 1 + gcc/testsuite/lib/target-supports.exp | 3 +++ 7 files changed, 28 insertions(+) diff --git a/gcc/config.gcc b/gcc/config.gcc index d74bcbb9856..2e79101cc8f 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -2533,6 +2533,13 @@ msp430*-*-*) tmake_file="${tmake_file} msp430/t-msp430" extra_objs="${extra_objs} msp430-devices.o" extra_gcc_objs="driver-msp430.o msp430-devices.o" + + # __cxa_atexit increases code size, and we don't need to support dynamic + # shared objects on MSP430, so regular Newlib atexit is a fine + # replacement as it also supports registration of more than 32 + # functions. + default_use_cxa_atexit=no + # Enable .init_array unless it has been explicitly disabled. # The MSP430 EABI mandates the use of .init_array, and the Newlib CRT # code since mid-2019 expects it. diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c index fe1fcc0db43..ce8d863abd3 100644 --- a/gcc/config/msp430/msp430.c +++ b/gcc/config/msp430/msp430.c @@ -284,6 +284,15 @@ msp430_option_override (void) possible to build newlib with -Os enabled. Until now... */ if (TARGET_OPT_SPACE && optimize < 3) optimize_size = 1; + +#if !DEFAULT_USE_CXA_ATEXIT + /* By default, we enforce atexit() instead of __cxa_atexit() to save on code + size and remove the declaration of __dso_handle from the CRT library. + Configuring GCC with --enable-__cxa-atexit re-enables it by defining + DEFAULT_USE_CXA_ATEXIT to 1. */ + if (flag_use_cxa_atexit) + error ("%<-fuse-cxa-atexit%> is not supported for msp430-elf"); +#endif } #undef TARGET_SCALAR_MODE_SUPPORTED_P diff --git a/gcc/config/msp430/msp430.h b/gcc/config/msp430/msp430.h index 90ceec0e947..25944125182 100644 --- a/gcc/config/msp430/msp430.h +++ b/gcc/config/msp430/msp430.h @@ -509,4 +509,10 @@ typedef struct #define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN) \ msp430_output_aligned_decl_common ((FILE), (DECL), (NAME), (SIZE), (ALIGN)) +#if !DEFAULT_USE_CXA_ATEXIT +/* We're not using __cxa_atexit, so __dso_handle isn't needed. */ +#undef TARGET_LIBGCC_REMOVE_DSO_HANDLE +#define TARGET_LIBGCC_REMOVE_DSO_HANDLE +#endif + #define SYMBOL_FLAG_LOW_MEM (SYMBOL_FLAG_MACH_DEP << 0) diff --git a/gcc/testsuite/g++.dg/init/dso_handle1.C b/gcc/testsuite/g++.dg/init/dso_handle1.C index 97f67cad8f4..dc92e22d12a 100644 --- a/gcc/testsuite/g++.dg/init/dso_handle1.C +++ b/gcc/testsuite/g++.dg/init/dso_handle1.C @@ -1,6 +1,7 @@ // PR c++/17042 // { dg-do assemble } /* { dg-require-weak "" } */ +// { dg-require-cxa-atexit "" } // { dg-options "-fuse-cxa-atexit" } struct A diff --git a/gcc/testsuite/g++.dg/init/dso_handle2.C b/gcc/testsuite/g++.dg/init/dso_handle2.C index b219dc02611..6e151e50fa7 100644 --- a/gcc/testsuite/g++.dg/init/dso_handle2.C +++ b/gcc/testsuite/g++.dg/init/dso_handle2.C @@ -1,4 +1,5 @@ // PR c++/58846 +// { dg-require-cxa-atexit "" } // { dg-options "-fuse-cxa-atexit" } extern "C" { char* __dso_handle; } diff --git a/gcc/testsuite/g++.dg/other/cxa-atexit1.C b/gcc/testsuite/g++.dg/other/cxa-atexit1.C index a51f3340142..d6ab3dc4733 100644 --- a/gcc/testsuite/g++.dg/other/cxa-atexit1.C +++ b/gcc/testsuite/g++.dg/other/cxa-atexit1.C @@ -1,4 +1,5 @@ // { dg-do compile } +// { dg-require-cxa-atexit "" } // { dg-options "-O2 -fuse-cxa-atexit" } # 1 "cxa-atexit1.C" diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 6c836a4accc..58bedb64d42 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -2513,6 +2513,9 @@ proc check_cxa_atexit_available { } { } elseif { [istarget *-*-vxworks] } { # vxworks doesn't have __cxa_atexit but subsequent test passes. expr 0 + } elseif { [istarget msp430-*-*] } { + # msp430 doesn't have __cxa_atexit but subsequent test passes. + expr 0 } else { check_runtime_nocache cxa_atexit_available { // C++ -- 2.17.1