summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/gcc/gcc-4.5.0/fedora/gcc43-ia64-libunwind.patch
diff options
context:
space:
mode:
authorRichard Purdie <rpurdie@linux.intel.com>2010-08-27 15:14:24 +0100
committerRichard Purdie <rpurdie@linux.intel.com>2010-08-27 15:29:45 +0100
commit29d6678fd546377459ef75cf54abeef5b969b5cf (patch)
tree8edd65790e37a00d01c3f203f773fe4b5012db18 /meta/recipes-devtools/gcc/gcc-4.5.0/fedora/gcc43-ia64-libunwind.patch
parentda49de6885ee1bc424e70bc02f21f6ab920efb55 (diff)
downloadpoky-29d6678fd546377459ef75cf54abeef5b969b5cf.tar.gz
Major layout change to the packages directory
Having one monolithic packages directory makes it hard to find things and is generally overwhelming. This commit splits it into several logical sections roughly based on function, recipes.txt gives more information about the classifications used. The opportunity is also used to switch from "packages" to "recipes" as used in OpenEmbedded as the term "packages" can be confusing to people and has many different meanings. Not all recipes have been classified yet, this is just a first pass at separating things out. Some packages are moved to meta-extras as they're no longer actively used or maintained. Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.5.0/fedora/gcc43-ia64-libunwind.patch')
-rw-r--r--meta/recipes-devtools/gcc/gcc-4.5.0/fedora/gcc43-ia64-libunwind.patch550
1 files changed, 550 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.5.0/fedora/gcc43-ia64-libunwind.patch b/meta/recipes-devtools/gcc/gcc-4.5.0/fedora/gcc43-ia64-libunwind.patch
new file mode 100644
index 0000000000..cad13d1228
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-4.5.0/fedora/gcc43-ia64-libunwind.patch
@@ -0,0 +1,550 @@
12004-11-27 Jakub Jelinek <jakub@redhat.com>
2
3 * config.gcc (ia64*-*-linux*): If native and libelf is installed,
4 use ia64/t-glibc-no-libunwind instead of the other t-*unwind*
5 fragments.
6 * config/ia64/t-glibc-no-libunwind: New file.
7 * config/ia64/change-symver.c: New file.
8 * config/ia64/unwind-ia64.c: If USE_SYMVER_GLOBAL and SHARED,
9 define _Unwind_* to __symverglobal_Unwind_*.
10 (alias): Undefine.
11 (symverglobal): Define. Use it on _Unwind_*.
12 * config/ia64/mkmap-symver-multi.awk: New file.
13 * config/ia64/libgcc-ia64-no-libunwind.ver: New file.
14
15Index: gcc/config.gcc
16===================================================================
17--- gcc/config.gcc.orig 2010-04-07 03:34:00.000000000 -0700
18+++ gcc/config.gcc 2010-06-25 10:15:25.133131055 -0700
19@@ -1457,9 +1457,16 @@
20 ;;
21 ia64*-*-linux*)
22 tm_file="${tm_file} dbxelf.h elfos.h svr4.h linux.h glibc-stdint.h ia64/sysv4.h ia64/linux.h"
23- tmake_file="${tmake_file} ia64/t-ia64 t-libunwind ia64/t-glibc"
24- if test x$with_system_libunwind != xyes ; then
25- tmake_file="${tmake_file} t-libunwind-elf ia64/t-glibc-libunwind"
26+ tmake_file="${tmake_file} ia64/t-ia64"
27+ if test x${target} = x${host} && test x${target} = x${build} \
28+ && grep gelf_getverdef /usr/include/gelf.h > /dev/null 2>&1 \
29+ && test -f /usr/lib/libelf.so; then
30+ tmake_file="${tmake_file} ia64/t-glibc-no-libunwind"
31+ else
32+ tmake_file="${tmake_file} t-libunwind ia64/t-glibc"
33+ if test x$with_system_libunwind != xyes ; then
34+ tmake_file="${tmake_file} t-libunwind-elf ia64/t-glibc-libunwind"
35+ fi
36 fi
37 target_cpu_default="MASK_GNU_AS|MASK_GNU_LD"
38 extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o"
39Index: gcc/config/ia64/t-glibc-no-libunwind
40===================================================================
41--- /dev/null 1970-01-01 00:00:00.000000000 +0000
42+++ gcc/config/ia64/t-glibc-no-libunwind 2010-06-25 10:14:32.521880765 -0700
43@@ -0,0 +1,30 @@
44+# Don't use system libunwind library on IA-64 GLIBC based system,
45+# but make _Unwind_* symbols unversioned, so that created programs
46+# are usable even when libgcc_s uses libunwind.
47+LIB2ADDEH += $(srcdir)/config/ia64/fde-glibc.c
48+SHLIB_MAPFILES += $(srcdir)/config/ia64/libgcc-ia64-no-libunwind.ver
49+SHLIB_MKMAP = $(srcdir)/config/ia64/mkmap-symver-multi.awk
50+
51+SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
52+ -Wl,--soname=$(SHLIB_SONAME) \
53+ -Wl,--version-script=$(SHLIB_MAP) \
54+ -o $(SHLIB_DIR)/$(SHLIB_SONAME).tmp @multilib_flags@ $(SHLIB_OBJS) -lc && \
55+ rm -f $(SHLIB_DIR)/$(SHLIB_SOLINK) && \
56+ if [ -f $(SHLIB_DIR)/$(SHLIB_SONAME) ]; then \
57+ mv -f $(SHLIB_DIR)/$(SHLIB_SONAME) \
58+ $(SHLIB_DIR)/$(SHLIB_SONAME).backup; \
59+ else true; fi && \
60+ gcc -O2 -o $(SHLIB_DIR)/$(SHLIB_SONAME).tweak \
61+ $$(gcc_srcdir)/config/ia64/change-symver.c -lelf && \
62+ $(SHLIB_DIR)/$(SHLIB_SONAME).tweak $(SHLIB_DIR)/$(SHLIB_SONAME).tmp \
63+ GCC_3.4.2 _GLOBAL_ \
64+ _Unwind_GetGR _Unwind_RaiseException _Unwind_GetRegionStart _Unwind_SetIP \
65+ _Unwind_GetIP _Unwind_GetLanguageSpecificData _Unwind_Resume \
66+ _Unwind_DeleteException _Unwind_SetGR _Unwind_ForcedUnwind \
67+ _Unwind_Backtrace _Unwind_FindEnclosingFunction _Unwind_GetCFA \
68+ _Unwind_Resume_or_Rethrow _Unwind_GetBSP && \
69+ rm -f $(SHLIB_DIR)/$(SHLIB_SONAME).tweak && \
70+ mv $(SHLIB_DIR)/$(SHLIB_SONAME).tmp $(SHLIB_DIR)/$(SHLIB_SONAME) && \
71+ $(LN_S) $(SHLIB_SONAME) $(SHLIB_DIR)/$(SHLIB_SOLINK)
72+
73+TARGET_LIBGCC2_CFLAGS += -DUSE_SYMVER_GLOBAL
74Index: gcc/config/ia64/change-symver.c
75===================================================================
76--- /dev/null 1970-01-01 00:00:00.000000000 +0000
77+++ gcc/config/ia64/change-symver.c 2010-06-25 10:14:32.521880765 -0700
78@@ -0,0 +1,211 @@
79+#define _GNU_SOURCE 1
80+#define _FILE_OFFSET_BITS 64
81+#include <endian.h>
82+#include <errno.h>
83+#include <error.h>
84+#include <fcntl.h>
85+#include <fnmatch.h>
86+#include <gelf.h>
87+#include <stdlib.h>
88+#include <string.h>
89+#include <unistd.h>
90+
91+int
92+compute_veridx (const char *name, Elf *elf, Elf_Data *verd, GElf_Shdr *verd_shdr)
93+{
94+ if (strcmp (name, "_GLOBAL_") == 0)
95+ return 1;
96+
97+ int cnt;
98+ size_t offset = 0;
99+ for (cnt = verd_shdr->sh_info; --cnt >= 0; )
100+ {
101+ GElf_Verdef defmem;
102+ GElf_Verdef *def;
103+ GElf_Verdaux auxmem;
104+ GElf_Verdaux *aux;
105+ unsigned int auxoffset;
106+
107+ /* Get the data at the next offset. */
108+ def = gelf_getverdef (verd, offset, &defmem);
109+ if (def == NULL)
110+ break;
111+
112+ auxoffset = offset + def->vd_aux;
113+ aux = gelf_getverdaux (verd, auxoffset, &auxmem);
114+ if (aux == NULL)
115+ break;
116+
117+ if (strcmp (name, elf_strptr (elf, verd_shdr->sh_link,
118+ aux->vda_name)) == 0)
119+ return def->vd_ndx;
120+
121+ /* Find the next offset. */
122+ offset += def->vd_next;
123+ }
124+
125+ return -1;
126+}
127+
128+int
129+main (int argc, char **argv)
130+{
131+ if (argc < 4)
132+ error (1, 0, "Usage: change_symver library from_symver to_symver symbol...\nExample: change_symver libfoo.so FOO_1.0 *global* bar baz");
133+
134+ const char *fname = argv[1];
135+
136+ /* Open the file. */
137+ int fd;
138+ fd = open (fname, O_RDWR);
139+ if (fd == -1)
140+ error (1, errno, fname);
141+
142+ elf_version (EV_CURRENT);
143+
144+ /* Now get the ELF descriptor. */
145+ Elf *elf = elf_begin (fd, ELF_C_READ_MMAP, NULL);
146+ if (elf == NULL || elf_kind (elf) != ELF_K_ELF)
147+ error (1, 0, "Couldn't open %s: %s", fname, elf_errmsg (-1));
148+
149+ size_t shstrndx;
150+ /* Get the section header string table index. */
151+ if (elf_getshstrndx (elf, &shstrndx) < 0)
152+ error (1, 0, "cannot get shstrndx from %s", fname);
153+
154+ GElf_Ehdr ehdr_mem;
155+ GElf_Ehdr *ehdr;
156+
157+ /* We need the ELF header in a few places. */
158+ ehdr = gelf_getehdr (elf, &ehdr_mem);
159+ if (ehdr == NULL)
160+ error (1, 0, "couldn't get ELF headers %s: %s", fname, elf_errmsg (-1));
161+
162+ Elf_Scn *scn = NULL;
163+ GElf_Shdr shdr_mem, verd_shdr, ver_shdr, dynsym_shdr;
164+ Elf_Data *ver = NULL, *verd = NULL, *dynsym = NULL;
165+
166+ while ((scn = elf_nextscn (elf, scn)) != NULL)
167+ {
168+ GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
169+
170+ if (shdr == NULL)
171+ error (1, 0, "couldn't get shdr from %s", fname);
172+
173+ if ((shdr->sh_flags & SHF_ALLOC) != 0)
174+ {
175+ const char *name = elf_strptr (elf, shstrndx, shdr->sh_name);
176+ Elf_Data **p;
177+
178+ if (strcmp (name, ".gnu.version") == 0)
179+ {
180+ p = &ver;
181+ ver_shdr = *shdr;
182+ }
183+ else if (strcmp (name, ".gnu.version_d") == 0)
184+ {
185+ p = &verd;
186+ verd_shdr = *shdr;
187+ }
188+ else if (strcmp (name, ".dynsym") == 0)
189+ {
190+ p = &dynsym;
191+ dynsym_shdr = *shdr;
192+ }
193+ else
194+ continue;
195+
196+ if (*p != NULL)
197+ error (1, 0, "Two %s sections in %s", name, fname);
198+ *p = elf_getdata (scn, NULL);
199+ if (*p == NULL || elf_getdata (scn, *p) != NULL)
200+ error (1, 0, "No data or non-contiguous data in %s section in %s",
201+ name, fname);
202+ }
203+ }
204+
205+ if (ver == NULL || verd == NULL || dynsym == NULL)
206+ error (1, 0, "Couldn't find one of the needed sections in %s", fname);
207+
208+ int from_idx = compute_veridx (argv[2], elf, verd, &verd_shdr);
209+ if (from_idx == -1)
210+ error (1, 0, "Could not find symbol version %s in %s", argv[2], fname);
211+
212+ int to_idx = compute_veridx (argv[3], elf, verd, &verd_shdr);
213+ if (to_idx == -1)
214+ error (1, 0, "Could not find symbol version %s in %s", argv[3], fname);
215+
216+ if (dynsym_shdr.sh_entsize != gelf_fsize (elf, ELF_T_SYM, 1, ehdr->e_version)
217+ || dynsym_shdr.sh_size % dynsym_shdr.sh_entsize
218+ || ver_shdr.sh_entsize != 2
219+ || (ver_shdr.sh_size & 1)
220+ || dynsym_shdr.sh_size / dynsym_shdr.sh_entsize != ver_shdr.sh_size / 2)
221+ error (1, 0, "Unexpected sh_size or sh_entsize in %s", fname);
222+
223+ size_t nentries = ver_shdr.sh_size / 2;
224+ size_t cnt;
225+ GElf_Versym array[nentries];
226+ for (cnt = 0; cnt < nentries; ++cnt)
227+ {
228+ GElf_Versym vsymmem;
229+ GElf_Versym *vsym;
230+
231+ vsym = gelf_getversym (ver, cnt, &vsymmem);
232+ if (vsym == NULL)
233+ error (1, 0, "gelt_getversym failed in %s: %s", fname, elf_errmsg (-1));
234+
235+ array[cnt] = *vsym;
236+ if (*vsym != from_idx)
237+ continue;
238+
239+ GElf_Sym sym_mem;
240+ GElf_Sym *sym;
241+ sym = gelf_getsym (dynsym, cnt, &sym_mem);
242+ if (sym == NULL)
243+ error (1, 0, "gelt_getsym failed in %s: %s", fname, elf_errmsg (-1));
244+
245+ const char *name = elf_strptr (elf, dynsym_shdr.sh_link, sym->st_name);
246+
247+ int argn;
248+ for (argn = 4; argn < argc; ++argn)
249+ if (fnmatch (argv[argn], name, 0) == 0)
250+ {
251+ array[cnt] = to_idx;
252+ break;
253+ }
254+ }
255+
256+ if (sizeof (array[0]) != 2)
257+ abort ();
258+
259+#if __BYTE_ORDER == __LITTLE_ENDIAN
260+ if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB)
261+ ;
262+ else if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB)
263+#elif __BYTE_ORDER == __BIG_ENDIAN
264+ if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB)
265+ ;
266+ else if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB)
267+#else
268+# error Unsupported endianity
269+#endif
270+ {
271+ for (cnt = 0; cnt < nentries; ++cnt)
272+ array[cnt] = ((array[cnt] & 0xff) << 8) | ((array[cnt] & 0xff00) >> 8);
273+ }
274+ else
275+ error (1, 0, "Unknown EI_DATA %d in %s", ehdr->e_ident[EI_DATA], fname);
276+
277+ if (elf_end (elf) != 0)
278+ error (1, 0, "couldn't close %s: %s", fname, elf_errmsg (-1));
279+
280+ if (lseek (fd, ver_shdr.sh_offset, SEEK_SET) != (off_t) ver_shdr.sh_offset)
281+ error (1, 0, "failed to seek to %zd in %s", (size_t) ver_shdr.sh_offset,
282+ fname);
283+
284+ if (write (fd, array, 2 * nentries) != (ssize_t) (2 * nentries))
285+ error (1, 0, "failed to write .gnu.version section into %s", fname);
286+
287+ close (fd);
288+ return 0;
289+}
290Index: gcc/config/ia64/unwind-ia64.c
291===================================================================
292--- gcc/config/ia64/unwind-ia64.c.orig 2009-09-07 08:41:52.000000000 -0700
293+++ gcc/config/ia64/unwind-ia64.c 2010-06-25 10:14:32.521880765 -0700
294@@ -48,6 +48,51 @@
295 #define MD_UNW_COMPATIBLE_PERSONALITY_P(HEADER) 1
296 #endif
297
298+#if defined (USE_SYMVER_GLOBAL) && defined (SHARED)
299+extern _Unwind_Reason_Code __symverglobal_Unwind_Backtrace
300+ (_Unwind_Trace_Fn, void *);
301+extern void __symverglobal_Unwind_DeleteException
302+ (struct _Unwind_Exception *);
303+extern void * __symverglobal_Unwind_FindEnclosingFunction (void *);
304+extern _Unwind_Reason_Code __symverglobal_Unwind_ForcedUnwind
305+ (struct _Unwind_Exception *, _Unwind_Stop_Fn, void *);
306+extern _Unwind_Word __symverglobal_Unwind_GetCFA
307+ (struct _Unwind_Context *);
308+extern _Unwind_Word __symverglobal_Unwind_GetBSP
309+ (struct _Unwind_Context *);
310+extern _Unwind_Word __symverglobal_Unwind_GetGR
311+ (struct _Unwind_Context *, int );
312+extern _Unwind_Ptr __symverglobal_Unwind_GetIP (struct _Unwind_Context *);
313+extern void *__symverglobal_Unwind_GetLanguageSpecificData
314+ (struct _Unwind_Context *);
315+extern _Unwind_Ptr __symverglobal_Unwind_GetRegionStart
316+ (struct _Unwind_Context *);
317+extern _Unwind_Reason_Code __symverglobal_Unwind_RaiseException
318+ (struct _Unwind_Exception *);
319+extern void __symverglobal_Unwind_Resume (struct _Unwind_Exception *);
320+extern _Unwind_Reason_Code __symverglobal_Unwind_Resume_or_Rethrow
321+ (struct _Unwind_Exception *);
322+extern void __symverglobal_Unwind_SetGR
323+ (struct _Unwind_Context *, int, _Unwind_Word);
324+extern void __symverglobal_Unwind_SetIP
325+ (struct _Unwind_Context *, _Unwind_Ptr);
326+#define _Unwind_Backtrace __symverglobal_Unwind_Backtrace
327+#define _Unwind_DeleteException __symverglobal_Unwind_DeleteException
328+#define _Unwind_FindEnclosingFunction __symverglobal_Unwind_FindEnclosingFunction
329+#define _Unwind_ForcedUnwind __symverglobal_Unwind_ForcedUnwind
330+#define _Unwind_GetBSP __symverglobal_Unwind_GetBSP
331+#define _Unwind_GetCFA __symverglobal_Unwind_GetCFA
332+#define _Unwind_GetGR __symverglobal_Unwind_GetGR
333+#define _Unwind_GetIP __symverglobal_Unwind_GetIP
334+#define _Unwind_GetLanguageSpecificData __symverglobal_Unwind_GetLanguageSpecificData
335+#define _Unwind_GetRegionStart __symverglobal_Unwind_GetRegionStart
336+#define _Unwind_RaiseException __symverglobal_Unwind_RaiseException
337+#define _Unwind_Resume __symverglobal_Unwind_Resume
338+#define _Unwind_Resume_or_Rethrow __symverglobal_Unwind_Resume_or_Rethrow
339+#define _Unwind_SetGR __symverglobal_Unwind_SetGR
340+#define _Unwind_SetIP __symverglobal_Unwind_SetIP
341+#endif
342+
343 enum unw_application_register
344 {
345 UNW_AR_BSP,
346@@ -2457,4 +2502,44 @@
347 alias (_Unwind_SetIP);
348 #endif
349
350+#if defined (USE_SYMVER_GLOBAL) && defined (SHARED)
351+#undef alias
352+#define symverglobal(name, version) \
353+__typeof (__symverglobal##name) __symverlocal##name \
354+ __attribute__ ((alias ("__symverglobal" #name))); \
355+__asm__ (".symver __symverglobal" #name"," #name "@@GCC_3.4.2");\
356+__asm__ (".symver __symverlocal" #name"," #name "@" #version)
357+
358+#undef _Unwind_Backtrace
359+#undef _Unwind_DeleteException
360+#undef _Unwind_FindEnclosingFunction
361+#undef _Unwind_ForcedUnwind
362+#undef _Unwind_GetBSP
363+#undef _Unwind_GetCFA
364+#undef _Unwind_GetGR
365+#undef _Unwind_GetIP
366+#undef _Unwind_GetLanguageSpecificData
367+#undef _Unwind_GetRegionStart
368+#undef _Unwind_RaiseException
369+#undef _Unwind_Resume
370+#undef _Unwind_Resume_or_Rethrow
371+#undef _Unwind_SetGR
372+#undef _Unwind_SetIP
373+symverglobal (_Unwind_Backtrace, GCC_3.3);
374+symverglobal (_Unwind_DeleteException, GCC_3.0);
375+symverglobal (_Unwind_FindEnclosingFunction, GCC_3.3);
376+symverglobal (_Unwind_ForcedUnwind, GCC_3.0);
377+symverglobal (_Unwind_GetBSP, GCC_3.3.2);
378+symverglobal (_Unwind_GetCFA, GCC_3.3);
379+symverglobal (_Unwind_GetGR, GCC_3.0);
380+symverglobal (_Unwind_GetIP, GCC_3.0);
381+symverglobal (_Unwind_GetLanguageSpecificData, GCC_3.0);
382+symverglobal (_Unwind_GetRegionStart, GCC_3.0);
383+symverglobal (_Unwind_RaiseException, GCC_3.0);
384+symverglobal (_Unwind_Resume, GCC_3.0);
385+symverglobal (_Unwind_Resume_or_Rethrow, GCC_3.3);
386+symverglobal (_Unwind_SetGR, GCC_3.0);
387+symverglobal (_Unwind_SetIP, GCC_3.0);
388+#endif
389+
390 #endif
391Index: gcc/config/ia64/mkmap-symver-multi.awk
392===================================================================
393--- /dev/null 1970-01-01 00:00:00.000000000 +0000
394+++ gcc/config/ia64/mkmap-symver-multi.awk 2010-06-25 10:14:32.521880765 -0700
395@@ -0,0 +1,133 @@
396+# Generate an ELF symbol version map a-la Solaris and GNU ld.
397+# Contributed by Richard Henderson <rth@cygnus.com>
398+#
399+# This file is part of GCC.
400+#
401+# GCC is free software; you can redistribute it and/or modify it under
402+# the terms of the GNU General Public License as published by the Free
403+# Software Foundation; either version 2, or (at your option) any later
404+# version.
405+#
406+# GCC is distributed in the hope that it will be useful, but WITHOUT
407+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
408+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
409+# License for more details.
410+#
411+# You should have received a copy of the GNU General Public License
412+# along with GCC; see the file COPYING. If not, write to the Free
413+# Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
414+# 02110-1301, USA.
415+
416+BEGIN {
417+ state = "nm";
418+ sawsymbol = 0;
419+}
420+
421+# Remove comment and blank lines.
422+/^ *#/ || /^ *$/ {
423+ next;
424+}
425+
426+# We begin with nm input. Collect the set of symbols that are present
427+# so that we can not emit them into the final version script -- Solaris
428+# complains at us if we do.
429+
430+state == "nm" && /^%%/ {
431+ state = "ver";
432+ next;
433+}
434+
435+state == "nm" && ($1 == "U" || $2 == "U") {
436+ next;
437+}
438+
439+state == "nm" && NF == 3 {
440+ if ($3 ~ /^[^@]*@GCC_[0-9.]*$/) {
441+ def[$3] = 1
442+ tl=$3
443+ sub(/^.*@/,"",tl)
444+ ver[$3] = tl
445+ } else {
446+ sub(/@@?GCC_[0-9.]*$/,"",$3)
447+ def[$3] = 1;
448+ }
449+ sawsymbol = 1;
450+ next;
451+}
452+
453+state == "nm" {
454+ next;
455+}
456+
457+# Now we process a simplified variant of the Solaris symbol version
458+# script. We have one symbol per line, no semicolons, simple markers
459+# for beginning and ending each section, and %inherit markers for
460+# describing version inheritence. A symbol may appear in more than
461+# one symbol version, and the last seen takes effect.
462+
463+NF == 3 && $1 == "%inherit" {
464+ inherit[$2] = $3;
465+ next;
466+}
467+
468+NF == 2 && $2 == "{" {
469+ libs[$1] = 1;
470+ thislib = $1;
471+ next;
472+}
473+
474+$1 == "}" {
475+ thislib = "";
476+ next;
477+}
478+
479+{
480+ ver[$1] = thislib;
481+ next;
482+}
483+
484+END {
485+ if (!sawsymbol)
486+ {
487+ print "No symbols seen -- broken or mis-installed nm?" | "cat 1>&2";
488+ exit 1;
489+ }
490+ for (l in libs)
491+ output(l);
492+}
493+
494+function output(lib) {
495+ if (done[lib])
496+ return;
497+ done[lib] = 1;
498+ if (inherit[lib])
499+ output(inherit[lib]);
500+
501+ empty=1
502+ for (sym in ver)
503+ if ((ver[sym] == lib) && (sym in def))
504+ {
505+ if (empty)
506+ {
507+ printf("%s {\n", lib);
508+ printf(" global:\n");
509+ empty = 0;
510+ }
511+ symp = sym;
512+ sub(/@GCC_[0-9.]*$/,"",symp);
513+ printf("\t%s;\n", symp);
514+ if (dotsyms)
515+ printf("\t.%s;\n", symp);
516+ }
517+
518+ if (empty)
519+ {
520+ for (l in libs)
521+ if (inherit[l] == lib)
522+ inherit[l] = inherit[lib];
523+ }
524+ else if (inherit[lib])
525+ printf("} %s;\n", inherit[lib]);
526+ else
527+ printf ("\n local:\n\t*;\n};\n");
528+}
529Index: gcc/config/ia64/libgcc-ia64-no-libunwind.ver
530===================================================================
531--- /dev/null 1970-01-01 00:00:00.000000000 +0000
532+++ gcc/config/ia64/libgcc-ia64-no-libunwind.ver 2010-06-25 10:14:32.525880902 -0700
533@@ -0,0 +1,17 @@
534+GCC_3.4.2 {
535+ _Unwind_GetGR
536+ _Unwind_RaiseException
537+ _Unwind_GetRegionStart
538+ _Unwind_SetIP
539+ _Unwind_GetIP
540+ _Unwind_GetLanguageSpecificData
541+ _Unwind_Resume
542+ _Unwind_DeleteException
543+ _Unwind_SetGR
544+ _Unwind_ForcedUnwind
545+ _Unwind_Backtrace
546+ _Unwind_FindEnclosingFunction
547+ _Unwind_GetCFA
548+ _Unwind_Resume_or_Rethrow
549+ _Unwind_GetBSP
550+}