aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2010-12-06 00:00:15 +0000
committerH.J. Lu <hjl.tools@gmail.com>2010-12-06 00:00:15 +0000
commitcfac8028e44df8140ee4fa9a3d554b1df23e0c0c (patch)
treeda8a750660637a52b1547ccf9531ccc41a51a7eb
parenta2c86c822472bcc1bbe8002946432b2bff666948 (diff)
downloadfsf-binutils-gdb-cfac8028e44df8140ee4fa9a3d554b1df23e0c0c.zip
fsf-binutils-gdb-cfac8028e44df8140ee4fa9a3d554b1df23e0c0c.tar.gz
fsf-binutils-gdb-cfac8028e44df8140ee4fa9a3d554b1df23e0c0c.tar.bz2
Properly convert LTO plugin visibility to ELF visibility.
ld/ 2010-12-05 H.J. Lu <hongjiu.lu@intel.com> * 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 <hongjiu.lu@intel.com> * ld-plugin/plugin-vis-1.d: Updated.
-rw-r--r--ld/ChangeLog6
-rw-r--r--ld/plugin.c29
-rw-r--r--ld/testsuite/ChangeLog4
-rw-r--r--ld/testsuite/ld-plugin/plugin-vis-1.d8
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 <hongjiu.lu@intel.com>
+
+ * 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 <amodra@gmail.com>
* 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 <hongjiu.lu@intel.com>
+
+ * ld-plugin/plugin-vis-1.d: Updated.
+
2010-12-04 H.J. Lu <hongjiu.lu@intel.com>
* 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)
#...