diff options
author | Iain Sandoe <iain@sandoe.co.uk> | 2019-10-08 19:09:04 +0000 |
---|---|---|
committer | Iain Sandoe <iains@gcc.gnu.org> | 2019-10-08 19:09:04 +0000 |
commit | a3fc4326ca94323e24693b907ce4352a70d4de8f (patch) | |
tree | e4eded45f1a4298566200d7f4bf368e6d574c6a6 /gcc/config/darwin.c | |
parent | fe42ae7cf57616f53a17544b614b425076d694db (diff) | |
download | gcc-a3fc4326ca94323e24693b907ce4352a70d4de8f.zip gcc-a3fc4326ca94323e24693b907ce4352a70d4de8f.tar.gz gcc-a3fc4326ca94323e24693b907ce4352a70d4de8f.tar.bz2 |
[Darwin, machopic 2/n] Compute and cache indirection rules.
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
Diffstat (limited to 'gcc/config/darwin.c')
-rw-r--r-- | gcc/config/darwin.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index 869e850..f8d7059 100644 --- a/gcc/config/darwin.c +++ b/gcc/config/darwin.c @@ -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 |