diff mbox series

[v1,5/9] aarch64: Multiple adjustments to support the SMALL code model correctly

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

Commit Message

Evgeny Karpov Sept. 2, 2024, 1:07 p.m. UTC
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(-)

Comments

Richard Sandiford Sept. 2, 2024, 3:26 p.m. UTC | #1
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 mbox series

Patch

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);