diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/tc-ppc.c | 38 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/aix.exp | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/xcoff-visibility-2-32.d | 18 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/xcoff-visibility-2-64.d | 18 | ||||
-rw-r--r-- | gas/testsuite/gas/ppc/xcoff-visibility-2.s | 9 |
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 |