Makefile.in (UNWIND_H): Remove.
gcc:
* Makefile.in (UNWIND_H): Remove.
(LIB2ADDEH, LIB2ADDEHSTATIC, LIB2ADDEHSHARED): Move to
../libgcc/Makefile.in.
(LIBUNWIND, SHLIBUNWIND_LINK, SHLIBUNWIND_INSTALL): Likewise.
(LIBUNWINDDEP): Remove.
(libgcc-support): Remove LIB2ADDEH, $(srcdir)/emutls.c dependencies.
(libgcc.mvars): Remove LIB2ADDEH, LIB2ADDEHSTATIC, LIB2ADDEHSHARED,
LIBUNWIND, SHLIBUNWIND_LINK, SHLIBUNWIND_INSTALL.
(stmp-int-hdrs): Remove $(UNWIND_H) dependency.
Don't copy $(UNWIND_H).
* config.gcc (ia64*-*-linux*): Remove with_system_libunwind
handling.
* configure.ac (GCC_CHECK_UNWIND_GETIPINFO): Remove.
* aclocal.m4: Regenerate.
* configure: Regenerate.
* emutls.c, unwind-c.c, unwind-compat.c, unwind-compat.h,
unwind-dw2-fde-compat.c, unwind-dw2-fde-glibc.c, unwind-dw2-fde.c,
unwind-dw2-fde.h, unwind-dw2.c, unwind-dw2.h, unwind-generic.h,
unwind-pe.h, unwind-sjlj.c, unwind.inc: Move to ../libgcc.
* unwind-dw2-fde-darwin.c: Move to ../libgcc/config.
* config/arm/libunwind.S, config/arm/pr-support.c,
config/arm/unwind-arm.c, config/arm/unwind-arm.h: Move to
../libgcc/config/arm.
* config/arm/t-bpabi (UNWIND_H, LIB2ADDEH): Remove.
* config/arm/t-symbian (UNWIND_H, LIB2ADDEH): Remove.
* config/frv/t-frv ($(T)frvbegin$(objext)): Use
$(srcdir)/../libgcc to refer to unwind-dw2-fde.h.
($(T)frvend$(objext)): Likewise.
* config/ia64/t-glibc (LIB2ADDEH): Remove.
* config/ia64/t-glibc-libunwind: Move to ../libgcc/config/ia64.
* config/ia64/fde-glibc.c, config/ia64/fde-vms.c,
config/ia64/unwind-ia64.c, config/ia64/unwind-ia64.h: Move to
../libgcc/config/ia64.
* config/ia64/t-hpux (LIB2ADDEH): Remove.
* config/ia64/t-ia64 (LIB2ADDEH): Remove.
* config/ia64/t-vms (LIB2ADDEH): Remove.
* config/ia64/vms.h (UNW_IVMS_MODE,
MD_UNW_COMPATIBLE_PERSONALITY_P): Remove.
* config/picochip/t-picochip (LIB2ADDEH): Remove.
* config/rs6000/aix.h (R_LR, MD_FROB_UPDATE_CONTEXT): Remove.
* config/rs6000/t-darwin (LIB2ADDEH): Remove.
* config/rs6000/darwin-fallback.c: Move to ../libgcc/config/rs6000.
* config/sh/t-sh ($(T)unwind-dw2-Os-4-200.o): Use
$(srcdir)/../libgcc to refer to unwinder sources.
* config/spu/t-spu-elf (LIB2ADDEH): Remove.
* config/t-darwin (LIB2ADDEH): Remove.
* config/t-freebsd (LIB2ADDEH): Remove.
* config/t-libunwind (LIB2ADDEH, LIB2ADDEHSTATIC): Remove.
* config/t-libunwind-elf: Move to ../libgcc/config.
* config/t-linux (LIB2ADDEH): Remove.
* config/t-sol2 (LIB2ADDEH): Remove.
* config/xtensa/t-xtensa (LIB2ADDEH): Remove.
* system.h (MD_FROB_UPDATE_CONTEXT): Poison.
gcc/po:
* EXCLUDES (unwind-c.c, unwind-dw2-fde-darwin.c)
(unwind-dw2-fde-glibc.c, unwind-dw2-fde.c, unwind-dw2-fde.h)
(unwind-dw2.c, unwind-pe.h, unwind-sjlj.c, unwind.h): Remove.
libgcc:
* Makefile.in (LIB2ADDEH, LIB2ADDEHSTATIC, LIB2ADDEHSHARED): New
variables.
(LIBUNWIND, SHLIBUNWIND_LINK, SHLIBUNWIND_INSTALL): New variables.
(LIB2ADDEH, LIB2ADDEHSTATIC, LIB2ADDEHSHARED): Add $(srcdir)/emutls.c.
(install-unwind_h): New target.
(all): Depend on it.
* config.host (unwind_header): New variable.
(*-*-freebsd*): Set tmake_file to t-eh-dw2-dip.
(*-*-linux*, frv-*-*linux*, *-*-kfreebsd*-gnu, *-*-knetbsd*-gnu,
*-*-gnu*): Likewise, also for *-*-kopensolaris*-gnu.
(*-*-solaris2*): Add t-eh-dw2-dip to tmake_file.
(arm*-*-linux*): Add arm/t-bpabi for arm*-*-linux-*eabi.
Set unwind_header.
(arm*-*-uclinux*): Add arm/t-bpabi for arm*-*-uclinux*eabi.
Set unwind_header.
(arm*-*-eabi*, arm*-*-symbianelf*): Add arm/t-bpabi for
arm*-*-eabi*.
Add arm/t-symbian to tmake_file for arm*-*-symbianelf*.
Set unwind_header.
(ia64*-*-elf*): Add ia64/t-eh-ia64 to tmake_file.
(ia64*-*-freebsd*): Likewise.
(ia64*-*-linux*): Add ia64/t-glibc, ia64/t-eh-ia64, t-libunwind to
tmake_file.
Add t-libunwind-elf, ia64/t-glibc-libunwind unless
$with_system_libunwind.
(ia64*-*-hpux*): Set tmake_file.
(ia64-hp-*vms*): Add ia64/t-eh-ia64 to tmake_file.
(picochip-*-*): Set tmake_file.
(rs6000-ibm-aix4.[3456789]*, powerpc-ibm-aix4.[3456789]*): Set
md_unwind_header.
(rs6000-ibm-aix5.1.*, powerpc-ibm-aix5.1.*): Likewise.
(rs6000-ibm-aix[56789].*, powerpc-ibm-aix[56789].*): Likewise.
(s390x-ibm-tpf*): Add t-eh-dw2-dip to tmake_file.
(xtensa*-*-elf*): Set tmake_file.
(xtensa*-*-linux*): Likewise.
* configure.ac: Include ../config/unwind_ipinfo.m4.
Call GCC_CHECK_UNWIND_GETIPINFO.
Link unwind.h to $unwind_header.
* configure: Regenerate.
* emutls.c, unwind-c.c, unwind-compat.c, unwind-compat.h,
unwind-dw2-fde-compat.c, unwind-dw2-fde-dip.c, unwind-dw2-fde.c,
unwind-dw2-fde.h, unwind-dw2.c, unwind-dw2.h, unwind-generic.h,
unwind-pe.h, unwind-sjlj.c, unwind.inc: New files.
* config/unwind-dw2-fde-darwin.c: New file.
* config/arm/libunwind.S, config/arm/pr-support.c,
config/arm/t-bpabi, config/arm/t-symbian, config/arm/unwind-arm.c,
config/arm/unwind-arm.h,: New files.
* config/ia64/fde-glibc.c, config/ia64/fde-vms.c,
config/ia64/t-eh-ia64, config/ia64/t-glibc,
config/ia64/t-glibc-libunwind, config/ia64/t-hpux,
config/ia64/t-vms, config/ia64/unwind-ia64.c,
config/ia64/unwind-ia64.h: New files.
* config/picochip/t-picochip: New file.
* config/rs6000/aix-unwind.h, config/rs6000/darwin-fallback.c: New
files.
* config/rs6000/t-darwin (LIB2ADDEH): Set.
* config/s390/t-tpf (LIB2ADDEH): Remove.
* config/t-darwin (LIB2ADDEH): Set.
* config/t-eh-dw2-dip: New file.
* config/t-libunwind, config/t-libunwind-elf: New files.
* config/t-sol2 (LIB2ADDEH): Remove.
* config/xtensa/t-xtensa: New file.
gcc/ada:
* gcc-interface/Makefile.in (raise-gcc.o): Search
$(srcdir)/../libgcc.
libgo:
* Makefile.am (AM_CFLAGS): Search $(srcdir)/../libgcc.
* Makefile.in: Regenerate.
libjava:
* configure.ac (GCC_UNWIND_INCLUDE): Rename to
LIBGCC_UNWIND_INCLUDE.
Point to $(multi_basedir)/./libjava/../libgcc.
* configure: Regenerate.
* Makefile.am (GCC_UNWIND_INCLUDE): Reflect this.
* Makefile.in: Regenerate.
libobjc:
* Makefile.in (INCLUDES): Search
$(srcdir)/$(MULTISRCTOP)../libgcc.
libstdc++-v3:
* acinclude.m4 (GLIBCXX_EXPORT_INCLUDES): Point TOPLEVEL_INCLUDES
to $(toplevel_srcdir)/libgcc.
* configure: Regenerate.
From-SVN: r177447
2011-08-05 16:37:48 +02:00
|
|
|
/* Copyright (C) 2004, 2009, 2011 Free Software Foundation, Inc.
|
2009-08-14 22:56:31 +02:00
|
|
|
Contributed by Douglas B Rupp <rupp@gnat.com>
|
|
|
|
|
|
|
|
This file is part of GCC.
|
|
|
|
|
|
|
|
GCC is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3, or (at your option)
|
|
|
|
any later version.
|
|
|
|
|
|
|
|
GCC is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
Under Section 7 of GPL version 3, you are granted additional
|
|
|
|
permissions described in the GCC Runtime Library Exception, version
|
|
|
|
3.1, as published by the Free Software Foundation.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License and
|
|
|
|
a copy of the GCC Runtime Library Exception along with this program;
|
|
|
|
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
|
|
/* Locate the FDE entry for a given address, using VMS Starlet routines
|
|
|
|
to avoid register/deregister calls at DSO load/unload. */
|
|
|
|
|
|
|
|
#include "tconfig.h"
|
|
|
|
#include "tsystem.h"
|
|
|
|
#include "coretypes.h"
|
|
|
|
#include "tm.h"
|
Move libgcc_tm_file to toplevel libgcc
gcc:
* configure.ac (libgcc_tm_file_list, libgcc_tm_include_list):
Remove.
* configure: Regenerate.
* Makefile.in (libgcc_tm_file_list, libgcc_tm_include_list): Remove.
(TM_H): Remove libgcc_tm.h, $(libgcc_tm_file_list).
(libgcc_tm.h, cs-libgcc_tm.h): Remove.
(clean): Remove libgcc_tm.h
* mkconfig.sh: Don't include libgcc_tm.h in tm.h.
* config.gcc (libgcc_tm_file): Remove.
(arm*-*-linux*): Remove libgcc_tm_file for arm*-*-linux-*eabi.
(arm*-*-uclinux*): Remove libgcc_tm_file for arm*-*-uclinux*eabi.
(arm*-*-eabi*, arm*-*-symbianelf*): Remove libgcc_tm_file.
(avr-*-rtems*): Likewise.
(avr-*-*): Likewise.
(frv-*-elf): Likewise.
(frv-*-*linux*): Likewise.
(h8300-*-rtems*): Likewise.
(h8300-*-elf*): Likewise.
(i[34567]86-*-darwin*): Likewise.
(x86_64-*-darwin*): Likewise.
(rx-*-elf*): Likewise.
(tic6x-*-elf): Likewise.
(tic6x-*-uclinux): Likewise.
(i[34567]86-*-linux*, x86_64-*-linux*): Likewise.
libgcc:
* configure.ac (tm_file_): New variable.
Determine from tm_file.
(tm_file, tm_defines): Substitute.
* configure: Regenerate.
* mkheader.sh: New file.
* Makefile.in (clean): Remove libgcc_tm.h.
($(objects)): Depend on libgcc_tm.h.
(libgcc_tm_defines, libgcc_tm_file): New variables.
(libgcc_tm.h, libgcc_tm.stamp): New targets.
($(libgcc-objects), $(libgcc-s-objects), $(libgcc-eh-objects))
($(libgcov-objects), $(libunwind-objects), $(libunwind-s-objects))
($(extra-parts)): Depend on libgcc_tm.h.
* config.host (tm_defines, tm_file): New variable.
(arm*-*-linux*): Set tm_file for arm*-*-linux-*eabi.
(arm*-*-uclinux*): Set tm_file for arm*-*-uclinux*eabi.
(arm*-*-eabi*, arm*-*-symbianelf*): Set tm_file.
(avr-*-rtems*): Likewise.
(avr-*-*): Likewise.
(frv-*-elf): Likewise.
(frv-*-*linux*): Likewise.
(h8300-*-rtems*): Likewise.
(h8300-*-elf*): Likewise.
(i[34567]86-*-darwin*): Likewise.
(x86_64-*-darwin*): Likewise.
(rx-*-elf): Likewise.
(tic6x-*-uclinux): Likewise.
(tic6x-*-elf): Likewise.
(i[34567]86-*-linux*, x86_64-*-linux*): Likewise.
* config/alpha/gthr-posix.c: Include libgcc_tm.h.
* config/i386/cygming-crtbegin.c: Likewise.
* config/i386/cygming-crtend.c: Likewise.
* config/ia64/fde-vms.c: Likewise.
* config/ia64/unwind-ia64.c: Likewise.
* config/libbid/bid_gcc_intrinsics.h: Likewise.
* config/rs6000/darwin-fallback.c: Likewise.
* config/stormy16/lib2funcs.c: Likewise.
* config/xtensa/unwind-dw2-xtensa.c: Likewise.
* crtstuff.c: Likewise.
* dfp-bit.h: Likewise.
* emutls.c: Likewise.
* fixed-bit.c: Likewise.
* fp-bit.c: Likewise.
* generic-morestack-thread.c: Likewise.
* generic-morestack.c: Likewise.
* libgcc2.c: Likewise.
* libgcov.c: Likewise.
* unwind-dw2-fde-dip.c: Likewise.
* unwind-dw2-fde.c: Likewise.
* unwind-dw2.c: Likewise.
* unwind-sjlj.c: Likewise.
Co-Authored-By: Paolo Bonzini <bonzini@gnu.org>
From-SVN: r180775
2011-11-02 16:26:35 +01:00
|
|
|
#include "libgcc_tm.h"
|
2009-08-14 22:56:31 +02:00
|
|
|
#include <stddef.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "unwind-ia64.h"
|
|
|
|
|
|
|
|
#define __int64 long
|
|
|
|
#include <vms/ossddef.h>
|
|
|
|
#ifndef SS$_NORMAL
|
|
|
|
#define SS$_NORMAL 1
|
|
|
|
#endif
|
|
|
|
|
2011-12-21 09:52:47 +01:00
|
|
|
#define UNW_IVMS_MODE(HEADER) (((HEADER) >> 44) & 0x3L)
|
|
|
|
|
2009-08-14 22:56:31 +02:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
unsigned long start_offset;
|
|
|
|
unsigned long end_offset;
|
|
|
|
unsigned long info_offset;
|
|
|
|
unsigned long gp_value;
|
|
|
|
} vms_unw_table_entry;
|
|
|
|
|
|
|
|
typedef unsigned long long uqword;
|
|
|
|
|
|
|
|
/* ENTRY is the unwind table entry found for a PC part of call chain we're
|
|
|
|
unwinding through. Return whether we should force the generic unwinder
|
|
|
|
to resort to "fallback" processing. */
|
|
|
|
|
|
|
|
static int
|
|
|
|
force_fallback_processing_for (void * pc, vms_unw_table_entry * entry)
|
|
|
|
{
|
|
|
|
static int eh_debug = -1;
|
|
|
|
|
|
|
|
uqword * unw_info_block = (uqword *)entry->info_offset;
|
|
|
|
uqword header = *unw_info_block;
|
|
|
|
|
|
|
|
/* We need to force fallback processing in two cases:
|
|
|
|
|
|
|
|
1/ The exception dispatch frame, since only our fallback
|
|
|
|
processing knows how to properly unwind through it, and
|
|
|
|
|
|
|
|
2/ A bottom of stack frame, since only our fallback processing
|
|
|
|
will ensure we don't try to unwind further past it, which
|
|
|
|
would get us into unknown territory and likely cause a severe
|
|
|
|
crash along the way.
|
|
|
|
|
|
|
|
The two cases are indicated by non-default values for specific
|
|
|
|
bits in the OS Specific Data (OSSD) General Information block
|
|
|
|
associated with such frames. */
|
|
|
|
|
|
|
|
ossddef * ossd;
|
|
|
|
|
|
|
|
if (eh_debug == -1)
|
|
|
|
{
|
|
|
|
char * EH_DEBUG = getenv ("EH_DEBUG");
|
|
|
|
eh_debug = EH_DEBUG ? atoi (EH_DEBUG) : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (eh_debug)
|
|
|
|
{
|
|
|
|
printf ("pc @ 0x%p, block @ 0x%p, header = 0x%016llx\n",
|
|
|
|
pc, unw_info_block, header);
|
|
|
|
printf ("mode = %d, length = %ld, handler = %d\n",
|
|
|
|
(int)UNW_IVMS_MODE (header), UNW_LENGTH (header),
|
|
|
|
UNW_FLAG_EHANDLER (header) || UNW_FLAG_EHANDLER (header));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* An OSSD block is there for IVMS_MODE == 3 only. */
|
|
|
|
if (UNW_IVMS_MODE (header) != 3)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* The OSSD block is found past the header, unwind descriptor area
|
|
|
|
and condition handler pointer, if any. */
|
|
|
|
ossd = (ossddef *)
|
|
|
|
/* Beware: uqword pointer arithmetic below. */
|
|
|
|
(unw_info_block
|
|
|
|
+ 1
|
|
|
|
+ UNW_LENGTH (header)
|
|
|
|
+ (UNW_FLAG_EHANDLER (header) || UNW_FLAG_EHANDLER (header)));
|
|
|
|
|
|
|
|
/* "A General Information segment may be omitted if all of its fields
|
|
|
|
would have their default values. If a General Information segment
|
|
|
|
is present, it must be the first in the OSSD area." So ... */
|
|
|
|
|
|
|
|
if (eh_debug)
|
|
|
|
printf ("ossd @ 0x%p\n", ossd);
|
|
|
|
|
|
|
|
if (eh_debug && ossd->ossd$v_type == OSSD$K_GENERAL_INFO)
|
|
|
|
printf ("exc_frame = %d - bot_frame = %d - base_frame = %d\n",
|
|
|
|
ossd->ossd$v_exception_frame,
|
|
|
|
ossd->ossd$v_bottom_of_stack,
|
|
|
|
ossd->ossd$v_base_frame);
|
|
|
|
|
|
|
|
return
|
|
|
|
ossd->ossd$v_type == OSSD$K_GENERAL_INFO
|
|
|
|
&& (ossd->ossd$v_exception_frame
|
|
|
|
|| ossd->ossd$v_bottom_of_stack || ossd->ossd$v_base_frame);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return a pointer to the unwind table entry for the function
|
|
|
|
containing PC, 0 if we cannot find an entry or if the one we find
|
|
|
|
calls for fallback processing. */
|
|
|
|
|
|
|
|
struct unw_table_entry *
|
|
|
|
_Unwind_FindTableEntry (void *pc, unsigned long *segment_base,
|
|
|
|
unsigned long *gp, struct unw_table_entry *ent)
|
|
|
|
{
|
|
|
|
vms_unw_table_entry vueblock;
|
|
|
|
|
|
|
|
if (SYS$GET_UNWIND_ENTRY_INFO (pc, &vueblock, 0) != SS$_NORMAL)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* If there is no unwind information, use fallback. */
|
|
|
|
if (vueblock.info_offset == 0)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* If we need to force fallback processing, just pretend there is
|
|
|
|
no entry. */
|
|
|
|
if (force_fallback_processing_for (pc, &vueblock))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
*segment_base = 0; /* ??? Fixme. ??? */
|
|
|
|
*gp = vueblock.gp_value;
|
|
|
|
ent->start_offset = vueblock.start_offset;
|
|
|
|
ent->end_offset = vueblock.end_offset;
|
|
|
|
ent->info_offset = vueblock.info_offset;
|
|
|
|
|
|
|
|
return ent;
|
|
|
|
}
|