xref: /netbsd-src/external/gpl3/gcc.old/dist/libgcc/mkmap-symver.awk (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg# Generate an ELF symbol version map a-la Solaris and GNU ld.
2*8feb0f0bSmrg#	Copyright (C) 2007-2020 Free Software Foundation, Inc.
31debfc3dSmrg#	Contributed by Richard Henderson <rth@cygnus.com>
41debfc3dSmrg#
51debfc3dSmrg# This file is part of GCC.
61debfc3dSmrg#
71debfc3dSmrg# GCC is free software; you can redistribute it and/or modify it under
81debfc3dSmrg# the terms of the GNU General Public License as published by the Free
91debfc3dSmrg# Software Foundation; either version 3, or (at your option) any later
101debfc3dSmrg# version.
111debfc3dSmrg#
121debfc3dSmrg# GCC is distributed in the hope that it will be useful, but WITHOUT
131debfc3dSmrg# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
141debfc3dSmrg# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
151debfc3dSmrg# License for more details.
161debfc3dSmrg#
171debfc3dSmrg# You should have received a copy of the GNU General Public License
181debfc3dSmrg# along with GCC; see the file COPYING3.  If not see
191debfc3dSmrg# <http://www.gnu.org/licenses/>.
201debfc3dSmrg
211debfc3dSmrgBEGIN {
221debfc3dSmrg  state = "nm";
231debfc3dSmrg  sawsymbol = 0;
241debfc3dSmrg  if (leading_underscore)
251debfc3dSmrg    prefix = "_";
261debfc3dSmrg  else
271debfc3dSmrg    prefix = "";
281debfc3dSmrg}
291debfc3dSmrg
301debfc3dSmrg# Remove comment and blank lines.
311debfc3dSmrg/^ *#/ || /^ *$/ {
321debfc3dSmrg  next;
331debfc3dSmrg}
341debfc3dSmrg
351debfc3dSmrg# We begin with nm input.  Collect the set of symbols that are present
361debfc3dSmrg# so that we cannot emit them into the final version script -- Solaris
371debfc3dSmrg# complains at us if we do.
381debfc3dSmrg
391debfc3dSmrgstate == "nm" && /^%%/ {
401debfc3dSmrg  state = "ver";
411debfc3dSmrg  next;
421debfc3dSmrg}
431debfc3dSmrg
441debfc3dSmrgstate == "nm" && ($1 == "U" || $2 == "U") {
451debfc3dSmrg  next;
461debfc3dSmrg}
471debfc3dSmrg
481debfc3dSmrgstate == "nm" && NF == 3 {
491debfc3dSmrg  split ($3, s, "@")
501debfc3dSmrg  if (skip_underscore && substr(s[1], 1, 1) == "_")
511debfc3dSmrg      symname = substr(s[1], 2);
521debfc3dSmrg  else
531debfc3dSmrg      symname = s[1];
541debfc3dSmrg  def[symname] = 1;
551debfc3dSmrg  sawsymbol = 1;
561debfc3dSmrg  next;
571debfc3dSmrg}
581debfc3dSmrg
591debfc3dSmrgstate == "nm" {
601debfc3dSmrg  next;
611debfc3dSmrg}
621debfc3dSmrg
631debfc3dSmrg# Now we process a simplified variant of the Solaris symbol version
641debfc3dSmrg# script.  We have one symbol per line, no semicolons, simple markers
651debfc3dSmrg# for beginning and ending each section, and %inherit markers for
661debfc3dSmrg# describing version inheritance.  A symbol may appear in more than
671debfc3dSmrg# one symbol version, and the last seen takes effect.
681debfc3dSmrg# The magic version name '%exclude' causes all the symbols given that
691debfc3dSmrg# version to be dropped from the output (unless a later version overrides).
701debfc3dSmrg
711debfc3dSmrgNF == 3 && $1 == "%inherit" {
721debfc3dSmrg  inherit[$2] = $3;
731debfc3dSmrg  next;
741debfc3dSmrg}
751debfc3dSmrg
761debfc3dSmrgNF == 2 && $2 == "{" {
771debfc3dSmrg  if ($1 != "%exclude")
781debfc3dSmrg    libs[$1] = 1;
791debfc3dSmrg  thislib = $1;
801debfc3dSmrg  next;
811debfc3dSmrg}
821debfc3dSmrg
831debfc3dSmrg$1 == "}" {
841debfc3dSmrg  thislib = "";
851debfc3dSmrg  next;
861debfc3dSmrg}
871debfc3dSmrg
881debfc3dSmrg{
891debfc3dSmrg  sym = prefix $1;
901debfc3dSmrg  symbols[sym] = 1
911debfc3dSmrg  if (thislib != "%exclude")
921debfc3dSmrg    ver[sym, thislib] = 1;
931debfc3dSmrg  else {
941debfc3dSmrg    for (l in libs)
951debfc3dSmrg      ver[sym, l] = 0;
961debfc3dSmrg  }
971debfc3dSmrg  next;
981debfc3dSmrg}
991debfc3dSmrg
1001debfc3dSmrgEND {
1011debfc3dSmrg  if (!sawsymbol)
1021debfc3dSmrg    {
1031debfc3dSmrg      print "No symbols seen -- broken or mis-installed nm?" | "cat 1>&2";
1041debfc3dSmrg      exit 1;
1051debfc3dSmrg    }
1061debfc3dSmrg  for (l in libs)
1071debfc3dSmrg    output(l);
1081debfc3dSmrg}
1091debfc3dSmrg
1101debfc3dSmrgfunction output(lib) {
1111debfc3dSmrg  if (done[lib])
1121debfc3dSmrg    return;
1131debfc3dSmrg  done[lib] = 1;
1141debfc3dSmrg  if (inherit[lib])
1151debfc3dSmrg    output(inherit[lib]);
1161debfc3dSmrg
1171debfc3dSmrg  empty=1
1181debfc3dSmrg  for (sym in symbols)
1191debfc3dSmrg    if ((ver[sym, lib] != 0) && (sym in def))
1201debfc3dSmrg      {
1211debfc3dSmrg	if (empty)
1221debfc3dSmrg	  {
1231debfc3dSmrg	    printf("%s {\n", lib);
1241debfc3dSmrg	    printf("  global:\n");
1251debfc3dSmrg	    empty = 0;
1261debfc3dSmrg	  }
1271debfc3dSmrg	printf("\t%s;\n", sym);
1281debfc3dSmrg      }
1291debfc3dSmrg
1301debfc3dSmrg  if (empty)
1311debfc3dSmrg    {
1321debfc3dSmrg      for (l in libs)
1331debfc3dSmrg	if (inherit[l] == lib)
1341debfc3dSmrg	  inherit[l] = inherit[lib];
1351debfc3dSmrg    }
1361debfc3dSmrg  else if (inherit[lib])
1371debfc3dSmrg    printf("} %s;\n", inherit[lib]);
1381debfc3dSmrg  else
1391debfc3dSmrg    printf ("\n  local:\n\t*;\n};\n");
1401debfc3dSmrg}
141