aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
Diffstat (limited to 'gas')
-rw-r--r--gas/config/tc-ppc.c38
-rw-r--r--gas/testsuite/gas/ppc/aix.exp2
-rw-r--r--gas/testsuite/gas/ppc/xcoff-visibility-2-32.d18
-rw-r--r--gas/testsuite/gas/ppc/xcoff-visibility-2-64.d18
-rw-r--r--gas/testsuite/gas/ppc/xcoff-visibility-2.s9
5 files changed, 85 insertions, 0 deletions
diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c
index 4a1d394..ac10772 100644
--- a/gas/config/tc-ppc.c
+++ b/gas/config/tc-ppc.c
@@ -121,6 +121,7 @@ static void ppc_toc (int);
static void ppc_xcoff_cons (int);
static void ppc_vbyte (int);
static void ppc_weak (int);
+static void ppc_GNU_visibility (int);
#endif
#ifdef OBJ_ELF
@@ -246,6 +247,11 @@ const pseudo_typeS md_pseudo_table[] =
{ "short", ppc_xcoff_cons, 1 },
{ "vbyte", ppc_vbyte, 0 },
{ "weak", ppc_weak, 0 },
+
+ /* Enable GNU syntax for symbol visibility. */
+ {"internal", ppc_GNU_visibility, SYM_V_INTERNAL},
+ {"hidden", ppc_GNU_visibility, SYM_V_HIDDEN},
+ {"protected", ppc_GNU_visibility, SYM_V_PROTECTED},
#endif
#ifdef OBJ_ELF
@@ -4321,6 +4327,38 @@ ppc_xcoff_get_visibility (void) {
return 0;
}
+/* Retrieve visiblity using GNU syntax. */
+static void ppc_GNU_visibility (int visibility) {
+ int c;
+ char *name;
+ symbolS *symbolP;
+ coff_symbol_type *coffsym;
+
+ do
+ {
+ if ((name = read_symbol_name ()) == NULL)
+ break;
+ symbolP = symbol_find_or_make (name);
+ coffsym = coffsymbol (symbol_get_bfdsym (symbolP));
+
+ coffsym->native->u.syment.n_type &= ~SYM_V_MASK;
+ coffsym->native->u.syment.n_type |= visibility;
+
+ c = *input_line_pointer;
+ if (c == ',')
+ {
+ input_line_pointer ++;
+
+ SKIP_WHITESPACE ();
+
+ if (*input_line_pointer == '\n')
+ c = '\n';
+ }
+ }
+ while (c == ',');
+
+ demand_empty_rest_of_line ();
+}
/* The .comm and .lcomm pseudo-ops for XCOFF. XCOFF puts common
symbols in the .bss segment as though they were local common
diff --git a/gas/testsuite/gas/ppc/aix.exp b/gas/testsuite/gas/ppc/aix.exp
index d74d5e8..b2e8400 100644
--- a/gas/testsuite/gas/ppc/aix.exp
+++ b/gas/testsuite/gas/ppc/aix.exp
@@ -90,4 +90,6 @@ if { [istarget "powerpc*-*-aix*"] || [istarget "rs6000-*-aix*"] } then {
run_dump_test "xcoff-visibility-1-32"
run_dump_test "xcoff-visibility-1-64"
+ run_dump_test "xcoff-visibility-2-32"
+ run_dump_test "xcoff-visibility-2-64"
}
diff --git a/gas/testsuite/gas/ppc/xcoff-visibility-2-32.d b/gas/testsuite/gas/ppc/xcoff-visibility-2-32.d
new file mode 100644
index 0000000..ec2befb
--- /dev/null
+++ b/gas/testsuite/gas/ppc/xcoff-visibility-2-32.d
@@ -0,0 +1,18 @@
+#as: -a32
+#source: xcoff-visibility-2.s
+#objdump: -t
+#name: XCOFF Visibility 2 (32 bit)
+
+.*
+
+SYMBOL TABLE:
+.*
+.*
+\[ 2\].*\(ty 1000\).*internal
+.*
+\[ 4\].*\(ty 2000\).*hidden
+.*
+\[ 6\].*\(ty 3000\).*protected
+.*
+\[ 8\].*\(ty 1000\).*dual
+.*
diff --git a/gas/testsuite/gas/ppc/xcoff-visibility-2-64.d b/gas/testsuite/gas/ppc/xcoff-visibility-2-64.d
new file mode 100644
index 0000000..48d50a5
--- /dev/null
+++ b/gas/testsuite/gas/ppc/xcoff-visibility-2-64.d
@@ -0,0 +1,18 @@
+#as: -a64
+#source: xcoff-visibility-2.s
+#objdump: -t
+#name: XCOFF Visibility 2 (64 bit)
+
+.*
+
+SYMBOL TABLE:
+.*
+.*
+\[ 2\].*\(ty 1000\).*internal
+.*
+\[ 4\].*\(ty 2000\).*hidden
+.*
+\[ 6\].*\(ty 3000\).*protected
+.*
+\[ 8\].*\(ty 1000\).*dual
+.*
diff --git a/gas/testsuite/gas/ppc/xcoff-visibility-2.s b/gas/testsuite/gas/ppc/xcoff-visibility-2.s
new file mode 100644
index 0000000..c5f0f7f
--- /dev/null
+++ b/gas/testsuite/gas/ppc/xcoff-visibility-2.s
@@ -0,0 +1,9 @@
+# Ensure that GNU syntax is accepted even for XCOFF.
+ .internal internal
+ .hidden hidden
+ .protected protected
+
+# Ensure that only the last visibility is taken into
+# account, when several are provided.
+ .protected dual
+ .internal dual