[Darwin, machopic 2/n] Compute and cache indirection rules.
authorIain Sandoe <iain@sandoe.co.uk>
Tue, 8 Oct 2019 19:09:04 +0000 (19:09 +0000)
committerIain Sandoe <iains@gcc.gnu.org>
Tue, 8 Oct 2019 19:09:04 +0000 (19:09 +0000)
This caches a check for the requirement to indirect a symbol in the Darwin
ABI, and uses it where needed.  We also ensure that we place the indirection
pointers into the non-lazy symbol pointers section.  Other placements have
occurred with various platform toolchains - but these seem to have been
unintentional so we match current platform toolchains.

gcc/ChangeLog:

2019-10-08  Iain Sandoe  <iain@sandoe.co.uk>

* config/darwin.c (machopic_indirect_data_reference): Check for
required indirections before making direct access to defined
values.
(machopic_output_indirection): Place the indirected pointes for
required indirections into the non-lazy symbol pointers section.
(darwin_encode_section_info):
* config/darwin.h (MACHO_SYMBOL_FLAG_MUST_INDIRECT): New.
(MACHO_SYMBOL_MUST_INDIRECT_P): New.

From-SVN: r276708

gcc/ChangeLog
gcc/config/darwin.c
gcc/config/darwin.h

index b03226318a5a8af2262983e9e40606693f431b91..823d13dcc76782981012350cf028598a6304f836 100644 (file)
@@ -1,3 +1,14 @@
+2019-10-08  Iain Sandoe  <iain@sandoe.co.uk>
+
+       * config/darwin.c (machopic_indirect_data_reference): Check for
+       required indirections before making direct access to defined
+       values.
+       (machopic_output_indirection): Place the indirected pointes for
+       required indirections into the non-lazy symbol pointers section.
+       (darwin_encode_section_info):
+       * config/darwin.h (MACHO_SYMBOL_FLAG_MUST_INDIRECT): New.
+       (MACHO_SYMBOL_MUST_INDIRECT_P): New.
+
 2019-10-08  Uroš Bizjak  <ubizjak@gmail.com>
 
        PR target/91994
index 869e850c5753a642b108def4053ebe93cbe35c80..f8d70596d0907536425e0804e5b30fdb45f47505 100644 (file)
@@ -665,7 +665,7 @@ machopic_indirect_data_reference (rtx orig, rtx reg)
           /* some other cpu -- writeme!  */
           gcc_unreachable ();
        }
-      else if (defined)
+      else if (defined && ! MACHO_SYMBOL_MUST_INDIRECT_P (orig))
        {
          rtx offset = NULL;
          if (DARWIN_PPC || HAVE_lo_sum)
@@ -1120,6 +1120,7 @@ machopic_output_indirection (machopic_indirection **slot, FILE *asm_out_file)
       machopic_output_stub (asm_out_file, sym, stub);
     }
   else if (! indirect_data (symbol)
+          && ! MACHO_SYMBOL_MUST_INDIRECT_P (symbol)
           && ! MACHO_SYMBOL_HIDDEN_VIS_P (symbol)
           && (machopic_symbol_defined_p (symbol)
               || SYMBOL_REF_LOCAL_P (symbol)))
@@ -1238,11 +1239,17 @@ darwin_encode_section_info (tree decl, rtx rtl, int first)
   if (VAR_P (decl))
     SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_VARIABLE;
 
+  /* Only really common if there's no initialiser.  */
+  bool really_common_p = (DECL_COMMON (decl)
+                         && (DECL_INITIAL (decl) == NULL
+                             || (!in_lto_p
+                                 && DECL_INITIAL (decl) == error_mark_node)));
+
   /* For Darwin, if we have specified visibility and it's not the default
      that's counted 'hidden'.  */
   if (DECL_VISIBILITY_SPECIFIED (decl)
       && DECL_VISIBILITY (decl) != VISIBILITY_DEFAULT)
-     SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_HIDDEN_VIS;
+    SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_HIDDEN_VIS;
 
   if (!DECL_EXTERNAL (decl)
       && (!TREE_PUBLIC (decl) || !DECL_WEAK (decl))
@@ -1255,6 +1262,12 @@ darwin_encode_section_info (tree decl, rtx rtl, int first)
 
   if (! TREE_PUBLIC (decl))
     SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_STATIC;
+
+  /* Short cut check for Darwin 'must indirect' rules.  */
+  if (really_common_p
+      || (DECL_WEAK (decl) && ! MACHO_SYMBOL_HIDDEN_VIS_P (sym_ref))
+      || lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
+     SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_MUST_INDIRECT;
 }
 
 void
index 87e1eb63b1c9531f2ab98f9c6244e1c39925c4f3..7fab8694f0a58d6fd7963e7d325dadbb71ad0255 100644 (file)
@@ -820,6 +820,15 @@ extern GTY(()) section * darwin_sections[NUM_DARWIN_SECTIONS];
 #define MACHO_SYMBOL_VARIABLE_P(RTX) \
   ((SYMBOL_REF_FLAGS (RTX) & MACHO_SYMBOL_FLAG_VARIABLE) != 0)
 
+/* Set on a symbol that must be indirected, even when there is a
+   definition in the TU.  The ABI mandates that common symbols are so
+   indirected, as are weak.  If 'fix-and-continue' is operational then
+   data symbols might also be.  */
+
+#define MACHO_SYMBOL_FLAG_MUST_INDIRECT ((SYMBOL_FLAG_SUBT_DEP) << 1)
+#define MACHO_SYMBOL_MUST_INDIRECT_P(RTX) \
+  ((SYMBOL_REF_FLAGS (RTX) & MACHO_SYMBOL_FLAG_MUST_INDIRECT) != 0)
+
 /* Set on a symbol with SYMBOL_FLAG_FUNCTION or MACHO_SYMBOL_FLAG_VARIABLE
    to indicate that the function or variable is considered defined in this
    translation unit.  */