ELF visibility patch from Martin Loewis
authorNick Clifton <nickc@redhat.com>
Mon, 3 Jan 2000 18:34:24 +0000 (18:34 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 3 Jan 2000 18:34:24 +0000 (18:34 +0000)
gas/ChangeLog
gas/config/obj-elf.c
gas/doc/as.texinfo

index e9ad534fca68e58a5cfc264d4be1a98dc1018fd3..9e737058ca2c00254231efee7c1b9dafa962b371 100644 (file)
@@ -1,3 +1,11 @@
+2000-01-03  Martin v. Loewis  <loewis@informatik.hu-berlin.de>
+
+       * config/obj-elf.c (elf_pseudo_table): Define visibility pseudos.
+       (obj_elf_visibility): New function.
+       
+       * doc/as.texinfo (Visibility): New node: document visibility
+       pseudo ops.
+
 1999-12-27  Alan Modra  <alan@spri.levels.unisa.edu.au>
 
        * config/tc-i386.c (MATCH): Relax JumpAbsolute check.  Emit a
index 29402eb6326af9397df2a541946bddb83c855325..4fbd8bc6408b3880f509cc1892eb5cbe0604e036 100644 (file)
@@ -65,6 +65,7 @@ static void obj_elf_type PARAMS ((int));
 static void obj_elf_ident PARAMS ((int));
 static void obj_elf_weak PARAMS ((int));
 static void obj_elf_local PARAMS ((int));
+static void obj_elf_visibility PARAMS ((int));
 static void obj_elf_symver PARAMS ((int));
 static void obj_elf_vtable_inherit PARAMS ((int));
 static void obj_elf_vtable_entry PARAMS ((int));
@@ -89,6 +90,11 @@ static const pseudo_typeS elf_pseudo_table[] =
   {"version", obj_elf_version, 0},
   {"weak", obj_elf_weak, 0},
 
+  /* These define symbol visibility. */
+  {"internal", obj_elf_visibility, STV_INTERNAL},
+  {"hidden", obj_elf_visibility, STV_HIDDEN},
+  {"protected", obj_elf_visibility, STV_PROTECTED},
+
   /* These are used for stabs-in-elf configurations.  */
   {"line", obj_elf_line, 0},
 
@@ -474,6 +480,48 @@ obj_elf_weak (ignore)
   demand_empty_rest_of_line ();
 }
 
+static void
+obj_elf_visibility (visibility)
+     int visibility;
+{
+  char *name;
+  int c;
+  symbolS *symbolP;
+  asymbol *bfdsym;
+  elf_symbol_type *elfsym;
+
+  do
+    {
+      name = input_line_pointer;
+      c = get_symbol_end ();
+      symbolP = symbol_find_or_make (name);
+      *input_line_pointer = c;
+      
+      SKIP_WHITESPACE ();
+      
+      bfdsym = symbol_get_bfdsym (symbolP);
+      elfsym = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
+      
+      assert (elfsym);
+      
+      elfsym->internal_elf_sym.st_other = visibility;
+      
+      if (c == ',')
+       {
+         input_line_pointer ++;
+         
+         SKIP_WHITESPACE ();
+         
+         if (*input_line_pointer == '\n')
+           c = '\n';
+       }
+    }
+  while (c == ',');
+  
+  demand_empty_rest_of_line ();
+}
+
+
 static segT previous_section;
 static int previous_subsection;
 
index 330a8b23419cea29df01f489b68621d6277d30ea..eb5aee8414410fdeb52602de7c7281a6b45860f8 100644 (file)
@@ -3195,6 +3195,9 @@ Some machine configurations provide additional directives.
 * Type::                        @code{.type @var{int}}
 * Val::                         @code{.val @var{addr}}
 @end ifset
+@ifset ELF
+* Visibility::                  @code{.internal @var{name}, .hidden @var{name}, .protected @var{name}}
+@end ifset
 
 * Uleb128::                     @code{.uleb128 @var{expressions}}
 * Word::                        @code{.word @var{expressions}}
@@ -4756,6 +4759,40 @@ configured for @code{b.out}, it accepts this directive but ignores it.
 compact, variable length representation of numbers used by the DWARF
 symbolic debugging format.  @xref{Sleb128,@code{.sleb128}}.
 
+@ifset ELF
+@node Visibility
+@section @code{.internal}, @code{.hidden}, @code{.protected}
+@cindex @code{internal} directive
+@cindex @code{hidden} directive
+@cindex @code{protected} directive
+@cindex symbol visibility
+
+These directives can be used to set the visibility of a specified symbol.  By
+default a symbol's visibility is set by its binding (local, global or weak),
+but these directives can be used to override that.
+
+A visibility of @code{protected} means that any references to the symbol from
+within the component that defines the symbol must be resolved to the definition
+in that component, even if a definition in another component would normally
+preempt this.
+
+A visibility of @code{hidden} means that the symbol is not visible to other 
+components.  Such a symbol is always considered to be protected as well.
+
+A visibility of @code{internal} is the same as a visibility of @code{hidden},
+except that some extra, processor specific processing must also be performed
+upon the symbol. 
+
+For ELF targets, the directives are used like this:
+
+@smallexample
+.internal @var{name}
+.hidden @var{name}
+.protected @var{name}
+@end smallexample
+
+@end ifset
+
 @node Word
 @section @code{.word @var{expressions}}