gas: add visibility support using GNU syntax on XCOFF
authorClément Chigot <clement.chigot@atos.net>
Wed, 17 Nov 2021 15:20:48 +0000 (16:20 +0100)
committerClément Chigot <clement.chigot@atos.net>
Wed, 12 Jan 2022 08:08:17 +0000 (09:08 +0100)
In order to ease port of GNU assembly code and especially ld testsuite,
this patch allows XCOFF to accept the usual GNU syntax for visibility.

PR 22085

gas/ChangeLog:

* config/tc-ppc.c (ppc_GNU_visibility): New function.
* testsuite/gas/ppc/aix.exp: Add new tests.
* testsuite/gas/ppc/xcoff-visibility-2-32.d: New test.
* testsuite/gas/ppc/xcoff-visibility-2-64.d: New test.
* testsuite/gas/ppc/xcoff-visibility-2.s: New test.

gas/config/tc-ppc.c
gas/testsuite/gas/ppc/aix.exp
gas/testsuite/gas/ppc/xcoff-visibility-2-32.d [new file with mode: 0644]
gas/testsuite/gas/ppc/xcoff-visibility-2-64.d [new file with mode: 0644]
gas/testsuite/gas/ppc/xcoff-visibility-2.s [new file with mode: 0644]

index 4a1d394b2069035b6c50d00de4a6614a6f25aeb2..ac10772a61ed0c8e87ab5d028eb6c180a9d29062 100644 (file)
@@ -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
index d74d5e864357177b4146f9c900ecc904a9eca8ee..b2e8400121134af0d1bd966bd62e314d8a496301 100644 (file)
@@ -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 (file)
index 0000000..ec2befb
--- /dev/null
@@ -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 (file)
index 0000000..48d50a5
--- /dev/null
@@ -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 (file)
index 0000000..c5f0f7f
--- /dev/null
@@ -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