Evgeny Karpov <evgeny.kar...@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_OUTPUT_EXTERNAL_LIBCALL): > Update. > (ASM_DECLARE_OBJECT_NAME): New. > (ASM_DECLARE_FUNCTION_NAME): New. > * config/i386/cygming.h (ASM_DECLARE_COLD_FUNCTION_NAME): > Update. > (ASM_OUTPUT_EXTERNAL_LIBCALL): Update. > * config/mingw/winnt.cc (mingw_pe_declare_function_type): > Rename into ... > (mingw_pe_declare_type): ... this. > (i386_pe_start_function): Update. > * config/mingw/winnt.h (mingw_pe_declare_function_type): > Rename into ... > (mingw_pe_declare_type): ... this. > --- > gcc/config/aarch64/aarch64-coff.h | 22 ++++++---------------- > gcc/config/aarch64/cygming.h | 18 +++++++++++++++++- > gcc/config/i386/cygming.h | 8 ++++---- > gcc/config/mingw/winnt.cc | 18 +++++++++--------- > gcc/config/mingw/winnt.h | 3 +-- > 5 files changed, 37 insertions(+), 32 deletions(-) > > diff --git a/gcc/config/aarch64/aarch64-coff.h > b/gcc/config/aarch64/aarch64-coff.h > index 81fd9954f75..8fc6ca0440d 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), "," HOST_WIDE_INT_PRINT_UNSIGNED "\n", (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..3afeb77110d 100644 > --- a/gcc/config/aarch64/cygming.h > +++ b/gcc/config/aarch64/cygming.h > @@ -78,7 +78,7 @@ still needed for compilation. */ > > /* Declare the type properly for any external libcall. */ > #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ > - mingw_pe_declare_function_type (FILE, XSTR (FUN, 0), 1) > + mingw_pe_declare_type (FILE, XSTR (FUN, 0), 1, 1) > > /* Use section relative relocations for debugging offsets. Unlike > other targets that fake this by putting the section VMA at 0, PE > @@ -213,6 +213,22 @@ still needed for compilation. */ > > #define SUPPORTS_ONE_ONLY 1 > > +#undef ASM_DECLARE_OBJECT_NAME > +#define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL) \ > + do { > \ > + mingw_pe_declare_type (STREAM, NAME, TREE_PUBLIC (DECL), 0); \ > + ASM_OUTPUT_LABEL ((STREAM), (NAME)); \ > + } while (0) > + > + > +#undef ASM_DECLARE_FUNCTION_NAME > +#define ASM_DECLARE_FUNCTION_NAME(STREAM, NAME, DECL) \ > + do { > \ > + mingw_pe_declare_type (STREAM, NAME, TREE_PUBLIC (DECL), 1); \ > + aarch64_declare_function_name (STREAM, NAME, DECL); > \ > + } while (0) > + > + > /* Define this to be nonzero if static stack checking is supported. */ > #define STACK_CHECK_STATIC_BUILTIN 1 > > diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h > index 67bfb8d641b..7852af6050a 100644 > --- a/gcc/config/i386/cygming.h > +++ b/gcc/config/i386/cygming.h > @@ -309,7 +309,7 @@ do { \ > #define ASM_DECLARE_COLD_FUNCTION_NAME(FILE, NAME, DECL) \ > do \ > { \ > - mingw_pe_declare_function_type (FILE, NAME, 0); \ > + mingw_pe_declare_type (FILE, NAME, 0, 1); \ > i386_pe_seh_cold_init (FILE, NAME); \ > ASM_OUTPUT_LABEL (FILE, NAME); \ > } \ > @@ -335,7 +335,7 @@ do { \ > > /* Declare the type properly for any external libcall. */ > #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ > - mingw_pe_declare_function_type (FILE, XSTR (FUN, 0), 1) > + mingw_pe_declare_type (FILE, XSTR (FUN, 0), 1, 1) > > /* This says out to put a global symbol in the BSS section. */ > #undef ASM_OUTPUT_ALIGNED_BSS > @@ -420,8 +420,8 @@ do { \ > = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL)); \ > mingw_pe_maybe_record_exported_symbol (DECL, alias, 0); > \ > if (TREE_CODE (DECL) == FUNCTION_DECL) \ > - mingw_pe_declare_function_type (STREAM, alias, \ > - TREE_PUBLIC (DECL)); \ > + mingw_pe_declare_type (STREAM, alias, \ > + TREE_PUBLIC (DECL), 1); \ > ASM_OUTPUT_DEF (STREAM, alias, IDENTIFIER_POINTER (TARGET)); \ > } while (0) > > diff --git a/gcc/config/mingw/winnt.cc b/gcc/config/mingw/winnt.cc > index 61e360b287c..210211ae2c2 100644 > --- a/gcc/config/mingw/winnt.cc > +++ b/gcc/config/mingw/winnt.cc > @@ -576,20 +576,20 @@ i386_pe_asm_output_aligned_decl_common (FILE *stream, > tree decl, > > #include "gsyms.h" > > -/* Mark a function appropriately. This should only be called for > +/* Mark a function or an object appropriately. This should only be called > for > functions for which we are not emitting COFF debugging information. > FILE is the assembler output file, NAME is the name of the > function, and PUB is nonzero if the function is globally > visible. */ > > void > -mingw_pe_declare_function_type (FILE *file, const char *name, int pub) > +mingw_pe_declare_type (FILE *file, const char *name, bool pub, bool func) > { > 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_FCN << N_BTSHFT); > + (int) (func ? DT_FCN : DT_NON) << N_BTSHFT); > } > > /* Keep a list of external functions. */ > @@ -772,12 +772,12 @@ mingw_pe_file_end (void) > the real function so that an (unused) import is created. */ > const char *realsym = i386_find_on_wrapper_list (p->name); > if (realsym) > - mingw_pe_declare_function_type (asm_out_file, > - concat ("__real_", realsym, NULL), TREE_PUBLIC (decl)); > + mingw_pe_declare_type (asm_out_file, > + concat ("__real_", realsym, NULL), TREE_PUBLIC (decl), 1); > #endif /* CXX_WRAP_SPEC_LIST */ > TREE_ASM_WRITTEN (decl) = 1; > - mingw_pe_declare_function_type (asm_out_file, p->name, > - TREE_PUBLIC (decl)); > + mingw_pe_declare_type (asm_out_file, p->name, > + TREE_PUBLIC (decl), 1);
Formatting nit: the line above should be reindented for the new function name. LGTM otherwise. Thanks, Richard > } > } > > @@ -816,7 +816,7 @@ mingw_pe_file_end (void) > #ifdef ASM_WEAKEN_LABEL > ASM_WEAKEN_LABEL (asm_out_file, name); > #endif > - mingw_pe_declare_function_type (asm_out_file, name, 1); > + mingw_pe_declare_type (asm_out_file, name, 1, 1); > } > > fprintf (asm_out_file, "\t.section\t.rdata$%s, \"dr\"\n" > @@ -1375,7 +1375,7 @@ void > i386_pe_start_function (FILE *f, const char *name, tree decl) > { > mingw_pe_maybe_record_exported_symbol (decl, name, 0); > - mingw_pe_declare_function_type (f, name, TREE_PUBLIC (decl)); > + mingw_pe_declare_type (f, name, TREE_PUBLIC (decl), 1); > /* In case section was altered by debugging output. */ > if (decl != NULL_TREE) > switch_to_section (function_section (decl)); > diff --git a/gcc/config/mingw/winnt.h b/gcc/config/mingw/winnt.h > index a21a36b7e5d..14bff19e697 100644 > --- a/gcc/config/mingw/winnt.h > +++ b/gcc/config/mingw/winnt.h > @@ -23,8 +23,7 @@ http://www.gnu.org/licenses/. */ > 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_type (FILE *, const char *, bool, bool); > 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);