On 8/26/20 11:22 AM, Jan Hubicka wrote:
On 8/25/20 8:46 PM, Jan Hubicka wrote:
What will happen here with protected visibility?

I forgot about it. Should it be mapped also to "local"?

+  const char *visibility = NULL;
+  if (!TREE_PUBLIC (origin_decl))
+    visibility = "remove";
+  else if (DECL_VISIBILITY (origin_decl) == VISIBILITY_INTERNAL
+          || DECL_VISIBILITY (origin_decl) == VISIBILITY_PROTECTED)
+    visibility = "local";
+  else if (DECL_VISIBILITY (origin_decl) == VISIBILITY_HIDDEN)
+    visibility = "hidden";

I have no idea (depends what gas will do), you need to check if the
resulting symbol will indeed have right visibility in all of the cases.
If some of them are not possible, I suppose we could just reject the
comination.

Ok, so I experimented a bit with the .symver attribute I don't see how
is the new syntax handy (I mean .symver foo, foo@VERS_2, hidden and
.symver foo, foo@VERS_1, local)?

For instance:

$ cat vi2.c
int
__attribute__((visibility ("hidden")))
hidden_object;

extern int
__attribute__ ((__symver__ ("foo@@VERS_2")))
__attribute__ ((alias ("hidden_object")))
symver_foo_v1;

$ gcc vi2.c -S
$ cat vi2.s | grep '\.symver'
        .symver symver_foo_v1, foo@@VERS_2

$ readelf -s vi2.o -W
...
     8: 0000000000000000     4 OBJECT  GLOBAL HIDDEN     3 hidden_object
     9: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    3 symver_foo_v1
    10: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    3 foo@@VERS_2

Which seems fine to me. Similarly one can directly modify visibility of
symver_foo_v1 with:
.hidden symver_foo_v1

Or do I miss something?

Martin


Honza

Thanks,
Martin

Reply via email to