@@ -1690,6 +1690,13 @@
#endif
+/* Define to 1 if your linker supports
+ GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS. */
+#ifndef USED_FOR_TARGET
+#undef HAVE_LD_INDIRECT_EXTERN_ACCESS_SUPPORT
+#endif
+
+
/* Define if your PowerPC64 linker supports a large TOC. */
#ifndef USED_FOR_TARGET
#undef HAVE_LD_LARGE_TOC
@@ -24,37 +24,6 @@ along with GCC; see the file COPYING3. If not see
#include "output.h"
#include "linux-common.h"
-static void
-emit_gnu_property (unsigned int type, unsigned int data)
-{
- int p2align = ptr_mode == SImode ? 2 : 3;
-
- switch_to_section (get_section (".note.gnu.property",
- SECTION_NOTYPE, NULL));
-
- ASM_OUTPUT_ALIGN (asm_out_file, p2align);
- /* name length. */
- fprintf (asm_out_file, ASM_LONG "1f - 0f\n");
- /* data length. */
- fprintf (asm_out_file, ASM_LONG "4f - 1f\n");
- /* note type: NT_GNU_PROPERTY_TYPE_0. */
- fprintf (asm_out_file, ASM_LONG "5\n");
- fprintf (asm_out_file, "0:\n");
- /* vendor name: "GNU". */
- fprintf (asm_out_file, STRING_ASM_OP "\"GNU\"\n");
- fprintf (asm_out_file, "1:\n");
- ASM_OUTPUT_ALIGN (asm_out_file, p2align);
- /* pr_type. */
- fprintf (asm_out_file, ASM_LONG "0x%x\n", type);
- /* pr_datasz. */
- fprintf (asm_out_file, ASM_LONG "3f - 2f\n");
- fprintf (asm_out_file, "2:\n");
- fprintf (asm_out_file, ASM_LONG "0x%x\n", data);
- fprintf (asm_out_file, "3:\n");
- ASM_OUTPUT_ALIGN (asm_out_file, p2align);
- fprintf (asm_out_file, "4:\n");
-}
-
void
file_end_indicate_exec_stack_and_gnu_property (void)
{
@@ -24569,6 +24569,8 @@ ix86_libgcc_floating_mode_supported_p
#if !TARGET_MACHO && !TARGET_DLLIMPORT_DECL_ATTRIBUTES
# undef TARGET_ASM_RELOC_RW_MASK
# define TARGET_ASM_RELOC_RW_MASK ix86_reloc_rw_mask
+# undef TARGET_ASM_EMIT_GNU_PROPERTY_NOTE
+# define TARGET_ASM_EMIT_GNU_PROPERTY_NOTE emit_gnu_property_note
#endif
static bool ix86_libc_has_fast_function (int fcode ATTRIBUTE_UNUSED)
@@ -32172,6 +32172,33 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_bndplt_support" >&5
$as_echo "$ld_bndplt_support" >&6; }
+# Check if linker supports GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS.
+ld_indirect_extern_access=0
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking linker with GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS" >&5
+$as_echo_n "checking linker with GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS... " >&6; }
+if test x"$ld_is_gold" = xno; then
+ # GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS supported was added to
+ # GNU linker for binutils 2.38 on 2021-07-09.
+ if test $in_tree_ld = yes ; then
+ if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 38 -o "$gcc_cv_gld_major_version" -gt 2; then
+ ld_indirect_extern_access=1
+ fi
+ elif echo "$ld_ver" | grep GNU > /dev/null; then
+ if test "$ld_vers_major" -eq 2 -a "$ld_vers_minor" -ge 37 -a "$ld_vers_patch" -ge 50 -a 0"$ld_date" -gt 20210709; then
+ ld_indirect_extern_access=1
+ elif test "$ld_vers_major" -eq 2 -a "$ld_vers_minor" -ge 38 -o "$ld_vers_major" -gt 2; then
+ ld_indirect_extern_access=1
+ fi
+ fi
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_LD_INDIRECT_EXTERN_ACCESS_SUPPORT $ld_indirect_extern_access
+_ACEOF
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_indirect_extern_access" >&5
+$as_echo "$ld_indirect_extern_access" >&6; }
+
# Check linker supports '--push-state'/'--pop-state'
ld_pushpopstate_support=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking linker --push-state/--pop-state options" >&5
@@ -7526,6 +7526,29 @@ if test x"$ld_bndplt_support" = xyes; then
fi
AC_MSG_RESULT($ld_bndplt_support)
+# Check if linker supports GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS.
+ld_indirect_extern_access=0
+AC_MSG_CHECKING(linker with GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS)
+if test x"$ld_is_gold" = xno; then
+ # GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS supported was added to
+ # GNU linker for binutils 2.38 on 2021-07-09.
+ if test $in_tree_ld = yes ; then
+ if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 38 -o "$gcc_cv_gld_major_version" -gt 2; then
+ ld_indirect_extern_access=1
+ fi
+ elif echo "$ld_ver" | grep GNU > /dev/null; then
+ if test "$ld_vers_major" -eq 2 -a "$ld_vers_minor" -ge 37 -a "$ld_vers_patch" -ge 50 -a 0"$ld_date" -gt 20210709; then
+ ld_indirect_extern_access=1
+ elif test "$ld_vers_major" -eq 2 -a "$ld_vers_minor" -ge 38 -o "$ld_vers_major" -gt 2; then
+ ld_indirect_extern_access=1
+ fi
+ fi
+fi
+AC_DEFINE_UNQUOTED(HAVE_LD_INDIRECT_EXTERN_ACCESS_SUPPORT,
+ $ld_indirect_extern_access,
+ [Define to 1 if your linker supports GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS.])
+AC_MSG_RESULT($ld_indirect_extern_access)
+
# Check linker supports '--push-state'/'--pop-state'
ld_pushpopstate_support=no
AC_MSG_CHECKING(linker --push-state/--pop-state options)
@@ -8095,6 +8095,11 @@ Output to @code{asm_out_file} any text which the assembler expects
to find at the end of a file. The default is to output nothing.
@end deftypefn
+@deftypefn {Target Hook} void TARGET_ASM_EMIT_GNU_PROPERTY_NOTE (void)
+Output a GNU property note to @code{asm_out_file}. The default is to
+output nothing.
+@end deftypefn
+
@deftypefun void file_end_indicate_exec_stack ()
Some systems use a common convention, the @samp{.note.GNU-stack}
special section, to indicate whether or not an object file relies on
@@ -5057,6 +5057,8 @@ This describes the overall framework of an assembly file.
@hook TARGET_ASM_FILE_END
+@hook TARGET_ASM_EMIT_GNU_PROPERTY_NOTE
+
@deftypefun void file_end_indicate_exec_stack ()
Some systems use a common convention, the @samp{.note.GNU-stack}
special section, to indicate whether or not an object file relies on
@@ -607,6 +607,8 @@ extern void default_asm_declare_constant_name (FILE *, const char *,
extern void default_file_start (void);
extern void file_end_indicate_exec_stack (void);
extern void file_end_indicate_split_stack (void);
+extern void emit_gnu_property (unsigned int, unsigned int);
+extern void emit_gnu_property_note (void);
extern void default_elf_asm_output_external (FILE *file, tree,
const char *);
@@ -715,6 +715,14 @@ to find at the end of a file. The default is to output nothing.",
void, (void),
hook_void_void)
+/* Output a GNU property note. */
+DEFHOOK
+(emit_gnu_property_note,
+ "Output a GNU property note to @code{asm_out_file}. The default is to\n\
+output nothing.",
+ void, (void),
+ hook_void_void)
+
/* Output any boilerplate text needed at the beginning of an
LTO output stream. */
DEFHOOK
@@ -586,6 +586,9 @@ compile_file (void)
/* Invoke registered plugin callbacks. */
invoke_plugin_callbacks (PLUGIN_FINISH_UNIT, NULL);
+ /* Output a GNU property note. */
+ targetm.asm_out.emit_gnu_property_note ();
+
/* This must be at the end. Some target ports emit end of file directives
into the assembly file here, and hence we cannot output anything to the
assembly file after this point. */
@@ -7735,6 +7735,53 @@ default_file_start (void)
}
}
+/* Emit one GNU property of TYPE and DATA. */
+
+void
+emit_gnu_property (unsigned int type, unsigned int data)
+{
+ int p2align = ptr_mode == SImode ? 2 : 3;
+
+ switch_to_section (get_section (".note.gnu.property",
+ SECTION_NOTYPE, NULL));
+
+ ASM_OUTPUT_ALIGN (asm_out_file, p2align);
+ /* name length. */
+ fprintf (asm_out_file, ASM_LONG "1f - 0f\n");
+ /* data length. */
+ fprintf (asm_out_file, ASM_LONG "4f - 1f\n");
+ /* note type: NT_GNU_PROPERTY_TYPE_0. */
+ fprintf (asm_out_file, ASM_LONG "5\n");
+ fprintf (asm_out_file, "0:\n");
+ /* vendor name: "GNU". */
+ fprintf (asm_out_file, STRING_ASM_OP "\"GNU\"\n");
+ fprintf (asm_out_file, "1:\n");
+ ASM_OUTPUT_ALIGN (asm_out_file, p2align);
+ /* pr_type. */
+ fprintf (asm_out_file, ASM_LONG "0x%x\n", type);
+ /* pr_datasz. */
+ fprintf (asm_out_file, ASM_LONG "3f - 2f\n");
+ fprintf (asm_out_file, "2:\n");
+ fprintf (asm_out_file, ASM_LONG "0x%x\n", data);
+ fprintf (asm_out_file, "3:\n");
+ ASM_OUTPUT_ALIGN (asm_out_file, p2align);
+ fprintf (asm_out_file, "4:\n");
+}
+
+/* This is a generic routine for TARGET_ASM_EMIT_GNU_PROPERTY_NOTE to
+ emit a NT_GNU_PROPERTY_TYPE_0 note. This is primarily a GNU extension
+ to ELF but could be used on other targets. */
+
+void
+emit_gnu_property_note (void)
+{
+ if (HAVE_LD_INDIRECT_EXTERN_ACCESS_SUPPORT
+ && !flag_direct_extern_access)
+ /* Emite a GNU_PROPERTY_1_NEEDED note with
+ GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS. */
+ emit_gnu_property (0xb0008000, (1U << 0));
+}
+
/* This is a generic routine suitable for use as TARGET_ASM_FILE_END
which emits a special section directive used to indicate whether or
not this object file needs an executable stack. This is primarily