Message ID | DBBPR83MB0613F2F4269D1E4C34771B65F8922@DBBPR83MB0613.EURPRD83.prod.outlook.com |
---|---|
State | New |
Headers | show |
Series | SMALL code model fixes, optimization fixes, LTO and minimal C++ enablement | expand |
Evgeny Karpov <Evgeny.Karpov@microsoft.com> writes: > LOCAL_LABEL_PREFIX has been changed to help the assembly > compiler recognize local labels. Emitting locals has been > replaced with the .lcomm directive to declare uninitialized > data without defining an exact section. Functions and objects > were missing declarations. Binutils was not able to distinguish > static from external, or an object from a function. > mingw_pe_declare_object_type has been added to have type > information for relocation on AArch64, which is not the case > for ix86. > > This fix relies on changes in binutils. > aarch64: Relocation fixes and LTO > https://sourceware.org/pipermail/binutils/2024-August/136481.html > > gcc/ChangeLog: > > * config/aarch64/aarch64-coff.h (LOCAL_LABEL_PREFIX): > Use "." as the local label prefix. > (ASM_OUTPUT_ALIGNED_LOCAL): Remove. > (ASM_OUTPUT_LOCAL): New. > * config/aarch64/cygming.h (ASM_DECLARE_OBJECT_NAME): > New. > (ASM_DECLARE_FUNCTION_NAME): New. > * config/mingw/winnt.cc (mingw_pe_declare_object_type): > New. > * config/mingw/winnt.h (mingw_pe_declare_object_type): > New. > --- > gcc/config/aarch64/aarch64-coff.h | 22 ++++++---------------- > gcc/config/aarch64/cygming.h | 12 ++++++++++++ > gcc/config/mingw/winnt.cc | 10 ++++++++++ > gcc/config/mingw/winnt.h | 2 ++ > 4 files changed, 30 insertions(+), 16 deletions(-) > > diff --git a/gcc/config/aarch64/aarch64-coff.h b/gcc/config/aarch64/aarch64-coff.h > index 81fd9954f75..77c09df82e4 100644 > --- a/gcc/config/aarch64/aarch64-coff.h > +++ b/gcc/config/aarch64/aarch64-coff.h > @@ -20,9 +20,8 @@ > #ifndef GCC_AARCH64_COFF_H > #define GCC_AARCH64_COFF_H > > -#ifndef LOCAL_LABEL_PREFIX > -# define LOCAL_LABEL_PREFIX "" > -#endif > +#undef LOCAL_LABEL_PREFIX > +#define LOCAL_LABEL_PREFIX "." > > /* Using long long breaks -ansi and -std=c90, so these will need to be > made conditional for an LLP64 ABI. */ > @@ -54,19 +53,10 @@ > } > #endif > > -/* Output a local common block. /bin/as can't do this, so hack a > - `.space' into the bss segment. Note that this is *bad* practice, > - which is guaranteed NOT to work since it doesn't define STATIC > - COMMON space but merely STATIC BSS space. */ > -#ifndef ASM_OUTPUT_ALIGNED_LOCAL > -# define ASM_OUTPUT_ALIGNED_LOCAL(STREAM, NAME, SIZE, ALIGN) \ > - { \ > - switch_to_section (bss_section); \ > - ASM_OUTPUT_ALIGN (STREAM, floor_log2 (ALIGN / BITS_PER_UNIT)); \ > - ASM_OUTPUT_LABEL (STREAM, NAME); \ > - fprintf (STREAM, "\t.space\t%d\n", (int)(SIZE)); \ > - } > -#endif > +#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \ > +( fputs (".lcomm ", (FILE)), \ > + assemble_name ((FILE), (NAME)), \ > + fprintf ((FILE), ",%u\n", (int)(ROUNDED))) I realise this is pre-existing, bue the last line should probably be: fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", (ROUNDED))) to avoid silent truncation. (Even if the format only supports 32-bit code and data, it's better for out-of-bounds values to be flagged by the assembler rather than silently truncated.) > #define ASM_OUTPUT_SKIP(STREAM, NBYTES) \ > fprintf (STREAM, "\t.space\t%d // skip\n", (int) (NBYTES)) > diff --git a/gcc/config/aarch64/cygming.h b/gcc/config/aarch64/cygming.h > index e4ceab82b9e..d3c6f550b68 100644 > --- a/gcc/config/aarch64/cygming.h > +++ b/gcc/config/aarch64/cygming.h > @@ -213,6 +213,18 @@ still needed for compilation. */ > > #define SUPPORTS_ONE_ONLY 1 > > +#undef ASM_DECLARE_OBJECT_NAME > +#define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL) \ > + mingw_pe_declare_object_type (STREAM, NAME, TREE_PUBLIC (DECL)); \ > + ASM_OUTPUT_LABEL ((STREAM), (NAME)) > + > + > +#undef ASM_DECLARE_FUNCTION_NAME > +#define ASM_DECLARE_FUNCTION_NAME(STR, NAME, DECL) \ > + mingw_pe_declare_function_type (STR, NAME, TREE_PUBLIC (DECL)); \ > + aarch64_declare_function_name (STR, NAME, DECL) > + > + These two should probaly either be wrapped in: do { ... ] while (0) or use comma expressions (as for the .lcomm printing above). Using "STREAM" rather than "STR" in ASM_DECLARE_FUNCTION_NAME would be more consistent with ASM_DECLARE_OBJECT_NAME. > /* Define this to be nonzero if static stack checking is supported. */ > #define STACK_CHECK_STATIC_BUILTIN 1 > > diff --git a/gcc/config/mingw/winnt.cc b/gcc/config/mingw/winnt.cc > index 1e2ec53e841..64157b09644 100644 > --- a/gcc/config/mingw/winnt.cc > +++ b/gcc/config/mingw/winnt.cc > @@ -581,6 +581,16 @@ i386_pe_asm_output_aligned_decl_common (FILE *stream, tree decl, > function, and PUB is nonzero if the function is globally > visible. */ > > +void > +mingw_pe_declare_object_type (FILE *file, const char *name, int pub) The new function should have its own comment (the existing one describes mingw_pe_declare_function_type). Could we make "pub" a bool for both functions? Maybe the two functions are similar enough that it would be worth having them forward to an internal helper that takes DT_NON or DT_FCN as appropriate. I suppose that's more personal preference though, so let me know if you disagree. Looks good otherwise. Thanks, Richard > +{ > + fprintf (file, "\t.def\t"); > + assemble_name (file, name); > + fprintf (file, ";\t.scl\t%d;\t.type\t%d;\t.endef\n", > + pub ? (int) C_EXT : (int) C_STAT, > + (int) DT_NON << N_BTSHFT); > +} > + > void > mingw_pe_declare_function_type (FILE *file, const char *name, int pub) > { > diff --git a/gcc/config/mingw/winnt.h b/gcc/config/mingw/winnt.h > index a21a36b7e5d..f375d071170 100644 > --- a/gcc/config/mingw/winnt.h > +++ b/gcc/config/mingw/winnt.h > @@ -25,6 +25,8 @@ extern tree mingw_handle_selectany_attribute (tree *, tree, tree, int, bool *); > extern void mingw_pe_asm_named_section (const char *, unsigned int, tree); > extern void mingw_pe_declare_function_type (FILE *file, const char *name, > int pub); > +extern void mingw_pe_declare_object_type (FILE *file, const char *name, > + int pub); > extern void mingw_pe_encode_section_info (tree, rtx, int); > extern void mingw_pe_file_end (void); > extern void mingw_pe_maybe_record_exported_symbol (tree, const char *, int);
diff --git a/gcc/config/aarch64/aarch64-coff.h b/gcc/config/aarch64/aarch64-coff.h index 81fd9954f75..77c09df82e4 100644 --- a/gcc/config/aarch64/aarch64-coff.h +++ b/gcc/config/aarch64/aarch64-coff.h @@ -20,9 +20,8 @@ #ifndef GCC_AARCH64_COFF_H #define GCC_AARCH64_COFF_H -#ifndef LOCAL_LABEL_PREFIX -# define LOCAL_LABEL_PREFIX "" -#endif +#undef LOCAL_LABEL_PREFIX +#define LOCAL_LABEL_PREFIX "." /* Using long long breaks -ansi and -std=c90, so these will need to be made conditional for an LLP64 ABI. */ @@ -54,19 +53,10 @@ } #endif -/* Output a local common block. /bin/as can't do this, so hack a - `.space' into the bss segment. Note that this is *bad* practice, - which is guaranteed NOT to work since it doesn't define STATIC - COMMON space but merely STATIC BSS space. */ -#ifndef ASM_OUTPUT_ALIGNED_LOCAL -# define ASM_OUTPUT_ALIGNED_LOCAL(STREAM, NAME, SIZE, ALIGN) \ - { \ - switch_to_section (bss_section); \ - ASM_OUTPUT_ALIGN (STREAM, floor_log2 (ALIGN / BITS_PER_UNIT)); \ - ASM_OUTPUT_LABEL (STREAM, NAME); \ - fprintf (STREAM, "\t.space\t%d\n", (int)(SIZE)); \ - } -#endif +#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \ +( fputs (".lcomm ", (FILE)), \ + assemble_name ((FILE), (NAME)), \ + fprintf ((FILE), ",%u\n", (int)(ROUNDED))) #define ASM_OUTPUT_SKIP(STREAM, NBYTES) \ fprintf (STREAM, "\t.space\t%d // skip\n", (int) (NBYTES)) diff --git a/gcc/config/aarch64/cygming.h b/gcc/config/aarch64/cygming.h index e4ceab82b9e..d3c6f550b68 100644 --- a/gcc/config/aarch64/cygming.h +++ b/gcc/config/aarch64/cygming.h @@ -213,6 +213,18 @@ still needed for compilation. */ #define SUPPORTS_ONE_ONLY 1 +#undef ASM_DECLARE_OBJECT_NAME +#define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL) \ + mingw_pe_declare_object_type (STREAM, NAME, TREE_PUBLIC (DECL)); \ + ASM_OUTPUT_LABEL ((STREAM), (NAME)) + + +#undef ASM_DECLARE_FUNCTION_NAME +#define ASM_DECLARE_FUNCTION_NAME(STR, NAME, DECL) \ + mingw_pe_declare_function_type (STR, NAME, TREE_PUBLIC (DECL)); \ + aarch64_declare_function_name (STR, NAME, DECL) + + /* Define this to be nonzero if static stack checking is supported. */ #define STACK_CHECK_STATIC_BUILTIN 1 diff --git a/gcc/config/mingw/winnt.cc b/gcc/config/mingw/winnt.cc index 1e2ec53e841..64157b09644 100644 --- a/gcc/config/mingw/winnt.cc +++ b/gcc/config/mingw/winnt.cc @@ -581,6 +581,16 @@ i386_pe_asm_output_aligned_decl_common (FILE *stream, tree decl, function, and PUB is nonzero if the function is globally visible. */ +void +mingw_pe_declare_object_type (FILE *file, const char *name, int pub) +{ + fprintf (file, "\t.def\t"); + assemble_name (file, name); + fprintf (file, ";\t.scl\t%d;\t.type\t%d;\t.endef\n", + pub ? (int) C_EXT : (int) C_STAT, + (int) DT_NON << N_BTSHFT); +} + void mingw_pe_declare_function_type (FILE *file, const char *name, int pub) { diff --git a/gcc/config/mingw/winnt.h b/gcc/config/mingw/winnt.h index a21a36b7e5d..f375d071170 100644 --- a/gcc/config/mingw/winnt.h +++ b/gcc/config/mingw/winnt.h @@ -25,6 +25,8 @@ extern tree mingw_handle_selectany_attribute (tree *, tree, tree, int, bool *); extern void mingw_pe_asm_named_section (const char *, unsigned int, tree); extern void mingw_pe_declare_function_type (FILE *file, const char *name, int pub); +extern void mingw_pe_declare_object_type (FILE *file, const char *name, + int pub); extern void mingw_pe_encode_section_info (tree, rtx, int); extern void mingw_pe_file_end (void); extern void mingw_pe_maybe_record_exported_symbol (tree, const char *, int);