From cfac8028e44df8140ee4fa9a3d554b1df23e0c0c Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 6 Dec 2010 00:00:15 +0000 Subject: [PATCH] Properly convert LTO plugin visibility to ELF visibility. ld/ 2010-12-05 H.J. Lu * plugin.c (asymbol_from_plugin_symbol): Properly convert LTO plugin visibility to ELF visibility. (is_visible_from_outside): Re-indent. ld/testsuite/ 2010-12-05 H.J. Lu * ld-plugin/plugin-vis-1.d: Updated. --- ld/ChangeLog | 6 ++++++ ld/plugin.c | 29 +++++++++++++++++++++++++---- ld/testsuite/ChangeLog | 4 ++++ ld/testsuite/ld-plugin/plugin-vis-1.d | 8 ++++---- 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 66aee40..c1e59bf 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2010-12-05 H.J. Lu + + * plugin.c (asymbol_from_plugin_symbol): Properly convert LTO + plugin visibility to ELF visibility. + (is_visible_from_outside): Re-indent. + 2010-12-04 Alan Modra * ldlang.c (lang_size_sections_1): Align lma using same alignment diff --git a/ld/plugin.c b/ld/plugin.c index 6afc14b..ae9c378 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -307,10 +307,31 @@ asymbol_from_plugin_symbol (bfd *abfd, asymbol *asym, if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) { elf_symbol_type *elfsym = elf_symbol_from (abfd, asym); + unsigned char visibility; + if (!elfsym) einfo (_("%P%F: %s: non-ELF symbol in ELF BFD!"), asym->name); - elfsym->internal_elf_sym.st_other &= ~3; - elfsym->internal_elf_sym.st_other |= ldsym->visibility; + switch (ldsym->visibility) + { + default: + einfo (_("%P%F: unknown ELF symbol visibility: %d!"), + ldsym->visibility); + case LDPV_DEFAULT: + visibility = STV_DEFAULT; + break; + case LDPV_PROTECTED: + visibility = STV_PROTECTED; + break; + case LDPV_INTERNAL: + visibility = STV_INTERNAL; + break; + case LDPV_HIDDEN: + visibility = STV_HIDDEN; + break; + } + elfsym->internal_elf_sym.st_other + = (visibility | (elfsym->internal_elf_sym.st_other + & ~ELF_ST_VISIBILITY (-1))); } return LDPS_OK; @@ -416,8 +437,8 @@ is_visible_from_outside (struct ld_plugin_symbol *lsym, asection *section, opportunities during LTRANS at worst; it will not give false negatives, which can lead to the disastrous conclusion that the related symbol is IRONLY. (See GCC PR46319 for an example.) */ - return lsym->visibility == LDPV_DEFAULT - || lsym->visibility == LDPV_PROTECTED; + return (lsym->visibility == LDPV_DEFAULT + || lsym->visibility == LDPV_PROTECTED); } return FALSE; } diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index f0d81d3..6920a37 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-12-05 H.J. Lu + + * ld-plugin/plugin-vis-1.d: Updated. + 2010-12-04 H.J. Lu * ld-selective/selective.exp: Don't pass -fvtable-gc to GCC diff --git a/ld/testsuite/ld-plugin/plugin-vis-1.d b/ld/testsuite/ld-plugin/plugin-vis-1.d index 41f4971..02c0e22 100644 --- a/ld/testsuite/ld-plugin/plugin-vis-1.d +++ b/ld/testsuite/ld-plugin/plugin-vis-1.d @@ -1,9 +1,9 @@ #... -.*(PROTECTED.*func3|DEFAULT.*func|HIDDEN.*func2|INTERNAL.*func1) +.*(PROTECTED.*func1|DEFAULT.*func|HIDDEN.*func3|INTERNAL.*func2) #... -.*(PROTECTED.*func3|DEFAULT.*func|HIDDEN.*func2|INTERNAL.*func1) +.*(PROTECTED.*func1|DEFAULT.*func|HIDDEN.*func3|INTERNAL.*func2) #... -.*(PROTECTED.*func3|DEFAULT.*func|HIDDEN.*func2|INTERNAL.*func1) +.*(PROTECTED.*func1|DEFAULT.*func|HIDDEN.*func3|INTERNAL.*func2) #... -.*(PROTECTED.*func3|DEFAULT.*func|HIDDEN.*func2|INTERNAL.*func1) +.*(PROTECTED.*func1|DEFAULT.*func|HIDDEN.*func3|INTERNAL.*func2) #... -- 2.7.4