1
0
Fork 0
mirror of https://github.com/tobast/libunwind-eh_elf.git synced 2024-11-22 07:37:38 +01:00

[PPC32] First check-in to add preliminary support for Linux/PPC32.

This commit is contained in:
Jose Flavio Aguilar Paulino 2007-09-12 21:52:25 -06:00 committed by David Mosberger-Tang
parent 6d75df39b5
commit 4499bb29a6
45 changed files with 2451 additions and 201 deletions

View file

@ -10,9 +10,13 @@ else
if ARCH_X86_64
include_HEADERS_tdep = include/libunwind-x86_64.h
else
if ARCH_PPC32
include_HEADERS_tdep = include/libunwind-ppc32.h
else
if ARCH_PPC64
include_HEADERS_tdep = include/libunwind-ppc64.h
endif # ARCH_PPC64
endif # ARCH_PPC32
endif # ARCH_X86_64
endif # ARCH_X86
endif # ARCH_HPPA
@ -46,6 +50,7 @@ EXTRA_DIST = include/dwarf.h include/dwarf_i.h include/dwarf-eh.h \
include/libunwind-x86_64.h include/tdep-x86_64/libunwind_i.h \
include/tdep-x86_64/jmpbuf.h include/tdep-x86_64/dwarf-config.h \
include/libunwind-ppc64.h include/tdep-ppc64/dwarf-config.h \
include/tdep-ppc32/jmpbuf.h include/tdep-ppc32/libunwind_i.h \
include/tdep-ppc64/jmpbuf.h include/tdep-ppc64/libunwind_i.h
DISTCLEANFILES = include/libunwind.h include/tdep

View file

@ -65,10 +65,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
pdf-recursive ps-recursive uninstall-info-recursive \
uninstall-recursive
am__include_HEADERS_DIST = include/libunwind-ppc64.h \
include/libunwind-x86_64.h include/libunwind-x86.h \
include/libunwind-hppa.h include/libunwind-ia64.h \
include/libunwind-dynamic.h include/libunwind-ptrace.h \
include/libunwind.h include/unwind.h
include/libunwind-ppc32.h include/libunwind-x86_64.h \
include/libunwind-x86.h include/libunwind-hppa.h \
include/libunwind-ia64.h include/libunwind-dynamic.h \
include/libunwind-ptrace.h include/libunwind.h \
include/unwind.h
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@ -232,7 +233,8 @@ target_alias = @target_alias@
target_cpu = @target_cpu@
target_os = @target_os@
target_vendor = @target_vendor@
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@include_HEADERS_tdep = include/libunwind-ppc64.h
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@include_HEADERS_tdep = include/libunwind-ppc64.h
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@include_HEADERS_tdep = include/libunwind-ppc32.h
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@include_HEADERS_tdep = include/libunwind-x86_64.h
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@include_HEADERS_tdep = include/libunwind-x86.h
@ARCH_HPPA_TRUE@@ARCH_IA64_FALSE@include_HEADERS_tdep = include/libunwind-hppa.h
@ -260,6 +262,7 @@ EXTRA_DIST = include/dwarf.h include/dwarf_i.h include/dwarf-eh.h \
include/libunwind-x86_64.h include/tdep-x86_64/libunwind_i.h \
include/tdep-x86_64/jmpbuf.h include/tdep-x86_64/dwarf-config.h \
include/libunwind-ppc64.h include/tdep-ppc64/dwarf-config.h \
include/tdep-ppc32/jmpbuf.h include/tdep-ppc32/libunwind_i.h \
include/tdep-ppc64/jmpbuf.h include/tdep-ppc64/libunwind_i.h
DISTCLEANFILES = include/libunwind.h include/tdep
@ -498,7 +501,7 @@ distclean-tags:
distdir: $(DISTFILES)
$(am__remove_distdir)
mkdir $(distdir)
$(mkdir_p) $(distdir)/config $(distdir)/doc $(distdir)/include $(distdir)/include/tdep-hppa $(distdir)/include/tdep-ia64 $(distdir)/include/tdep-ppc64 $(distdir)/include/tdep-x86 $(distdir)/include/tdep-x86_64 $(distdir)/tests
$(mkdir_p) $(distdir)/config $(distdir)/doc $(distdir)/include $(distdir)/include/tdep-hppa $(distdir)/include/tdep-ia64 $(distdir)/include/tdep-ppc32 $(distdir)/include/tdep-ppc64 $(distdir)/include/tdep-x86 $(distdir)/include/tdep-x86_64 $(distdir)/tests
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \

226
include/libunwind-ppc32.h Normal file
View file

@ -0,0 +1,226 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
Copied from libunwind-x86_64.h, modified slightly for building
frysk successfully on ppc64, by Wu Zhou <woodzltc@cn.ibm.com>
Will be replaced when libunwind is ready on ppc64 platform.
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#ifndef LIBUNWIND_H
#define LIBUNWIND_H
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
#include <inttypes.h>
#include <ucontext.h>
#define UNW_TARGET ppc32
#define UNW_TARGET_PPC32 1
#define _U_TDEP_QP_TRUE 0 /* see libunwind-dynamic.h */
/*
* This needs to be big enough to accommodate "struct cursor", while
* leaving some slack for future expansion. Changing this value will
* require recompiling all users of this library. Stack allocation is
* relatively cheap and unwind-state copying is relatively rare, so we want
* to err on making it rather too big than too small.
*
* To simplify this whole process, we are at least initially taking the
* tack that UNW_PPC32_* map straight across to the .eh_frame column register
* numbers. These register numbers come from gcc's source in
* gcc/config/rs6000/rs6000.h
*
* UNW_TDEP_CURSOR_LEN is in terms of unw_word_t size. Since we have 115
* elements in the loc array, each sized 2 * unw_word_t, plus the rest of
* the cursor struct, this puts us at about 2 * 115 + 40 = 270. Let's
* round that up to 280.
*/
#define UNW_TDEP_CURSOR_LEN 280
#if __WORDSIZE==32
typedef uint32_t unw_word_t;
typedef int32_t unw_sword_t;
#else
typedef uint64_t unw_word_t;
typedef int64_t unw_sword_t;
#endif
typedef long double unw_tdep_fpreg_t;
typedef enum
{
UNW_PPC32_R0,
UNW_PPC32_R1, /* called STACK_POINTER in gcc */
UNW_PPC32_R2,
UNW_PPC32_R3,
UNW_PPC32_R4,
UNW_PPC32_R5,
UNW_PPC32_R6,
UNW_PPC32_R7,
UNW_PPC32_R8,
UNW_PPC32_R9,
UNW_PPC32_R10,
UNW_PPC32_R11, /* called STATIC_CHAIN in gcc */
UNW_PPC32_R12,
UNW_PPC32_R13,
UNW_PPC32_R14,
UNW_PPC32_R15,
UNW_PPC32_R16,
UNW_PPC32_R17,
UNW_PPC32_R18,
UNW_PPC32_R19,
UNW_PPC32_R20,
UNW_PPC32_R21,
UNW_PPC32_R22,
UNW_PPC32_R23,
UNW_PPC32_R24,
UNW_PPC32_R25,
UNW_PPC32_R26,
UNW_PPC32_R27,
UNW_PPC32_R28,
UNW_PPC32_R29,
UNW_PPC32_R30,
UNW_PPC32_R31, /* called HARD_FRAME_POINTER in gcc */
UNW_PPC32_F0 = 32,
UNW_PPC32_F1,
UNW_PPC32_F2,
UNW_PPC32_F3,
UNW_PPC32_F4,
UNW_PPC32_F5,
UNW_PPC32_F6,
UNW_PPC32_F7,
UNW_PPC32_F8,
UNW_PPC32_F9,
UNW_PPC32_F10,
UNW_PPC32_F11,
UNW_PPC32_F12,
UNW_PPC32_F13,
UNW_PPC32_F14,
UNW_PPC32_F15,
UNW_PPC32_F16,
UNW_PPC32_F17,
UNW_PPC32_F18,
UNW_PPC32_F19,
UNW_PPC32_F20,
UNW_PPC32_F21,
UNW_PPC32_F22,
UNW_PPC32_F23,
UNW_PPC32_F24,
UNW_PPC32_F25,
UNW_PPC32_F26,
UNW_PPC32_F27,
UNW_PPC32_F28,
UNW_PPC32_F29,
UNW_PPC32_F30,
UNW_PPC32_F31,
/* Note that there doesn't appear to be an .eh_frame register column
for the FPSCR register. I don't know why this is. Since .eh_frame
info is what this implementation uses for unwinding, we have no way
to unwind this register, and so we will not expose an FPSCR register
number in the libunwind API.
*/
UNW_PPC32_LR = 65,
UNW_PPC32_CTR = 66,
UNW_PPC32_ARG_POINTER = 67,
UNW_PPC32_CR0 = 68,
UNW_PPC32_CR1,
UNW_PPC32_CR2,
UNW_PPC32_CR3,
UNW_PPC32_CR4,
/* CR5 .. CR7 are currently unused */
UNW_PPC32_CR5,
UNW_PPC32_CR6,
UNW_PPC32_CR7,
UNW_PPC32_XER = 76,
UNW_PPC32_VRSAVE = 109,
UNW_PPC32_VSCR = 110,
UNW_PPC32_SPE_ACC = 111,
UNW_PPC32_SPEFSCR = 112,
/* frame info (read-only) */
UNW_PPC32_FRAME_POINTER,
UNW_PPC32_NIP,
UNW_TDEP_LAST_REG = UNW_PPC32_NIP,
UNW_TDEP_IP = UNW_PPC32_NIP,
UNW_TDEP_SP = UNW_PPC32_R1,
UNW_TDEP_EH = UNW_PPC32_R12
}
ppc32_regnum_t;
/*
* According to David Edelsohn, GNU gcc uses R3, R4, R5, and maybe R6 for
* passing parameters to exception handlers.
*/
#define UNW_TDEP_NUM_EH_REGS 4
typedef struct unw_tdep_save_loc
{
/* Additional target-dependent info on a save location. */
}
unw_tdep_save_loc_t;
/* On ppc, we can directly use ucontext_t as the unwind context. */
typedef ucontext_t unw_tdep_context_t;
/* XXX this is not ideal: an application should not be prevented from
using the "getcontext" name just because it's using libunwind. We
can't just use __getcontext() either, because that isn't exported
by glibc... */
#define unw_tdep_getcontext(uc) (getcontext (uc), 0)
#include "libunwind-dynamic.h"
typedef struct
{
/* no ppc32-specific auxiliary proc-info */
}
unw_tdep_proc_info_t;
#include "libunwind-common.h"
#define unw_tdep_is_fpreg UNW_ARCH_OBJ(is_fpreg)
extern int unw_tdep_is_fpreg (int);
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
#endif /* LIBUNWIND_H */

View file

@ -0,0 +1,56 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
Copied from libunwind-x86_64.h, modified slightly for building
frysk successfully on ppc64, by Wu Zhou <woodzltc@cn.ibm.com>
Will be replaced when libunwind is ready on ppc64 platform.
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#ifndef dwarf_config_h
#define dwarf_config_h
/* For PPC64, 48 GPRs + 33 FPRs + 33 AltiVec + 1 SPE */
#define DWARF_NUM_PRESERVED_REGS 115
#define DWARF_REGNUM_MAP_LENGTH 115
/* Return TRUE if the ADDR_SPACE uses big-endian byte-order. */
#define dwarf_is_big_endian(addr_space) 1
/* Convert a pointer to a dwarf_cursor structure to a pointer to
unw_cursor_t. */
#define dwarf_to_cursor(c) ((unw_cursor_t *) (c))
typedef struct dwarf_loc
{
unw_word_t val;
#ifndef UNW_LOCAL_ONLY
unw_word_t type; /* see X86_LOC_TYPE_* macros. */
#endif
}
dwarf_loc_t;
#endif /* dwarf_config_h */

View file

@ -0,0 +1,37 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
Copied from libunwind-x86_64.h, modified slightly for building
frysk successfully on ppc64, by Wu Zhou <woodzltc@cn.ibm.com>
Will be replaced when libunwind is ready on ppc64 platform.
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/* Use glibc's jump-buffer indices; NPTL peeks at SP: */
#define JB_SP 6
#define JB_RP 7
#define JB_MASK_SAVED 8
#define JB_MASK 9

View file

@ -0,0 +1,299 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
Copied from libunwind-x86_64.h, modified slightly for building
frysk successfully on ppc64, by Wu Zhou <woodzltc@cn.ibm.com>
Will be replaced when libunwind is ready on ppc64 platform.
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#ifndef PPC32_LIBUNWIND_I_H
#define PPC32_LIBUNWIND_I_H
/* Target-dependent definitions that are internal to libunwind but need
to be shared with target-independent code. */
#include <stdlib.h>
#include <libunwind.h>
#include "elf32.h"
#include "mempool.h"
#include "dwarf.h"
struct unw_addr_space
{
struct unw_accessors acc;
unw_caching_policy_t caching_policy;
#ifdef HAVE_ATOMIC_OPS_H
AO_t cache_generation;
#else
uint32_t cache_generation;
#endif
unw_word_t dyn_generation; /* see dyn-common.h */
unw_word_t dyn_info_list_addr; /* (cached) dyn_info_list_addr */
struct dwarf_rs_cache global_cache;
int validate;
};
struct cursor
{
struct dwarf_cursor dwarf; /* must be first */
/* Format of sigcontext structure and address at which it is
stored: */
enum
{
PPC_SCF_NONE, /* no signal frame encountered */
PPC_SCF_LINUX_RT_SIGFRAME /* POSIX ucontext_t */
}
sigcontext_format;
unw_word_t sigcontext_addr;
};
#define DWARF_GET_LOC(l) ((l).val)
#ifdef UNW_LOCAL_ONLY
# define DWARF_NULL_LOC DWARF_LOC (0, 0)
# define DWARF_IS_NULL_LOC(l) (DWARF_GET_LOC (l) == 0)
# define DWARF_LOC(r, t) ((dwarf_loc_t) { .val = (r) })
# define DWARF_IS_REG_LOC(l) 0
# define DWARF_IS_FP_LOC(l) 0
# define DWARF_IS_V_LOC(l) 0
# define DWARF_MEM_LOC(c,m) DWARF_LOC ((m), 0)
# define DWARF_REG_LOC(c,r) (DWARF_LOC((unw_word_t) \
tdep_uc_addr((c)->as_arg, (r)), 0))
# define DWARF_FPREG_LOC(c,r) (DWARF_LOC((unw_word_t) \
tdep_uc_addr((c)->as_arg, (r)), 0))
# define DWARF_VREG_LOC(c,r) (DWARF_LOC((unw_word_t) \
tdep_uc_addr((c)->as_arg, (r)), 0))
#else /* !UNW_LOCAL_ONLY */
# define DWARF_LOC_TYPE_FP (1 << 0)
# define DWARF_LOC_TYPE_REG (1 << 1)
# define DWARF_LOC_TYPE_V (1 << 2)
# define DWARF_NULL_LOC DWARF_LOC (0, 0)
# define DWARF_IS_NULL_LOC(l) \
({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
# define DWARF_LOC(r, t) ((dwarf_loc_t) { .val = (r), .type = (t) })
# define DWARF_IS_REG_LOC(l) (((l).type & DWARF_LOC_TYPE_REG) != 0)
# define DWARF_IS_FP_LOC(l) (((l).type & DWARF_LOC_TYPE_FP) != 0)
# define DWARF_IS_V_LOC(l) (((l).type & DWARF_LOC_TYPE_V) != 0)
# define DWARF_MEM_LOC(c,m) DWARF_LOC ((m), 0)
# define DWARF_REG_LOC(c,r) DWARF_LOC((r), DWARF_LOC_TYPE_REG)
# define DWARF_FPREG_LOC(c,r) DWARF_LOC((r), (DWARF_LOC_TYPE_REG \
| DWARF_LOC_TYPE_FP))
# define DWARF_VREG_LOC(c,r) DWARF_LOC((r), (DWARF_LOC_TYPE_REG \
| DWARF_LOC_TYPE_V))
#endif /* !UNW_LOCAL_ONLY */
static inline int
dwarf_getvr (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t * val)
{
unw_word_t *valp = (unw_word_t *) val;
unw_word_t addr;
int ret;
if (DWARF_IS_NULL_LOC (loc))
return -UNW_EBADREG;
assert (DWARF_IS_V_LOC (loc));
assert (!DWARF_IS_FP_LOC (loc));
if (DWARF_IS_REG_LOC (loc))
return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
val, 0, c->as_arg);
addr = DWARF_GET_LOC (loc);
if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, valp,
0, c->as_arg)) < 0)
return ret;
return (*c->as->acc.access_mem) (c->as, addr + 8, valp + 1, 0, c->as_arg);
}
static inline int
dwarf_putvr (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
{
unw_word_t *valp = (unw_word_t *) & val;
unw_word_t addr;
int ret;
if (DWARF_IS_NULL_LOC (loc))
return -UNW_EBADREG;
assert (DWARF_IS_V_LOC (loc));
assert (!DWARF_IS_FP_LOC (loc));
if (DWARF_IS_REG_LOC (loc))
return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
&val, 1, c->as_arg);
addr = DWARF_GET_LOC (loc);
if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, valp,
1, c->as_arg)) < 0)
return ret;
return (*c->as->acc.access_mem) (c->as, addr + 8, valp + 1, 1, c->as_arg);
}
static inline int
dwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t * val)
{
unw_word_t *valp = (unw_word_t *) val;
unw_word_t addr;
if (DWARF_IS_NULL_LOC (loc))
return -UNW_EBADREG;
assert (DWARF_IS_FP_LOC (loc));
assert (!DWARF_IS_V_LOC (loc));
if (DWARF_IS_REG_LOC (loc))
return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
val, 0, c->as_arg);
addr = DWARF_GET_LOC (loc);
return (*c->as->acc.access_mem) (c->as, addr + 0, valp, 0, c->as_arg);
}
static inline int
dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
{
unw_word_t *valp = (unw_word_t *) & val;
unw_word_t addr;
if (DWARF_IS_NULL_LOC (loc))
return -UNW_EBADREG;
assert (DWARF_IS_FP_LOC (loc));
assert (!DWARF_IS_V_LOC (loc));
if (DWARF_IS_REG_LOC (loc))
return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
&val, 1, c->as_arg);
addr = DWARF_GET_LOC (loc);
return (*c->as->acc.access_mem) (c->as, addr + 0, valp, 1, c->as_arg);
}
static inline int
dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t * val)
{
if (DWARF_IS_NULL_LOC (loc))
return -UNW_EBADREG;
/* If a code-generator were to save a value of type unw_word_t in a
floating-point register, we would have to support this case. I
suppose it could happen with MMX registers, but does it really
happen? */
assert (!DWARF_IS_FP_LOC (loc));
assert (!DWARF_IS_V_LOC (loc));
if (DWARF_IS_REG_LOC (loc))
return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
0, c->as_arg);
else
return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
0, c->as_arg);
}
static inline int
dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
{
if (DWARF_IS_NULL_LOC (loc))
return -UNW_EBADREG;
/* If a code-generator were to save a value of type unw_word_t in a
floating-point register, we would have to support this case. I
suppose it could happen with MMX registers, but does it really
happen? */
assert (!DWARF_IS_FP_LOC (loc));
assert (!DWARF_IS_V_LOC (loc));
if (DWARF_IS_REG_LOC (loc))
return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
1, c->as_arg);
else
return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
1, c->as_arg);
}
#define tdep_needs_initialization UNW_OBJ(needs_initialization)
#define tdep_init UNW_OBJ(init)
/* Platforms that support UNW_INFO_FORMAT_TABLE need to define
tdep_search_unwind_table. */
#define tdep_search_unwind_table dwarf_search_unwind_table
#define tdep_uc_addr UNW_ARCH_OBJ(uc_addr)
#define tdep_get_elf_image UNW_ARCH_OBJ(get_elf_image)
#define tdep_access_reg UNW_OBJ(access_reg)
#define tdep_access_fpreg UNW_OBJ(access_fpreg)
#define tdep_get_func_addr UNW_OBJ(get_func_addr)
#ifdef UNW_LOCAL_ONLY
# define tdep_find_proc_info(c,ip,n) \
dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n), \
(c)->as_arg)
# define tdep_put_unwind_info(as,pi,arg) \
dwarf_put_unwind_info((as), (pi), (arg))
#else
# define tdep_find_proc_info(c,ip,n) \
(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n), \
(c)->as_arg)
# define tdep_put_unwind_info(as,pi,arg) \
(*(as)->acc.put_unwind_info)((as), (pi), (arg))
#endif
extern int tdep_fetch_proc_info_post (struct dwarf_cursor *c, unw_word_t ip,
int need_unwind_info);
#define tdep_get_as(c) ((c)->dwarf.as)
#define tdep_get_as_arg(c) ((c)->dwarf.as_arg)
#define tdep_get_ip(c) ((c)->dwarf.ip)
#define tdep_big_endian(as) 1
extern int tdep_needs_initialization;
extern void tdep_init (void);
extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
unw_dyn_info_t * di,
unw_proc_info_t * pi,
int need_unwind_info, void *arg);
extern void *tdep_uc_addr (ucontext_t * uc, int reg);
extern int tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
unsigned long *segbase, unsigned long *mapoff);
extern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
unw_word_t * valp, int write);
extern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg,
unw_fpreg_t * valp, int write);
extern int tdep_get_func_addr (unw_addr_space_t as, unw_word_t addr,
unw_word_t *entry_point);
#endif /* PPC64_LIBUNWIND_I_H */

View file

@ -65,8 +65,8 @@ struct cursor
stored: */
enum
{
PPC64_SCF_NONE, /* no signal frame encountered */
PPC64_SCF_LINUX_RT_SIGFRAME /* POSIX ucontext_t */
PPC_SCF_NONE, /* no signal frame encountered */
PPC_SCF_LINUX_RT_SIGFRAME /* POSIX ucontext_t */
}
sigcontext_format;
unw_word_t sigcontext_addr;

View file

@ -38,7 +38,8 @@ libunwind_setjmp_la_SOURCES_ia64 = ia64/setjmp.S ia64/sigsetjmp.S \
libunwind_setjmp_la_SOURCES_hppa = hppa/siglongjmp.S
libunwind_setjmp_la_SOURCES_x86 = x86/longjmp.S x86/siglongjmp.S
libunwind_setjmp_la_SOURCES_x86_64 = x86_64/longjmp.S x86_64/siglongjmp.S
libunwind_setjmp_la_SOURCES_ppc64 = ppc64/longjmp.S ppc64/siglongjmp.S
libunwind_setjmp_la_SOURCES_ppc64 = ppc/longjmp.S ppc/siglongjmp.S
libunwind_setjmp_la_SOURCES_ppc32 = ppc/longjmp.S ppc/siglongjmp.S
### libunwind:
@ -204,6 +205,41 @@ libunwind_x86_64_la_SOURCES_x86_64 = $(libunwind_la_SOURCES_x86_64_common) \
x86_64/Gis_signal_frame.c x86_64/Gget_proc_info.c x86_64/Gregs.c \
x86_64/Gresume.c x86_64/Gstep.c
# The list of local files that go to Power 64 and 32:
libunwind_la_SOURCES_ppc = ppc/Lcreate_addr_space.c \
ppc/Lget_proc_info.c ppc/Lget_save_loc.c ppc/Linit_local.c \
ppc/Linit_remote.c ppc/Lis_signal_frame.c
# The list of generic files that go to Power 64 and 32:
libunwind_ppc_la_SOURCES_ppc_generic = ppc/Gcreate_addr_space.c \
ppc/Gget_proc_info.c ppc/Gget_save_loc.c ppc/Ginit_local.c \
ppc/Ginit_remote.c ppc/Gis_signal_frame.c
# The list of files that go both into libunwind and libunwind-ppc32:
libunwind_la_SOURCES_ppc32_common = $(libunwind_la_SOURCES_common) \
$(dwarf_SOURCES_common) \
elf32.c elf32.h \
ppc32/init.h ppc32/unwind_i.h ppc32/ucontext_i.h \
ppc32/is_fpreg.c ppc32/regname.c ppc32/get_func_addr.c
# The list of files that go into libunwind:
libunwind_la_SOURCES_ppc32 = $(libunwind_la_SOURCES_ppc32_common) \
$(libunwind_la_SOURCES_local) \
$(dwarf_SOURCES_local) \
$(libunwind_la_SOURCES_ppc) \
dwarf/Lfind_proc_info-lsb.c \
ppc32/Lglobal.c ppc32/Linit.c \
ppc32/Lregs.c ppc32/Lresume.c ppc32/Lstep.c
# The list of files that go into libunwind-ppc32:
libunwind_ppc32_la_SOURCES_ppc32 = $(libunwind_la_SOURCES_ppc32_common) \
$(libunwind_la_SOURCES_generic) \
$(dwarf_SOURCES_generic) \
$(libunwind_ppc_la_SOURCES_ppc_generic) \
dwarf/Gfind_proc_info-lsb.c \
ppc32/Gglobal.c ppc32/Ginit.c \
ppc32/Gregs.c ppc32/Gresume.c ppc32/Gstep.c
# The list of files that go both into libunwind and libunwind-ppc64:
libunwind_la_SOURCES_ppc64_common = $(libunwind_la_SOURCES_common) \
$(dwarf_SOURCES_common) \
@ -215,24 +251,19 @@ libunwind_la_SOURCES_ppc64_common = $(libunwind_la_SOURCES_common) \
libunwind_la_SOURCES_ppc64 = $(libunwind_la_SOURCES_ppc64_common) \
$(libunwind_la_SOURCES_local) \
$(dwarf_SOURCES_local) \
$(libunwind_la_SOURCES_ppc) \
dwarf/Lfind_proc_info-lsb.c \
ppc64/Lcreate_addr_space.c ppc64/Lget_save_loc.c \
ppc64/Lglobal.c ppc64/Linit.c ppc64/Linit_local.c \
ppc64/Linit_remote.c ppc64/Lis_signal_frame.c \
ppc64/Lget_proc_info.c ppc64/Lregs.c \
ppc64/Lresume.c ppc64/Lstep.c
ppc64/Lglobal.c ppc64/Linit.c \
ppc64/Lregs.c ppc64/Lresume.c ppc64/Lstep.c
# The list of files that go into libunwind-ppc64:
libunwind_ppc64_la_SOURCES_ppc64 = $(libunwind_la_SOURCES_ppc64_common) \
$(libunwind_la_SOURCES_generic) \
$(dwarf_SOURCES_generic) \
$(libunwind_ppc_la_SOURCES_ppc_generic) \
dwarf/Gfind_proc_info-lsb.c \
ppc64/Gcreate_addr_space.c \
ppc64/Gget_proc_info.c \
ppc64/Gget_save_loc.c ppc64/Gglobal.c \
ppc64/Ginit.c ppc64/Ginit_local.c ppc64/Ginit_remote.c \
ppc64/Gis_signal_frame.c ppc64/Gregs.c ppc64/Gresume.c \
ppc64/Gstep.c
ppc64/Gglobal.c ppc64/Ginit.c \
ppc64/Gregs.c ppc64/Gresume.c ppc64/Gstep.c
if REMOTE_ONLY
install-exec-hook:
@ -309,7 +340,17 @@ if !REMOTE_ONLY
endif
libunwind_setjmp_la_SOURCES = $(libunwind_setjmp_la_SOURCES_common) \
$(libunwind_setjmp_la_SOURCES_x86_64)
else
if ARCH_PPC32
lib_LTLIBRARIES_arch = libunwind-ppc32.la
libunwind_la_SOURCES = $(libunwind_la_SOURCES_ppc32)
libunwind_ppc32_la_SOURCES = $(libunwind_ppc32_la_SOURCES_ppc32)
libunwind_ppc32_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
if !REMOTE_ONLY
libunwind_ppc32_la_LIBADD = libunwind.la -lc
endif
libunwind_setjmp_la_SOURCES = $(libunwind_setjmp_la_SOURCES_common) \
$(libunwind_setjmp_la_SOURCES_ppc32)
else
if ARCH_PPC64
lib_LTLIBRARIES_arch = libunwind-ppc64.la
@ -323,6 +364,7 @@ endif
$(libunwind_setjmp_la_SOURCES_ppc64)
endif # ARCH_PPC64
endif # ARCH_PPC32
endif # ARCH_X86_64
endif # ARCH_X86
endif # ARCH_HPPA
@ -362,6 +404,7 @@ EXTRA_DIST = elfxx.h elfxx.c unwind/unwind-internal.h \
$(libunwind_setjmp_la_SOURCES_ia64) \
$(libunwind_setjmp_la_SOURCES_x86) \
$(libunwind_setjmp_la_SOURCES_x86_64) \
$(libunwind_setjmp_la_SOURCES_ppc32) \
$(libunwind_setjmp_la_SOURCES_ppc64)

View file

@ -150,7 +150,37 @@ am__objects_11 = $(am__objects_10) $(am__objects_7) \
@ARCH_IA64_TRUE@am_libunwind_ia64_la_OBJECTS = $(am__objects_11)
libunwind_ia64_la_OBJECTS = $(am_libunwind_ia64_la_OBJECTS)
@ARCH_IA64_TRUE@am_libunwind_ia64_la_rpath = -rpath $(libdir)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@@REMOTE_ONLY_FALSE@libunwind_ppc64_la_DEPENDENCIES = libunwind.la
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@@REMOTE_ONLY_FALSE@libunwind_ppc32_la_DEPENDENCIES = libunwind.la
am__libunwind_ppc32_la_SOURCES_DIST = os-hpux.c os-linux.h os-linux.c \
mi/init.c mi/flush_cache.c mi/mempool.c mi/strerror.c \
dwarf/global.c elf32.c elf32.h ppc32/init.h ppc32/unwind_i.h \
ppc32/ucontext_i.h ppc32/is_fpreg.c ppc32/regname.c \
ppc32/get_func_addr.c mi/Gdyn-extract.c mi/Gdyn-remote.c \
mi/Gfind_dynamic_proc_info.c mi/Gget_accessors.c \
mi/Gget_proc_info_by_ip.c mi/Gget_proc_name.c \
mi/Gput_dynamic_unwind_info.c mi/Gdestroy_addr_space.c \
mi/Gget_reg.c mi/Gset_reg.c mi/Gget_fpreg.c mi/Gset_fpreg.c \
mi/Gset_caching_policy.c dwarf/Gexpr.c dwarf/Gfde.c \
dwarf/Gparser.c dwarf/Gpe.c dwarf/Gstep.c \
ppc/Gcreate_addr_space.c ppc/Gget_proc_info.c \
ppc/Gget_save_loc.c ppc/Ginit_local.c ppc/Ginit_remote.c \
ppc/Gis_signal_frame.c dwarf/Gfind_proc_info-lsb.c \
ppc32/Gglobal.c ppc32/Ginit.c ppc32/Gregs.c ppc32/Gresume.c \
ppc32/Gstep.c
am__objects_12 = $(am__objects_4) $(am__objects_5) elf32.lo \
ppc32/is_fpreg.lo ppc32/regname.lo ppc32/get_func_addr.lo
am__objects_13 = ppc/Gcreate_addr_space.lo ppc/Gget_proc_info.lo \
ppc/Gget_save_loc.lo ppc/Ginit_local.lo ppc/Ginit_remote.lo \
ppc/Gis_signal_frame.lo
am__objects_14 = $(am__objects_12) $(am__objects_7) $(am__objects_8) \
$(am__objects_13) dwarf/Gfind_proc_info-lsb.lo \
ppc32/Gglobal.lo ppc32/Ginit.lo ppc32/Gregs.lo \
ppc32/Gresume.lo ppc32/Gstep.lo
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@am_libunwind_ppc32_la_OBJECTS = $(am__objects_14)
libunwind_ppc32_la_OBJECTS = $(am_libunwind_ppc32_la_OBJECTS)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@am_libunwind_ppc32_la_rpath = -rpath \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@ $(libdir)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@@REMOTE_ONLY_FALSE@libunwind_ppc64_la_DEPENDENCIES = libunwind.la
am__libunwind_ppc64_la_SOURCES_DIST = os-hpux.c os-linux.h os-linux.c \
mi/init.c mi/flush_cache.c mi/mempool.c mi/strerror.c \
dwarf/global.c elf64.c elf64.h ppc64/init.h ppc64/unwind_i.h \
@ -162,47 +192,47 @@ am__libunwind_ppc64_la_SOURCES_DIST = os-hpux.c os-linux.h os-linux.c \
mi/Gget_reg.c mi/Gset_reg.c mi/Gget_fpreg.c mi/Gset_fpreg.c \
mi/Gset_caching_policy.c dwarf/Gexpr.c dwarf/Gfde.c \
dwarf/Gparser.c dwarf/Gpe.c dwarf/Gstep.c \
dwarf/Gfind_proc_info-lsb.c ppc64/Gcreate_addr_space.c \
ppc64/Gget_proc_info.c ppc64/Gget_save_loc.c ppc64/Gglobal.c \
ppc64/Ginit.c ppc64/Ginit_local.c ppc64/Ginit_remote.c \
ppc64/Gis_signal_frame.c ppc64/Gregs.c ppc64/Gresume.c \
ppc/Gcreate_addr_space.c ppc/Gget_proc_info.c \
ppc/Gget_save_loc.c ppc/Ginit_local.c ppc/Ginit_remote.c \
ppc/Gis_signal_frame.c dwarf/Gfind_proc_info-lsb.c \
ppc64/Gglobal.c ppc64/Ginit.c ppc64/Gregs.c ppc64/Gresume.c \
ppc64/Gstep.c
am__objects_12 = $(am__objects_4) $(am__objects_5) elf64.lo \
am__objects_15 = $(am__objects_4) $(am__objects_5) elf64.lo \
ppc64/is_fpreg.lo ppc64/regname.lo ppc64/get_func_addr.lo
am__objects_13 = $(am__objects_12) $(am__objects_7) $(am__objects_8) \
dwarf/Gfind_proc_info-lsb.lo ppc64/Gcreate_addr_space.lo \
ppc64/Gget_proc_info.lo ppc64/Gget_save_loc.lo \
ppc64/Gglobal.lo ppc64/Ginit.lo ppc64/Ginit_local.lo \
ppc64/Ginit_remote.lo ppc64/Gis_signal_frame.lo ppc64/Gregs.lo \
am__objects_16 = $(am__objects_15) $(am__objects_7) $(am__objects_8) \
$(am__objects_13) dwarf/Gfind_proc_info-lsb.lo \
ppc64/Gglobal.lo ppc64/Ginit.lo ppc64/Gregs.lo \
ppc64/Gresume.lo ppc64/Gstep.lo
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@am_libunwind_ppc64_la_OBJECTS = $(am__objects_13)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@am_libunwind_ppc64_la_OBJECTS = $(am__objects_16)
libunwind_ppc64_la_OBJECTS = $(am_libunwind_ppc64_la_OBJECTS)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@am_libunwind_ppc64_la_rpath = -rpath \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@ $(libdir)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@am_libunwind_ppc64_la_rpath = -rpath \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@ $(libdir)
libunwind_setjmp_la_DEPENDENCIES = libunwind-$(arch).la
am__libunwind_setjmp_la_SOURCES_DIST = setjmp/setjmp_i.h \
setjmp/longjmp.c setjmp/siglongjmp.c ppc64/longjmp.S \
ppc64/siglongjmp.S x86_64/longjmp.S x86_64/siglongjmp.S \
setjmp/longjmp.c setjmp/siglongjmp.c ppc/longjmp.S \
ppc/siglongjmp.S x86_64/longjmp.S x86_64/siglongjmp.S \
x86/longjmp.S x86/siglongjmp.S hppa/siglongjmp.S ia64/setjmp.S \
ia64/sigsetjmp.S ia64/longjmp.S ia64/siglongjmp.S
am__objects_14 = setjmp/longjmp.lo setjmp/siglongjmp.lo
am__objects_15 = ppc64/longjmp.lo ppc64/siglongjmp.lo
am__objects_16 = x86_64/longjmp.lo x86_64/siglongjmp.lo
am__objects_17 = x86/longjmp.lo x86/siglongjmp.lo
am__objects_18 = hppa/siglongjmp.lo
am__objects_19 = ia64/setjmp.lo ia64/sigsetjmp.lo ia64/longjmp.lo \
am__objects_17 = setjmp/longjmp.lo setjmp/siglongjmp.lo
am__objects_18 = ppc/longjmp.lo ppc/siglongjmp.lo
am__objects_19 = x86_64/longjmp.lo x86_64/siglongjmp.lo
am__objects_20 = x86/longjmp.lo x86/siglongjmp.lo
am__objects_21 = hppa/siglongjmp.lo
am__objects_22 = ia64/setjmp.lo ia64/sigsetjmp.lo ia64/longjmp.lo \
ia64/siglongjmp.lo
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@am_libunwind_setjmp_la_OBJECTS = $(am__objects_14) \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@ $(am__objects_15)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@am_libunwind_setjmp_la_OBJECTS = $(am__objects_14) \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@ $(am__objects_16)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@am_libunwind_setjmp_la_OBJECTS = $(am__objects_14) \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@ $(am__objects_17)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@am_libunwind_setjmp_la_OBJECTS = $(am__objects_17) \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@ $(am__objects_18)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@am_libunwind_setjmp_la_OBJECTS = $(am__objects_17) \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@ $(am__objects_18)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@am_libunwind_setjmp_la_OBJECTS = $(am__objects_17) \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@ $(am__objects_19)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@am_libunwind_setjmp_la_OBJECTS = $(am__objects_17) \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@ $(am__objects_20)
@ARCH_HPPA_TRUE@@ARCH_IA64_FALSE@am_libunwind_setjmp_la_OBJECTS = \
@ARCH_HPPA_TRUE@@ARCH_IA64_FALSE@ $(am__objects_14) \
@ARCH_HPPA_TRUE@@ARCH_IA64_FALSE@ $(am__objects_18)
@ARCH_IA64_TRUE@am_libunwind_setjmp_la_OBJECTS = $(am__objects_14) \
@ARCH_IA64_TRUE@ $(am__objects_19)
@ARCH_HPPA_TRUE@@ARCH_IA64_FALSE@ $(am__objects_17) \
@ARCH_HPPA_TRUE@@ARCH_IA64_FALSE@ $(am__objects_21)
@ARCH_IA64_TRUE@am_libunwind_setjmp_la_OBJECTS = $(am__objects_17) \
@ARCH_IA64_TRUE@ $(am__objects_22)
libunwind_setjmp_la_OBJECTS = $(am_libunwind_setjmp_la_OBJECTS)
@REMOTE_ONLY_FALSE@am_libunwind_setjmp_la_rpath = -rpath $(libdir)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@@REMOTE_ONLY_FALSE@libunwind_x86_la_DEPENDENCIES = libunwind.la
@ -221,14 +251,14 @@ am__libunwind_x86_la_SOURCES_DIST = os-hpux.c os-linux.h os-linux.c \
x86/Ginit.c x86/Ginit_local.c x86/Ginit_remote.c \
x86/Gis_signal_frame.c x86/Gget_proc_info.c x86/Gregs.c \
x86/Gresume.c x86/Gstep.c
am__objects_20 = $(am__objects_4) $(am__objects_5) elf32.lo \
am__objects_23 = $(am__objects_4) $(am__objects_5) elf32.lo \
x86/is_fpreg.lo x86/regname.lo
am__objects_21 = $(am__objects_20) $(am__objects_7) $(am__objects_8) \
am__objects_24 = $(am__objects_23) $(am__objects_7) $(am__objects_8) \
dwarf/Gfind_proc_info-lsb.lo x86/Gcreate_addr_space.lo \
x86/Gget_save_loc.lo x86/Gglobal.lo x86/Ginit.lo \
x86/Ginit_local.lo x86/Ginit_remote.lo x86/Gis_signal_frame.lo \
x86/Gget_proc_info.lo x86/Gregs.lo x86/Gresume.lo x86/Gstep.lo
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@am_libunwind_x86_la_OBJECTS = $(am__objects_21)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@am_libunwind_x86_la_OBJECTS = $(am__objects_24)
libunwind_x86_la_OBJECTS = $(am_libunwind_x86_la_OBJECTS)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@am_libunwind_x86_la_rpath = \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@ -rpath \
@ -250,15 +280,15 @@ am__libunwind_x86_64_la_SOURCES_DIST = os-hpux.c os-linux.h os-linux.c \
x86_64/Ginit_local.c x86_64/Ginit_remote.c \
x86_64/Gis_signal_frame.c x86_64/Gget_proc_info.c \
x86_64/Gregs.c x86_64/Gresume.c x86_64/Gstep.c
am__objects_22 = $(am__objects_4) $(am__objects_5) elf64.lo \
am__objects_25 = $(am__objects_4) $(am__objects_5) elf64.lo \
x86_64/is_fpreg.lo x86_64/regname.lo
am__objects_23 = $(am__objects_22) $(am__objects_7) $(am__objects_8) \
am__objects_26 = $(am__objects_25) $(am__objects_7) $(am__objects_8) \
dwarf/Gfind_proc_info-lsb.lo x86_64/Gcreate_addr_space.lo \
x86_64/Gget_save_loc.lo x86_64/Gglobal.lo x86_64/Ginit.lo \
x86_64/Ginit_local.lo x86_64/Ginit_remote.lo \
x86_64/Gis_signal_frame.lo x86_64/Gget_proc_info.lo \
x86_64/Gregs.lo x86_64/Gresume.lo x86_64/Gstep.lo
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@am_libunwind_x86_64_la_OBJECTS = $(am__objects_23)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@am_libunwind_x86_64_la_OBJECTS = $(am__objects_26)
libunwind_x86_64_la_OBJECTS = $(am_libunwind_x86_64_la_OBJECTS)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@am_libunwind_x86_64_la_rpath = -rpath \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@ $(libdir)
@ -283,26 +313,28 @@ am__libunwind_la_SOURCES_DIST = os-hpux.c os-linux.h os-linux.c \
unwind/GetTextRelBase.c unwind/RaiseException.c \
unwind/Resume.c unwind/Resume_or_Rethrow.c unwind/SetGR.c \
unwind/SetIP.c dwarf/Lexpr.c dwarf/Lfde.c dwarf/Lparser.c \
dwarf/Lpe.c dwarf/Lstep.c dwarf/Lfind_proc_info-lsb.c \
ppc64/Lcreate_addr_space.c ppc64/Lget_save_loc.c \
ppc64/Lglobal.c ppc64/Linit.c ppc64/Linit_local.c \
ppc64/Linit_remote.c ppc64/Lis_signal_frame.c \
ppc64/Lget_proc_info.c ppc64/Lregs.c ppc64/Lresume.c \
ppc64/Lstep.c x86_64/init.h x86_64/unwind_i.h \
dwarf/Lpe.c dwarf/Lstep.c ppc/Lcreate_addr_space.c \
ppc/Lget_proc_info.c ppc/Lget_save_loc.c ppc/Linit_local.c \
ppc/Linit_remote.c ppc/Lis_signal_frame.c \
dwarf/Lfind_proc_info-lsb.c ppc64/Lglobal.c ppc64/Linit.c \
ppc64/Lregs.c ppc64/Lresume.c ppc64/Lstep.c elf32.c elf32.h \
ppc32/init.h ppc32/unwind_i.h ppc32/ucontext_i.h \
ppc32/is_fpreg.c ppc32/regname.c ppc32/get_func_addr.c \
ppc32/Lglobal.c ppc32/Linit.c ppc32/Lregs.c ppc32/Lresume.c \
ppc32/Lstep.c x86_64/init.h x86_64/unwind_i.h \
x86_64/ucontext_i.h x86_64/is_fpreg.c x86_64/regname.c \
x86_64/offsets.h x86_64/setcontext.S \
x86_64/Lcreate_addr_space.c x86_64/Lget_save_loc.c \
x86_64/Lglobal.c x86_64/Linit.c x86_64/Linit_local.c \
x86_64/Linit_remote.c x86_64/Lis_signal_frame.c \
x86_64/Lget_proc_info.c x86_64/Lregs.c x86_64/Lresume.c \
x86_64/Lstep.c elf32.c elf32.h x86/init.h x86/offsets.h \
x86/unwind_i.h x86/is_fpreg.c x86/regname.c \
x86/Lcreate_addr_space.c x86/Lget_save_loc.c x86/Lglobal.c \
x86/Linit.c x86/Linit_local.c x86/Linit_remote.c \
x86/Lis_signal_frame.c x86/Lget_proc_info.c x86/Lregs.c \
x86/Lresume.c x86/Lstep.c hppa/init.h hppa/offsets.h \
hppa/unwind_i.h hppa/regname.c hppa/getcontext.S \
hppa/setcontext.S hppa/Lcreate_addr_space.c \
x86_64/Lstep.c x86/init.h x86/offsets.h x86/unwind_i.h \
x86/is_fpreg.c x86/regname.c x86/Lcreate_addr_space.c \
x86/Lget_save_loc.c x86/Lglobal.c x86/Linit.c \
x86/Linit_local.c x86/Linit_remote.c x86/Lis_signal_frame.c \
x86/Lget_proc_info.c x86/Lregs.c x86/Lresume.c x86/Lstep.c \
hppa/init.h hppa/offsets.h hppa/unwind_i.h hppa/regname.c \
hppa/getcontext.S hppa/setcontext.S hppa/Lcreate_addr_space.c \
hppa/Lget_save_loc.c hppa/Lglobal.c hppa/Linit.c \
hppa/Linit_local.c hppa/Linit_remote.c hppa/Lis_signal_frame.c \
hppa/Lget_proc_info.c hppa/Lregs.c hppa/Lresume.c hppa/Lstep.c \
@ -315,9 +347,9 @@ am__libunwind_la_SOURCES_DIST = os-hpux.c os-linux.h os-linux.c \
ia64/Lis_signal_frame.c ia64/Lparser.c ia64/Lrbs.c \
ia64/Lregs.c ia64/Lresume.c ia64/Lscript.c ia64/Lstep.c \
ia64/Ltables.c
am__objects_24 = mi/_ReadULEB.lo mi/_ReadSLEB.lo
@OS_LINUX_TRUE@am__objects_25 = $(am__objects_24)
am__objects_26 = $(am__objects_25) mi/backtrace.lo mi/dyn-cancel.lo \
am__objects_27 = mi/_ReadULEB.lo mi/_ReadSLEB.lo
@OS_LINUX_TRUE@am__objects_28 = $(am__objects_27)
am__objects_29 = $(am__objects_28) mi/backtrace.lo mi/dyn-cancel.lo \
mi/dyn-info-list.lo mi/dyn-register.lo mi/Ldyn-extract.lo \
mi/Lfind_dynamic_proc_info.lo mi/Lget_accessors.lo \
mi/Lget_proc_info_by_ip.lo mi/Lget_proc_name.lo \
@ -331,34 +363,39 @@ am__objects_26 = $(am__objects_25) mi/backtrace.lo mi/dyn-cancel.lo \
unwind/GetTextRelBase.lo unwind/RaiseException.lo \
unwind/Resume.lo unwind/Resume_or_Rethrow.lo unwind/SetGR.lo \
unwind/SetIP.lo
am__objects_27 = dwarf/Lexpr.lo dwarf/Lfde.lo dwarf/Lparser.lo \
am__objects_30 = dwarf/Lexpr.lo dwarf/Lfde.lo dwarf/Lparser.lo \
dwarf/Lpe.lo dwarf/Lstep.lo
am__objects_28 = $(am__objects_12) $(am__objects_26) $(am__objects_27) \
dwarf/Lfind_proc_info-lsb.lo ppc64/Lcreate_addr_space.lo \
ppc64/Lget_save_loc.lo ppc64/Lglobal.lo ppc64/Linit.lo \
ppc64/Linit_local.lo ppc64/Linit_remote.lo \
ppc64/Lis_signal_frame.lo ppc64/Lget_proc_info.lo \
ppc64/Lregs.lo ppc64/Lresume.lo ppc64/Lstep.lo
am__objects_29 = $(am__objects_22) $(am__objects_26) $(am__objects_27) \
am__objects_31 = ppc/Lcreate_addr_space.lo ppc/Lget_proc_info.lo \
ppc/Lget_save_loc.lo ppc/Linit_local.lo ppc/Linit_remote.lo \
ppc/Lis_signal_frame.lo
am__objects_32 = $(am__objects_15) $(am__objects_29) $(am__objects_30) \
$(am__objects_31) dwarf/Lfind_proc_info-lsb.lo \
ppc64/Lglobal.lo ppc64/Linit.lo ppc64/Lregs.lo \
ppc64/Lresume.lo ppc64/Lstep.lo
am__objects_33 = $(am__objects_12) $(am__objects_29) $(am__objects_30) \
$(am__objects_31) dwarf/Lfind_proc_info-lsb.lo \
ppc32/Lglobal.lo ppc32/Linit.lo ppc32/Lregs.lo \
ppc32/Lresume.lo ppc32/Lstep.lo
am__objects_34 = $(am__objects_25) $(am__objects_29) $(am__objects_30) \
dwarf/Lfind_proc_info-lsb.lo x86_64/setcontext.lo \
x86_64/Lcreate_addr_space.lo x86_64/Lget_save_loc.lo \
x86_64/Lglobal.lo x86_64/Linit.lo x86_64/Linit_local.lo \
x86_64/Linit_remote.lo x86_64/Lis_signal_frame.lo \
x86_64/Lget_proc_info.lo x86_64/Lregs.lo x86_64/Lresume.lo \
x86_64/Lstep.lo
am__objects_30 = $(am__objects_20) $(am__objects_26) $(am__objects_27) \
am__objects_35 = $(am__objects_23) $(am__objects_29) $(am__objects_30) \
dwarf/Lfind_proc_info-lsb.lo x86/Lcreate_addr_space.lo \
x86/Lget_save_loc.lo x86/Lglobal.lo x86/Linit.lo \
x86/Linit_local.lo x86/Linit_remote.lo x86/Lis_signal_frame.lo \
x86/Lget_proc_info.lo x86/Lregs.lo x86/Lresume.lo x86/Lstep.lo
am__objects_31 = $(am__objects_6) $(am__objects_26) hppa/getcontext.lo \
hppa/setcontext.lo $(am__objects_27) \
am__objects_36 = $(am__objects_6) $(am__objects_29) hppa/getcontext.lo \
hppa/setcontext.lo $(am__objects_30) \
dwarf/Lfind_proc_info-lsb.lo hppa/Lcreate_addr_space.lo \
hppa/Lget_save_loc.lo hppa/Lglobal.lo hppa/Linit.lo \
hppa/Linit_local.lo hppa/Linit_remote.lo \
hppa/Lis_signal_frame.lo hppa/Lget_proc_info.lo hppa/Lregs.lo \
hppa/Lresume.lo hppa/Lstep.lo
am__objects_32 = $(am__objects_10) $(am__objects_26) \
am__objects_37 = $(am__objects_10) $(am__objects_29) \
ia64/dyn_info_list.lo ia64/getcontext.lo \
ia64/Lcreate_addr_space.lo ia64/Lget_proc_info.lo \
ia64/Lget_save_loc.lo ia64/Lglobal.lo ia64/Linit.lo \
@ -366,12 +403,13 @@ am__objects_32 = $(am__objects_10) $(am__objects_26) \
ia64/Linstall_cursor.lo ia64/Lis_signal_frame.lo \
ia64/Lparser.lo ia64/Lrbs.lo ia64/Lregs.lo ia64/Lresume.lo \
ia64/Lscript.lo ia64/Lstep.lo ia64/Ltables.lo
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@am_libunwind_la_OBJECTS = $(am__objects_28)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@am_libunwind_la_OBJECTS = $(am__objects_29)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@am_libunwind_la_OBJECTS = $(am__objects_30)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@am_libunwind_la_OBJECTS = $(am__objects_32)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@am_libunwind_la_OBJECTS = $(am__objects_33)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@am_libunwind_la_OBJECTS = $(am__objects_34)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@am_libunwind_la_OBJECTS = $(am__objects_35)
@ARCH_HPPA_TRUE@@ARCH_IA64_FALSE@am_libunwind_la_OBJECTS = \
@ARCH_HPPA_TRUE@@ARCH_IA64_FALSE@ $(am__objects_31)
@ARCH_IA64_TRUE@am_libunwind_la_OBJECTS = $(am__objects_32)
@ARCH_HPPA_TRUE@@ARCH_IA64_FALSE@ $(am__objects_36)
@ARCH_IA64_TRUE@am_libunwind_la_OBJECTS = $(am__objects_37)
libunwind_la_OBJECTS = $(am_libunwind_la_OBJECTS)
@REMOTE_ONLY_FALSE@am_libunwind_la_rpath = -rpath $(libdir)
PROGRAMS = $(noinst_PROGRAMS)
@ -400,13 +438,15 @@ CCLD = $(CC)
LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
SOURCES = $(libunwind_ptrace_a_SOURCES) $(libunwind_hppa_la_SOURCES) \
$(libunwind_ia64_la_SOURCES) $(libunwind_ppc64_la_SOURCES) \
$(libunwind_setjmp_la_SOURCES) $(libunwind_x86_la_SOURCES) \
$(libunwind_x86_64_la_SOURCES) $(libunwind_la_SOURCES) \
$(ia64_mk_Gcursor_i_SOURCES) $(ia64_mk_Lcursor_i_SOURCES)
$(libunwind_ia64_la_SOURCES) $(libunwind_ppc32_la_SOURCES) \
$(libunwind_ppc64_la_SOURCES) $(libunwind_setjmp_la_SOURCES) \
$(libunwind_x86_la_SOURCES) $(libunwind_x86_64_la_SOURCES) \
$(libunwind_la_SOURCES) $(ia64_mk_Gcursor_i_SOURCES) \
$(ia64_mk_Lcursor_i_SOURCES)
DIST_SOURCES = $(libunwind_ptrace_a_SOURCES) \
$(am__libunwind_hppa_la_SOURCES_DIST) \
$(am__libunwind_ia64_la_SOURCES_DIST) \
$(am__libunwind_ppc32_la_SOURCES_DIST) \
$(am__libunwind_ppc64_la_SOURCES_DIST) \
$(am__libunwind_setjmp_la_SOURCES_DIST) \
$(am__libunwind_x86_la_SOURCES_DIST) \
@ -596,7 +636,8 @@ libunwind_setjmp_la_SOURCES_ia64 = ia64/setjmp.S ia64/sigsetjmp.S \
libunwind_setjmp_la_SOURCES_hppa = hppa/siglongjmp.S
libunwind_setjmp_la_SOURCES_x86 = x86/longjmp.S x86/siglongjmp.S
libunwind_setjmp_la_SOURCES_x86_64 = x86_64/longjmp.S x86_64/siglongjmp.S
libunwind_setjmp_la_SOURCES_ppc64 = ppc64/longjmp.S ppc64/siglongjmp.S
libunwind_setjmp_la_SOURCES_ppc64 = ppc/longjmp.S ppc/siglongjmp.S
libunwind_setjmp_la_SOURCES_ppc32 = ppc/longjmp.S ppc/siglongjmp.S
### libunwind:
@ -776,6 +817,46 @@ libunwind_x86_64_la_SOURCES_x86_64 = $(libunwind_la_SOURCES_x86_64_common) \
x86_64/Gresume.c x86_64/Gstep.c
# The list of local files that go to Power 64 and 32:
libunwind_la_SOURCES_ppc = ppc/Lcreate_addr_space.c \
ppc/Lget_proc_info.c ppc/Lget_save_loc.c ppc/Linit_local.c \
ppc/Linit_remote.c ppc/Lis_signal_frame.c
# The list of generic files that go to Power 64 and 32:
libunwind_ppc_la_SOURCES_ppc_generic = ppc/Gcreate_addr_space.c \
ppc/Gget_proc_info.c ppc/Gget_save_loc.c ppc/Ginit_local.c \
ppc/Ginit_remote.c ppc/Gis_signal_frame.c
# The list of files that go both into libunwind and libunwind-ppc32:
libunwind_la_SOURCES_ppc32_common = $(libunwind_la_SOURCES_common) \
$(dwarf_SOURCES_common) \
elf32.c elf32.h \
ppc32/init.h ppc32/unwind_i.h ppc32/ucontext_i.h \
ppc32/is_fpreg.c ppc32/regname.c ppc32/get_func_addr.c
# The list of files that go into libunwind:
libunwind_la_SOURCES_ppc32 = $(libunwind_la_SOURCES_ppc32_common) \
$(libunwind_la_SOURCES_local) \
$(dwarf_SOURCES_local) \
$(libunwind_la_SOURCES_ppc) \
dwarf/Lfind_proc_info-lsb.c \
ppc32/Lglobal.c ppc32/Linit.c \
ppc32/Lregs.c ppc32/Lresume.c ppc32/Lstep.c
# The list of files that go into libunwind-ppc32:
libunwind_ppc32_la_SOURCES_ppc32 = $(libunwind_la_SOURCES_ppc32_common) \
$(libunwind_la_SOURCES_generic) \
$(dwarf_SOURCES_generic) \
$(libunwind_ppc_la_SOURCES_ppc_generic) \
dwarf/Gfind_proc_info-lsb.c \
ppc32/Gglobal.c ppc32/Ginit.c \
ppc32/Gregs.c ppc32/Gresume.c ppc32/Gstep.c
# The list of files that go both into libunwind and libunwind-ppc64:
libunwind_la_SOURCES_ppc64_common = $(libunwind_la_SOURCES_common) \
$(dwarf_SOURCES_common) \
@ -788,25 +869,20 @@ libunwind_la_SOURCES_ppc64_common = $(libunwind_la_SOURCES_common) \
libunwind_la_SOURCES_ppc64 = $(libunwind_la_SOURCES_ppc64_common) \
$(libunwind_la_SOURCES_local) \
$(dwarf_SOURCES_local) \
$(libunwind_la_SOURCES_ppc) \
dwarf/Lfind_proc_info-lsb.c \
ppc64/Lcreate_addr_space.c ppc64/Lget_save_loc.c \
ppc64/Lglobal.c ppc64/Linit.c ppc64/Linit_local.c \
ppc64/Linit_remote.c ppc64/Lis_signal_frame.c \
ppc64/Lget_proc_info.c ppc64/Lregs.c \
ppc64/Lresume.c ppc64/Lstep.c
ppc64/Lglobal.c ppc64/Linit.c \
ppc64/Lregs.c ppc64/Lresume.c ppc64/Lstep.c
# The list of files that go into libunwind-ppc64:
libunwind_ppc64_la_SOURCES_ppc64 = $(libunwind_la_SOURCES_ppc64_common) \
$(libunwind_la_SOURCES_generic) \
$(dwarf_SOURCES_generic) \
$(libunwind_ppc_la_SOURCES_ppc_generic) \
dwarf/Gfind_proc_info-lsb.c \
ppc64/Gcreate_addr_space.c \
ppc64/Gget_proc_info.c \
ppc64/Gget_save_loc.c ppc64/Gglobal.c \
ppc64/Ginit.c ppc64/Ginit_local.c ppc64/Ginit_remote.c \
ppc64/Gis_signal_frame.c ppc64/Gregs.c ppc64/Gresume.c \
ppc64/Gstep.c
ppc64/Gglobal.c ppc64/Ginit.c \
ppc64/Gregs.c ppc64/Gresume.c ppc64/Gstep.c
@OS_HPUX_TRUE@libunwind_la_SOURCES_os = $(libunwind_la_SOURCES_os_hpux)
@OS_LINUX_TRUE@libunwind_la_SOURCES_os = $(libunwind_la_SOURCES_os_linux)
@ -815,12 +891,14 @@ libunwind_ppc64_la_SOURCES_ppc64 = $(libunwind_la_SOURCES_ppc64_common) \
@ARCH_IA64_TRUE@ia64_mk_Gcursor_i_SOURCES = ia64/mk_Gcursor_i.c
@ARCH_IA64_TRUE@ia64_mk_Lcursor_i_SOURCES = ia64/mk_Lcursor_i.c
@ARCH_IA64_TRUE@BUILT_SOURCES = Gcursor_i.h Lcursor_i.h
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@lib_LTLIBRARIES_arch = libunwind-ppc64.la
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@lib_LTLIBRARIES_arch = libunwind-ppc64.la
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@lib_LTLIBRARIES_arch = libunwind-ppc32.la
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@lib_LTLIBRARIES_arch = libunwind-x86_64.la
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@lib_LTLIBRARIES_arch = libunwind-x86.la
@ARCH_HPPA_TRUE@@ARCH_IA64_FALSE@lib_LTLIBRARIES_arch = libunwind-hppa.la
@ARCH_IA64_TRUE@lib_LTLIBRARIES_arch = libunwind-ia64.la
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@libunwind_la_SOURCES = $(libunwind_la_SOURCES_ppc64)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@libunwind_la_SOURCES = $(libunwind_la_SOURCES_ppc64)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@libunwind_la_SOURCES = $(libunwind_la_SOURCES_ppc32)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@libunwind_la_SOURCES = $(libunwind_la_SOURCES_x86_64)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_TRUE@libunwind_la_SOURCES = $(libunwind_la_SOURCES_x86)
@ARCH_HPPA_TRUE@@ARCH_IA64_FALSE@libunwind_la_SOURCES = $(libunwind_la_SOURCES_hppa)
@ -828,8 +906,11 @@ libunwind_ppc64_la_SOURCES_ppc64 = $(libunwind_la_SOURCES_ppc64_common) \
@ARCH_IA64_TRUE@libunwind_ia64_la_SOURCES = $(libunwind_ia64_la_SOURCES_ia64)
@ARCH_IA64_TRUE@libunwind_ia64_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
@ARCH_IA64_TRUE@@REMOTE_ONLY_FALSE@libunwind_ia64_la_LIBADD = libunwind.la -lc
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@libunwind_setjmp_la_SOURCES = $(libunwind_setjmp_la_SOURCES_common) \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@ $(libunwind_setjmp_la_SOURCES_ppc64)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@libunwind_setjmp_la_SOURCES = $(libunwind_setjmp_la_SOURCES_common) \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@ $(libunwind_setjmp_la_SOURCES_ppc64)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@libunwind_setjmp_la_SOURCES = $(libunwind_setjmp_la_SOURCES_common) \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@ $(libunwind_setjmp_la_SOURCES_ppc32)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@libunwind_setjmp_la_SOURCES = $(libunwind_setjmp_la_SOURCES_common) \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@ $(libunwind_setjmp_la_SOURCES_x86_64)
@ -852,9 +933,12 @@ libunwind_ppc64_la_SOURCES_ppc64 = $(libunwind_la_SOURCES_ppc64_common) \
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@libunwind_x86_64_la_SOURCES = $(libunwind_x86_64_la_SOURCES_x86_64)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@libunwind_x86_64_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_X86_64_TRUE@@ARCH_X86_FALSE@@REMOTE_ONLY_FALSE@libunwind_x86_64_la_LIBADD = libunwind.la -lc
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@libunwind_ppc64_la_SOURCES = $(libunwind_ppc64_la_SOURCES_ppc64)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@libunwind_ppc64_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@@REMOTE_ONLY_FALSE@libunwind_ppc64_la_LIBADD = libunwind.la -lc
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@libunwind_ppc32_la_SOURCES = $(libunwind_ppc32_la_SOURCES_ppc32)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@libunwind_ppc32_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@@REMOTE_ONLY_FALSE@libunwind_ppc32_la_LIBADD = libunwind.la -lc
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@libunwind_ppc64_la_SOURCES = $(libunwind_ppc64_la_SOURCES_ppc64)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@libunwind_ppc64_la_LDFLAGS = $(COMMON_SO_LDFLAGS) -version-info $(SOVERSION)
@ARCH_HPPA_FALSE@@ARCH_IA64_FALSE@@ARCH_PPC32_FALSE@@ARCH_PPC64_TRUE@@ARCH_X86_64_FALSE@@ARCH_X86_FALSE@@REMOTE_ONLY_FALSE@libunwind_ppc64_la_LIBADD = libunwind.la -lc
#
# Don't link with standard libraries, because those may mention
@ -889,6 +973,7 @@ EXTRA_DIST = elfxx.h elfxx.c unwind/unwind-internal.h \
$(libunwind_setjmp_la_SOURCES_ia64) \
$(libunwind_setjmp_la_SOURCES_x86) \
$(libunwind_setjmp_la_SOURCES_x86_64) \
$(libunwind_setjmp_la_SOURCES_ppc32) \
$(libunwind_setjmp_la_SOURCES_ppc64)
all: $(BUILT_SOURCES)
@ -1118,6 +1203,43 @@ ia64/Gstep.lo: ia64/$(am__dirstamp) ia64/$(DEPDIR)/$(am__dirstamp)
ia64/Gtables.lo: ia64/$(am__dirstamp) ia64/$(DEPDIR)/$(am__dirstamp)
libunwind-ia64.la: $(libunwind_ia64_la_OBJECTS) $(libunwind_ia64_la_DEPENDENCIES)
$(LINK) $(am_libunwind_ia64_la_rpath) $(libunwind_ia64_la_LDFLAGS) $(libunwind_ia64_la_OBJECTS) $(libunwind_ia64_la_LIBADD) $(LIBS)
ppc32/$(am__dirstamp):
@$(mkdir_p) ppc32
@: > ppc32/$(am__dirstamp)
ppc32/$(DEPDIR)/$(am__dirstamp):
@$(mkdir_p) ppc32/$(DEPDIR)
@: > ppc32/$(DEPDIR)/$(am__dirstamp)
ppc32/is_fpreg.lo: ppc32/$(am__dirstamp) \
ppc32/$(DEPDIR)/$(am__dirstamp)
ppc32/regname.lo: ppc32/$(am__dirstamp) \
ppc32/$(DEPDIR)/$(am__dirstamp)
ppc32/get_func_addr.lo: ppc32/$(am__dirstamp) \
ppc32/$(DEPDIR)/$(am__dirstamp)
ppc/$(am__dirstamp):
@$(mkdir_p) ppc
@: > ppc/$(am__dirstamp)
ppc/$(DEPDIR)/$(am__dirstamp):
@$(mkdir_p) ppc/$(DEPDIR)
@: > ppc/$(DEPDIR)/$(am__dirstamp)
ppc/Gcreate_addr_space.lo: ppc/$(am__dirstamp) \
ppc/$(DEPDIR)/$(am__dirstamp)
ppc/Gget_proc_info.lo: ppc/$(am__dirstamp) \
ppc/$(DEPDIR)/$(am__dirstamp)
ppc/Gget_save_loc.lo: ppc/$(am__dirstamp) \
ppc/$(DEPDIR)/$(am__dirstamp)
ppc/Ginit_local.lo: ppc/$(am__dirstamp) ppc/$(DEPDIR)/$(am__dirstamp)
ppc/Ginit_remote.lo: ppc/$(am__dirstamp) ppc/$(DEPDIR)/$(am__dirstamp)
ppc/Gis_signal_frame.lo: ppc/$(am__dirstamp) \
ppc/$(DEPDIR)/$(am__dirstamp)
ppc32/Gglobal.lo: ppc32/$(am__dirstamp) \
ppc32/$(DEPDIR)/$(am__dirstamp)
ppc32/Ginit.lo: ppc32/$(am__dirstamp) ppc32/$(DEPDIR)/$(am__dirstamp)
ppc32/Gregs.lo: ppc32/$(am__dirstamp) ppc32/$(DEPDIR)/$(am__dirstamp)
ppc32/Gresume.lo: ppc32/$(am__dirstamp) \
ppc32/$(DEPDIR)/$(am__dirstamp)
ppc32/Gstep.lo: ppc32/$(am__dirstamp) ppc32/$(DEPDIR)/$(am__dirstamp)
libunwind-ppc32.la: $(libunwind_ppc32_la_OBJECTS) $(libunwind_ppc32_la_DEPENDENCIES)
$(LINK) $(am_libunwind_ppc32_la_rpath) $(libunwind_ppc32_la_LDFLAGS) $(libunwind_ppc32_la_OBJECTS) $(libunwind_ppc32_la_LIBADD) $(LIBS)
ppc64/$(am__dirstamp):
@$(mkdir_p) ppc64
@: > ppc64/$(am__dirstamp)
@ -1130,21 +1252,9 @@ ppc64/regname.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/get_func_addr.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Gcreate_addr_space.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Gget_proc_info.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Gget_save_loc.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Gglobal.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Ginit.lo: ppc64/$(am__dirstamp) ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Ginit_local.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Ginit_remote.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Gis_signal_frame.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Gregs.lo: ppc64/$(am__dirstamp) ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Gresume.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
@ -1161,10 +1271,8 @@ setjmp/longjmp.lo: setjmp/$(am__dirstamp) \
setjmp/$(DEPDIR)/$(am__dirstamp)
setjmp/siglongjmp.lo: setjmp/$(am__dirstamp) \
setjmp/$(DEPDIR)/$(am__dirstamp)
ppc64/longjmp.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/siglongjmp.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc/longjmp.lo: ppc/$(am__dirstamp) ppc/$(DEPDIR)/$(am__dirstamp)
ppc/siglongjmp.lo: ppc/$(am__dirstamp) ppc/$(DEPDIR)/$(am__dirstamp)
x86_64/$(am__dirstamp):
@$(mkdir_p) x86_64
@: > x86_64/$(am__dirstamp)
@ -1308,27 +1416,32 @@ dwarf/Lparser.lo: dwarf/$(am__dirstamp) \
dwarf/$(DEPDIR)/$(am__dirstamp)
dwarf/Lpe.lo: dwarf/$(am__dirstamp) dwarf/$(DEPDIR)/$(am__dirstamp)
dwarf/Lstep.lo: dwarf/$(am__dirstamp) dwarf/$(DEPDIR)/$(am__dirstamp)
ppc/Lcreate_addr_space.lo: ppc/$(am__dirstamp) \
ppc/$(DEPDIR)/$(am__dirstamp)
ppc/Lget_proc_info.lo: ppc/$(am__dirstamp) \
ppc/$(DEPDIR)/$(am__dirstamp)
ppc/Lget_save_loc.lo: ppc/$(am__dirstamp) \
ppc/$(DEPDIR)/$(am__dirstamp)
ppc/Linit_local.lo: ppc/$(am__dirstamp) ppc/$(DEPDIR)/$(am__dirstamp)
ppc/Linit_remote.lo: ppc/$(am__dirstamp) ppc/$(DEPDIR)/$(am__dirstamp)
ppc/Lis_signal_frame.lo: ppc/$(am__dirstamp) \
ppc/$(DEPDIR)/$(am__dirstamp)
dwarf/Lfind_proc_info-lsb.lo: dwarf/$(am__dirstamp) \
dwarf/$(DEPDIR)/$(am__dirstamp)
ppc64/Lcreate_addr_space.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Lget_save_loc.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Lglobal.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Linit.lo: ppc64/$(am__dirstamp) ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Linit_local.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Linit_remote.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Lis_signal_frame.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Lget_proc_info.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Lregs.lo: ppc64/$(am__dirstamp) ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Lresume.lo: ppc64/$(am__dirstamp) \
ppc64/$(DEPDIR)/$(am__dirstamp)
ppc64/Lstep.lo: ppc64/$(am__dirstamp) ppc64/$(DEPDIR)/$(am__dirstamp)
ppc32/Lglobal.lo: ppc32/$(am__dirstamp) \
ppc32/$(DEPDIR)/$(am__dirstamp)
ppc32/Linit.lo: ppc32/$(am__dirstamp) ppc32/$(DEPDIR)/$(am__dirstamp)
ppc32/Lregs.lo: ppc32/$(am__dirstamp) ppc32/$(DEPDIR)/$(am__dirstamp)
ppc32/Lresume.lo: ppc32/$(am__dirstamp) \
ppc32/$(DEPDIR)/$(am__dirstamp)
ppc32/Lstep.lo: ppc32/$(am__dirstamp) ppc32/$(DEPDIR)/$(am__dirstamp)
x86_64/setcontext.lo: x86_64/$(am__dirstamp) \
x86_64/$(DEPDIR)/$(am__dirstamp)
x86_64/Lcreate_addr_space.lo: x86_64/$(am__dirstamp) \
@ -1666,44 +1779,74 @@ mostlyclean-compile:
-rm -f mi/mempool.lo
-rm -f mi/strerror.$(OBJEXT)
-rm -f mi/strerror.lo
-rm -f ppc64/Gcreate_addr_space.$(OBJEXT)
-rm -f ppc64/Gcreate_addr_space.lo
-rm -f ppc64/Gget_proc_info.$(OBJEXT)
-rm -f ppc64/Gget_proc_info.lo
-rm -f ppc64/Gget_save_loc.$(OBJEXT)
-rm -f ppc64/Gget_save_loc.lo
-rm -f ppc/Gcreate_addr_space.$(OBJEXT)
-rm -f ppc/Gcreate_addr_space.lo
-rm -f ppc/Gget_proc_info.$(OBJEXT)
-rm -f ppc/Gget_proc_info.lo
-rm -f ppc/Gget_save_loc.$(OBJEXT)
-rm -f ppc/Gget_save_loc.lo
-rm -f ppc/Ginit_local.$(OBJEXT)
-rm -f ppc/Ginit_local.lo
-rm -f ppc/Ginit_remote.$(OBJEXT)
-rm -f ppc/Ginit_remote.lo
-rm -f ppc/Gis_signal_frame.$(OBJEXT)
-rm -f ppc/Gis_signal_frame.lo
-rm -f ppc/Lcreate_addr_space.$(OBJEXT)
-rm -f ppc/Lcreate_addr_space.lo
-rm -f ppc/Lget_proc_info.$(OBJEXT)
-rm -f ppc/Lget_proc_info.lo
-rm -f ppc/Lget_save_loc.$(OBJEXT)
-rm -f ppc/Lget_save_loc.lo
-rm -f ppc/Linit_local.$(OBJEXT)
-rm -f ppc/Linit_local.lo
-rm -f ppc/Linit_remote.$(OBJEXT)
-rm -f ppc/Linit_remote.lo
-rm -f ppc/Lis_signal_frame.$(OBJEXT)
-rm -f ppc/Lis_signal_frame.lo
-rm -f ppc/longjmp.$(OBJEXT)
-rm -f ppc/longjmp.lo
-rm -f ppc/siglongjmp.$(OBJEXT)
-rm -f ppc/siglongjmp.lo
-rm -f ppc32/Gglobal.$(OBJEXT)
-rm -f ppc32/Gglobal.lo
-rm -f ppc32/Ginit.$(OBJEXT)
-rm -f ppc32/Ginit.lo
-rm -f ppc32/Gregs.$(OBJEXT)
-rm -f ppc32/Gregs.lo
-rm -f ppc32/Gresume.$(OBJEXT)
-rm -f ppc32/Gresume.lo
-rm -f ppc32/Gstep.$(OBJEXT)
-rm -f ppc32/Gstep.lo
-rm -f ppc32/Lglobal.$(OBJEXT)
-rm -f ppc32/Lglobal.lo
-rm -f ppc32/Linit.$(OBJEXT)
-rm -f ppc32/Linit.lo
-rm -f ppc32/Lregs.$(OBJEXT)
-rm -f ppc32/Lregs.lo
-rm -f ppc32/Lresume.$(OBJEXT)
-rm -f ppc32/Lresume.lo
-rm -f ppc32/Lstep.$(OBJEXT)
-rm -f ppc32/Lstep.lo
-rm -f ppc32/get_func_addr.$(OBJEXT)
-rm -f ppc32/get_func_addr.lo
-rm -f ppc32/is_fpreg.$(OBJEXT)
-rm -f ppc32/is_fpreg.lo
-rm -f ppc32/regname.$(OBJEXT)
-rm -f ppc32/regname.lo
-rm -f ppc64/Gglobal.$(OBJEXT)
-rm -f ppc64/Gglobal.lo
-rm -f ppc64/Ginit.$(OBJEXT)
-rm -f ppc64/Ginit.lo
-rm -f ppc64/Ginit_local.$(OBJEXT)
-rm -f ppc64/Ginit_local.lo
-rm -f ppc64/Ginit_remote.$(OBJEXT)
-rm -f ppc64/Ginit_remote.lo
-rm -f ppc64/Gis_signal_frame.$(OBJEXT)
-rm -f ppc64/Gis_signal_frame.lo
-rm -f ppc64/Gregs.$(OBJEXT)
-rm -f ppc64/Gregs.lo
-rm -f ppc64/Gresume.$(OBJEXT)
-rm -f ppc64/Gresume.lo
-rm -f ppc64/Gstep.$(OBJEXT)
-rm -f ppc64/Gstep.lo
-rm -f ppc64/Lcreate_addr_space.$(OBJEXT)
-rm -f ppc64/Lcreate_addr_space.lo
-rm -f ppc64/Lget_proc_info.$(OBJEXT)
-rm -f ppc64/Lget_proc_info.lo
-rm -f ppc64/Lget_save_loc.$(OBJEXT)
-rm -f ppc64/Lget_save_loc.lo
-rm -f ppc64/Lglobal.$(OBJEXT)
-rm -f ppc64/Lglobal.lo
-rm -f ppc64/Linit.$(OBJEXT)
-rm -f ppc64/Linit.lo
-rm -f ppc64/Linit_local.$(OBJEXT)
-rm -f ppc64/Linit_local.lo
-rm -f ppc64/Linit_remote.$(OBJEXT)
-rm -f ppc64/Linit_remote.lo
-rm -f ppc64/Lis_signal_frame.$(OBJEXT)
-rm -f ppc64/Lis_signal_frame.lo
-rm -f ppc64/Lregs.$(OBJEXT)
-rm -f ppc64/Lregs.lo
-rm -f ppc64/Lresume.$(OBJEXT)
@ -1714,12 +1857,8 @@ mostlyclean-compile:
-rm -f ppc64/get_func_addr.lo
-rm -f ppc64/is_fpreg.$(OBJEXT)
-rm -f ppc64/is_fpreg.lo
-rm -f ppc64/longjmp.$(OBJEXT)
-rm -f ppc64/longjmp.lo
-rm -f ppc64/regname.$(OBJEXT)
-rm -f ppc64/regname.lo
-rm -f ppc64/siglongjmp.$(OBJEXT)
-rm -f ppc64/siglongjmp.lo
-rm -f ptrace/_UPT_access_fpreg.$(OBJEXT)
-rm -f ptrace/_UPT_access_mem.$(OBJEXT)
-rm -f ptrace/_UPT_access_reg.$(OBJEXT)
@ -1989,25 +2128,38 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@mi/$(DEPDIR)/init.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@mi/$(DEPDIR)/mempool.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@mi/$(DEPDIR)/strerror.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Gcreate_addr_space.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Gget_proc_info.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Gget_save_loc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc/$(DEPDIR)/Gcreate_addr_space.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc/$(DEPDIR)/Gget_proc_info.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc/$(DEPDIR)/Gget_save_loc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc/$(DEPDIR)/Ginit_local.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc/$(DEPDIR)/Ginit_remote.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc/$(DEPDIR)/Gis_signal_frame.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc/$(DEPDIR)/Lcreate_addr_space.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc/$(DEPDIR)/Lget_proc_info.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc/$(DEPDIR)/Lget_save_loc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc/$(DEPDIR)/Linit_local.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc/$(DEPDIR)/Linit_remote.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc/$(DEPDIR)/Lis_signal_frame.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc32/$(DEPDIR)/Gglobal.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc32/$(DEPDIR)/Ginit.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc32/$(DEPDIR)/Gregs.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc32/$(DEPDIR)/Gresume.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc32/$(DEPDIR)/Gstep.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc32/$(DEPDIR)/Lglobal.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc32/$(DEPDIR)/Linit.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc32/$(DEPDIR)/Lregs.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc32/$(DEPDIR)/Lresume.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc32/$(DEPDIR)/Lstep.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc32/$(DEPDIR)/get_func_addr.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc32/$(DEPDIR)/is_fpreg.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc32/$(DEPDIR)/regname.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Gglobal.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Ginit.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Ginit_local.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Ginit_remote.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Gis_signal_frame.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Gregs.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Gresume.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Gstep.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Lcreate_addr_space.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Lget_proc_info.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Lget_save_loc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Lglobal.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Linit.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Linit_local.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Linit_remote.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Lis_signal_frame.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Lregs.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Lresume.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@ppc64/$(DEPDIR)/Lstep.Plo@am__quote@
@ -2137,6 +2289,8 @@ clean-libtool:
-rm -rf hppa/.libs hppa/_libs
-rm -rf ia64/.libs ia64/_libs
-rm -rf mi/.libs mi/_libs
-rm -rf ppc/.libs ppc/_libs
-rm -rf ppc32/.libs ppc32/_libs
-rm -rf ppc64/.libs ppc64/_libs
-rm -rf setjmp/.libs setjmp/_libs
-rm -rf unwind/.libs unwind/_libs
@ -2196,7 +2350,7 @@ distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
$(mkdir_p) $(distdir)/dwarf $(distdir)/hppa $(distdir)/ia64 $(distdir)/mi $(distdir)/ppc64 $(distdir)/ptrace $(distdir)/setjmp $(distdir)/unwind $(distdir)/x86 $(distdir)/x86_64
$(mkdir_p) $(distdir)/dwarf $(distdir)/hppa $(distdir)/ia64 $(distdir)/mi $(distdir)/ppc $(distdir)/ptrace $(distdir)/setjmp $(distdir)/unwind $(distdir)/x86 $(distdir)/x86_64
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
@ -2260,6 +2414,10 @@ distclean-generic:
-rm -f ia64/$(am__dirstamp)
-rm -f mi/$(DEPDIR)/$(am__dirstamp)
-rm -f mi/$(am__dirstamp)
-rm -f ppc/$(DEPDIR)/$(am__dirstamp)
-rm -f ppc/$(am__dirstamp)
-rm -f ppc32/$(DEPDIR)/$(am__dirstamp)
-rm -f ppc32/$(am__dirstamp)
-rm -f ppc64/$(DEPDIR)/$(am__dirstamp)
-rm -f ppc64/$(am__dirstamp)
-rm -f ptrace/$(DEPDIR)/$(am__dirstamp)
@ -2283,7 +2441,7 @@ clean-am: clean-generic clean-libLIBRARIES clean-libLTLIBRARIES \
clean-libtool clean-noinstPROGRAMS mostlyclean-am
distclean: distclean-am
-rm -rf ./$(DEPDIR) dwarf/$(DEPDIR) hppa/$(DEPDIR) ia64/$(DEPDIR) mi/$(DEPDIR) ppc64/$(DEPDIR) ptrace/$(DEPDIR) setjmp/$(DEPDIR) unwind/$(DEPDIR) x86/$(DEPDIR) x86_64/$(DEPDIR)
-rm -rf ./$(DEPDIR) dwarf/$(DEPDIR) hppa/$(DEPDIR) ia64/$(DEPDIR) mi/$(DEPDIR) ppc/$(DEPDIR) ppc32/$(DEPDIR) ppc64/$(DEPDIR) ptrace/$(DEPDIR) setjmp/$(DEPDIR) unwind/$(DEPDIR) x86/$(DEPDIR) x86_64/$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-libtool distclean-tags
@ -2311,7 +2469,7 @@ install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -rf ./$(DEPDIR) dwarf/$(DEPDIR) hppa/$(DEPDIR) ia64/$(DEPDIR) mi/$(DEPDIR) ppc64/$(DEPDIR) ptrace/$(DEPDIR) setjmp/$(DEPDIR) unwind/$(DEPDIR) x86/$(DEPDIR) x86_64/$(DEPDIR)
-rm -rf ./$(DEPDIR) dwarf/$(DEPDIR) hppa/$(DEPDIR) ia64/$(DEPDIR) mi/$(DEPDIR) ppc/$(DEPDIR) ppc32/$(DEPDIR) ppc64/$(DEPDIR) ptrace/$(DEPDIR) setjmp/$(DEPDIR) unwind/$(DEPDIR) x86/$(DEPDIR) x86_64/$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic

View file

@ -27,7 +27,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include <stdlib.h>
#include "unwind_i.h"
#include <libunwind_i.h>
PROTECTED unw_addr_space_t
unw_create_addr_space (unw_accessors_t *a, int byte_order)

View file

@ -24,7 +24,7 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "unwind_i.h"
#include <libunwind_i.h>
PROTECTED int
unw_get_proc_info (unw_cursor_t *cursor, unw_proc_info_t *pi)

View file

@ -24,7 +24,7 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "unwind_i.h"
#include <libunwind_i.h>
PROTECTED int
unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)

View file

@ -24,8 +24,13 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "unwind_i.h"
#include "init.h"
#include <libunwind_i.h>
#ifdef UNW_TARGET_PPC64
#include "../ppc64/init.h"
#else
#include "../ppc32/init.h"
#endif
#ifdef UNW_REMOTE_ONLY
@ -50,7 +55,11 @@ unw_init_local (unw_cursor_t *cursor, ucontext_t *uc)
c->dwarf.as = unw_local_addr_space;
c->dwarf.as_arg = uc;
return common_init (c);
#ifdef UNW_TARGET_PPC64
return common_init_ppc64 (c);
#else
return common_init_ppc32 (c);
#endif
}
#endif /* !UNW_REMOTE_ONLY */

View file

@ -25,8 +25,13 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "init.h"
#include "unwind_i.h"
#include <libunwind_i.h>
#ifdef UNW_TARGET_PPC64
#include "../ppc64/init.h"
#else
#include "../ppc32/init.h"
#endif
PROTECTED int
unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
@ -43,6 +48,13 @@ unw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
c->dwarf.as = as;
c->dwarf.as_arg = as_arg;
return common_init (c);
#ifdef UNW_TARGET_PPC64
return common_init_ppc64(c);
#elif UNW_TARGET_PPC32
return common_init_ppc32 (c);
#else
#error init_remote :: NO VALID PPC ARCH!
#endif
#endif /* !UNW_LOCAL_ONLY */
}

View file

@ -25,7 +25,7 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "unwind_i.h"
#include <libunwind_i.h>
PROTECTED int
unw_is_signal_frame (unw_cursor_t * cursor)

150
src/ppc32/Gglobal.c Normal file
View file

@ -0,0 +1,150 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "unwind_i.h"
#include "dwarf_i.h"
HIDDEN pthread_mutex_t ppc32_lock = PTHREAD_MUTEX_INITIALIZER;
HIDDEN int tdep_needs_initialization = 1;
/* The API register numbers are exactly the same as the .eh_frame
registers, for now at least. */
uint8_t dwarf_to_unw_regnum_map[DWARF_REGNUM_MAP_LENGTH] =
{
[UNW_PPC32_R0]=UNW_PPC32_R0,
[UNW_PPC32_R1]=UNW_PPC32_R1,
[UNW_PPC32_R2]=UNW_PPC32_R2,
[UNW_PPC32_R3]=UNW_PPC32_R3,
[UNW_PPC32_R4]=UNW_PPC32_R4,
[UNW_PPC32_R5]=UNW_PPC32_R5,
[UNW_PPC32_R6]=UNW_PPC32_R6,
[UNW_PPC32_R7]=UNW_PPC32_R7,
[UNW_PPC32_R8]=UNW_PPC32_R8,
[UNW_PPC32_R9]=UNW_PPC32_R9,
[UNW_PPC32_R10]=UNW_PPC32_R10,
[UNW_PPC32_R11]=UNW_PPC32_R11,
[UNW_PPC32_R12]=UNW_PPC32_R12,
[UNW_PPC32_R13]=UNW_PPC32_R13,
[UNW_PPC32_R14]=UNW_PPC32_R14,
[UNW_PPC32_R15]=UNW_PPC32_R15,
[UNW_PPC32_R16]=UNW_PPC32_R16,
[UNW_PPC32_R17]=UNW_PPC32_R17,
[UNW_PPC32_R18]=UNW_PPC32_R18,
[UNW_PPC32_R19]=UNW_PPC32_R19,
[UNW_PPC32_R20]=UNW_PPC32_R20,
[UNW_PPC32_R21]=UNW_PPC32_R21,
[UNW_PPC32_R22]=UNW_PPC32_R22,
[UNW_PPC32_R23]=UNW_PPC32_R23,
[UNW_PPC32_R24]=UNW_PPC32_R24,
[UNW_PPC32_R25]=UNW_PPC32_R25,
[UNW_PPC32_R26]=UNW_PPC32_R26,
[UNW_PPC32_R27]=UNW_PPC32_R27,
[UNW_PPC32_R28]=UNW_PPC32_R28,
[UNW_PPC32_R29]=UNW_PPC32_R29,
[UNW_PPC32_R30]=UNW_PPC32_R30,
[UNW_PPC32_R31]=UNW_PPC32_R31,
[UNW_PPC32_F0]=UNW_PPC32_F0,
[UNW_PPC32_F1]=UNW_PPC32_F1,
[UNW_PPC32_F2]=UNW_PPC32_F2,
[UNW_PPC32_F3]=UNW_PPC32_F3,
[UNW_PPC32_F4]=UNW_PPC32_F4,
[UNW_PPC32_F5]=UNW_PPC32_F5,
[UNW_PPC32_F6]=UNW_PPC32_F6,
[UNW_PPC32_F7]=UNW_PPC32_F7,
[UNW_PPC32_F8]=UNW_PPC32_F8,
[UNW_PPC32_F9]=UNW_PPC32_F9,
[UNW_PPC32_F10]=UNW_PPC32_F10,
[UNW_PPC32_F11]=UNW_PPC32_F11,
[UNW_PPC32_F12]=UNW_PPC32_F12,
[UNW_PPC32_F13]=UNW_PPC32_F13,
[UNW_PPC32_F14]=UNW_PPC32_F14,
[UNW_PPC32_F15]=UNW_PPC32_F15,
[UNW_PPC32_F16]=UNW_PPC32_F16,
[UNW_PPC32_F17]=UNW_PPC32_F17,
[UNW_PPC32_F18]=UNW_PPC32_F18,
[UNW_PPC32_F19]=UNW_PPC32_F19,
[UNW_PPC32_F20]=UNW_PPC32_F20,
[UNW_PPC32_F21]=UNW_PPC32_F21,
[UNW_PPC32_F22]=UNW_PPC32_F22,
[UNW_PPC32_F23]=UNW_PPC32_F23,
[UNW_PPC32_F24]=UNW_PPC32_F24,
[UNW_PPC32_F25]=UNW_PPC32_F25,
[UNW_PPC32_F26]=UNW_PPC32_F26,
[UNW_PPC32_F27]=UNW_PPC32_F27,
[UNW_PPC32_F28]=UNW_PPC32_F28,
[UNW_PPC32_F29]=UNW_PPC32_F29,
[UNW_PPC32_F30]=UNW_PPC32_F30,
[UNW_PPC32_F31]=UNW_PPC32_F31,
[UNW_PPC32_LR]=UNW_PPC32_LR,
[UNW_PPC32_CTR]=UNW_PPC32_CTR,
[UNW_PPC32_ARG_POINTER]=UNW_PPC32_ARG_POINTER,
[UNW_PPC32_CR0]=UNW_PPC32_CR0,
[UNW_PPC32_CR1]=UNW_PPC32_CR1,
[UNW_PPC32_CR2]=UNW_PPC32_CR2,
[UNW_PPC32_CR3]=UNW_PPC32_CR3,
[UNW_PPC32_CR4]=UNW_PPC32_CR4,
[UNW_PPC32_CR5]=UNW_PPC32_CR5,
[UNW_PPC32_CR6]=UNW_PPC32_CR6,
[UNW_PPC32_CR7]=UNW_PPC32_CR7,
[UNW_PPC32_XER]=UNW_PPC32_XER,
[UNW_PPC32_VRSAVE]=UNW_PPC32_VRSAVE,
[UNW_PPC32_VSCR]=UNW_PPC32_VSCR,
[UNW_PPC32_SPE_ACC]=UNW_PPC32_SPE_ACC,
[UNW_PPC32_SPEFSCR]=UNW_PPC32_SPEFSCR,
};
HIDDEN void
tdep_init (void)
{
intrmask_t saved_mask;
sigfillset (&unwi_full_mask);
sigprocmask (SIG_SETMASK, &unwi_full_mask, &saved_mask);
mutex_lock (&ppc32_lock);
{
if (!tdep_needs_initialization)
/* another thread else beat us to it... */
goto out;
mi_init ();
dwarf_init ();
#ifndef UNW_REMOTE_ONLY
ppc32_local_addr_space_init ();
#endif
tdep_needs_initialization = 0; /* signal that we're initialized... */
}
out:
mutex_unlock (&ppc32_lock);
sigprocmask (SIG_SETMASK, &saved_mask, NULL);
}

221
src/ppc32/Ginit.c Normal file
View file

@ -0,0 +1,221 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include <stdlib.h>
#include <string.h>
#include "ucontext_i.h"
#include "unwind_i.h"
#ifdef UNW_REMOTE_ONLY
/* unw_local_addr_space is a NULL pointer in this case. */
PROTECTED unw_addr_space_t unw_local_addr_space;
#else /* !UNW_REMOTE_ONLY */
static struct unw_addr_space local_addr_space;
PROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
#define PAGE_SIZE 4096
#define PAGE_START(a) ((a) & ~(PAGE_SIZE-1))
static void *
uc_addr (ucontext_t *uc, int reg)
{
void *addr;
if ((unsigned) (reg - UNW_PPC32_R0) < 32)
addr = &uc->uc_mcontext.uc_regs->gregs[reg - UNW_PPC32_R0];
else if ((unsigned) (reg - UNW_PPC32_F0) < 32)
addr = &uc->uc_mcontext.uc_regs->fpregs.fpregs[reg - UNW_PPC32_F0];
else
{
unsigned gregs_idx;
switch (reg)
{
case UNW_PPC32_NIP:
gregs_idx = NIP_IDX;
break;
case UNW_PPC32_CTR:
gregs_idx = CTR_IDX;
break;
case UNW_PPC32_LR:
gregs_idx = LINK_IDX;
break;
case UNW_PPC32_XER:
gregs_idx = XER_IDX;
break;
case UNW_PPC32_CR0:
gregs_idx = CCR_IDX;
break;
default:
return NULL;
}
addr = &uc->uc_mcontext.uc_regs->gregs[gregs_idx];
}
return addr;
}
# ifdef UNW_LOCAL_ONLY
HIDDEN void *
tdep_uc_addr (ucontext_t *uc, int reg)
{
return uc_addr (uc, reg);
}
# endif /* UNW_LOCAL_ONLY */
HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
static void
put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
{
/* it's a no-op */
}
static int
get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
void *arg)
{
*dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
return 0;
}
static int
access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
void *arg)
{
if (write)
{
Debug (12, "mem[%lx] <- %lx\n", addr, *val);
*(unw_word_t *) addr = *val;
}
else
{
*val = *(unw_word_t *) addr;
Debug (12, "mem[%lx] -> %lx\n", addr, *val);
}
return 0;
}
static int
access_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
int write, void *arg)
{
unw_word_t *addr;
ucontext_t *uc = arg;
if ((unsigned int) (reg - UNW_PPC32_F0) < 32)
goto badreg;
addr = uc_addr (uc, reg);
if (!addr)
goto badreg;
if (write)
{
*(unw_word_t *) addr = *val;
Debug (12, "%s <- %lx\n", unw_regname (reg), *val);
}
else
{
*val = *(unw_word_t *) addr;
Debug (12, "%s -> %lx\n", unw_regname (reg), *val);
}
return 0;
badreg:
Debug (1, "bad register number %u\n", reg);
return -UNW_EBADREG;
}
static int
access_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
int write, void *arg)
{
ucontext_t *uc = arg;
unw_fpreg_t *addr;
if ((unsigned) (reg - UNW_PPC32_F0) < 0)
goto badreg;
addr = uc_addr (uc, reg);
if (!addr)
goto badreg;
if (write)
{
Debug (12, "%s <- %016Lf\n", unw_regname (reg), *val);
*(unw_fpreg_t *) addr = *val;
}
else
{
*val = *(unw_fpreg_t *) addr;
Debug (12, "%s -> %016Lf\n", unw_regname (reg), *val);
}
return 0;
badreg:
Debug (1, "bad register number %u\n", reg);
/* attempt to access a non-preserved register */
return -UNW_EBADREG;
}
static int
get_static_proc_name (unw_addr_space_t as, unw_word_t ip,
char *buf, size_t buf_len, unw_word_t *offp,
void *arg)
{
return _Uelf32_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
}
HIDDEN void
ppc32_local_addr_space_init (void)
{
memset (&local_addr_space, 0, sizeof (local_addr_space));
local_addr_space.caching_policy = UNW_CACHE_GLOBAL;
local_addr_space.acc.find_proc_info = dwarf_find_proc_info;
local_addr_space.acc.put_unwind_info = put_unwind_info;
local_addr_space.acc.get_dyn_info_list_addr = get_dyn_info_list_addr;
local_addr_space.acc.access_mem = access_mem;
local_addr_space.acc.access_reg = access_reg;
local_addr_space.acc.access_fpreg = access_fpreg;
local_addr_space.acc.resume = ppc32_local_resume;
local_addr_space.acc.get_proc_name = get_static_proc_name;
unw_flush_cache (&local_addr_space, 0, 0);
}
#endif /* !UNW_REMOTE_ONLY */

90
src/ppc32/Gregs.c Normal file
View file

@ -0,0 +1,90 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "unwind_i.h"
HIDDEN int
tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
int write)
{
struct dwarf_loc loc;
switch (reg)
{
case UNW_TDEP_IP:
if (write)
{
c->dwarf.ip = *valp; /* update the IP cache */
if (c->dwarf.pi_valid && (*valp < c->dwarf.pi.start_ip
|| *valp >= c->dwarf.pi.end_ip))
c->dwarf.pi_valid = 0; /* new IP outside of current proc */
}
else
*valp = c->dwarf.ip;
return 0;
case UNW_TDEP_SP:
if (write)
return -UNW_EREADONLYREG;
*valp = c->dwarf.cfa;
return 0;
default:
break;
}
/* make sure it's not an FP or VR register */
if ((((unsigned) (reg - UNW_PPC32_F0)) <= 31))
return -UNW_EBADREG;
loc = c->dwarf.loc[reg];
if (write)
return dwarf_put (&c->dwarf, loc, *valp);
else
return dwarf_get (&c->dwarf, loc, valp);
}
HIDDEN int
tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp,
int write)
{
struct dwarf_loc loc;
if ((unsigned) (reg - UNW_PPC32_F0) < 32)
{
loc = c->dwarf.loc[reg];
if (write)
return dwarf_putfp (&c->dwarf, loc, *valp);
else
return dwarf_getfp (&c->dwarf, loc, valp);
}
return -UNW_EBADREG;
}

77
src/ppc32/Gresume.c Normal file
View file

@ -0,0 +1,77 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford cjashfor@us.ibm.com
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include <stdlib.h>
#include "unwind_i.h"
#ifndef UNW_REMOTE_ONLY
#include <sys/syscall.h>
/* sigreturn() is a no-op on x86_64 glibc. */
static NORETURN inline long
my_rt_sigreturn (void *new_sp)
{
/* XXX: empty stub. */
abort ();
}
HIDDEN inline int
ppc32_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
{
/* XXX: empty stub. */
return -UNW_EINVAL;
}
#endif /* !UNW_REMOTE_ONLY */
/* This routine is responsible for copying the register values in
cursor C and establishing them as the current machine state. */
static inline int
establish_machine_state (struct cursor *c)
{
/* XXX: empty stub. */
return 0;
}
PROTECTED int
unw_resume (unw_cursor_t *cursor)
{
struct cursor *c = (struct cursor *) cursor;
int ret;
Debug (1, "(cursor=%p)\n", c);
if ((ret = establish_machine_state (c)) < 0)
return ret;
return (*c->dwarf.as->acc.resume) (c->dwarf.as, (unw_cursor_t *) c,
c->dwarf.as_arg);
}

317
src/ppc32/Gstep.c Normal file
View file

@ -0,0 +1,317 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "unwind_i.h"
#include "ucontext_i.h"
#include <signal.h>
/* This definition originates in /usr/include/asm-ppc64/ptrace.h, but is
defined there only when __KERNEL__ is defined. We reproduce it here for
our use at the user level in order to locate the ucontext record, which
appears to be at this offset relative to the stack pointer when in the
context of the signal handler return trampoline code -
__kernel_sigtramp_rt64. */
#define __SIGNAL_FRAMESIZE 128
/* This definition comes from the document "64-bit PowerPC ELF Application
Binary Interface Supplement 1.9", section 3.2.2.
http://www.linux-foundation.org/spec/ELF/ppc64/PPC-elf64abi-1.9.html#STACK */
typedef struct
{
long unsigned back_chain;
long unsigned cr_save;
long unsigned lr_save;
/* many more fields here, but they are unused by this code */
} stack_frame_t;
PROTECTED int
unw_step (unw_cursor_t * cursor)
{
struct cursor *c = (struct cursor *) cursor;
stack_frame_t dummy;
unw_word_t back_chain_offset, lr_save_offset, v_regs_ptr;
struct dwarf_loc back_chain_loc, lr_save_loc, sp_loc, ip_loc, v_regs_loc;
int ret;
Debug (1, "(cursor=%p, ip=0x%016lx)\n", c, (unsigned long) c->dwarf.ip);
if (c->dwarf.ip == 0)
{
/* Unless the cursor or stack is corrupt or uninitialized,
we've most likely hit the top of the stack */
return 0;
}
/* Try DWARF-based unwinding... */
ret = dwarf_step (&c->dwarf);
if (ret < 0 && ret != -UNW_ENOINFO)
{
Debug (2, "returning %d\n", ret);
return ret;
}
if (unlikely (ret < 0))
{
if (likely (!unw_is_signal_frame (cursor)))
{
/* DWARF unwinding failed. As of 09/26/2006, gcc in 64-bit mode
produces the mandatory level of traceback record in the code, but
I get the impression that this is transitory, that eventually gcc
will not produce any traceback records at all. So, for now, we
won't bother to try to find and use these records.
We can, however, attempt to unwind the frame by using the callback
chain. This is very crude, however, and won't be able to unwind
any registers besides the IP, SP, and LR . */
back_chain_offset = ((void *) &dummy.back_chain - (void *) &dummy);
lr_save_offset = ((void *) &dummy.lr_save - (void *) &dummy);
back_chain_loc = DWARF_LOC (c->dwarf.cfa + back_chain_offset, 0);
if ((ret =
dwarf_get (&c->dwarf, back_chain_loc, &c->dwarf.cfa)) < 0)
{
Debug
("Unable to retrieve CFA from back chain in stack frame - %d\n",
ret);
return ret;
}
if (c->dwarf.cfa == 0)
/* Unless the cursor or stack is corrupt or uninitialized we've most
likely hit the top of the stack */
return 0;
lr_save_loc = DWARF_LOC (c->dwarf.cfa + lr_save_offset, 0);
if ((ret = dwarf_get (&c->dwarf, lr_save_loc, &c->dwarf.ip)) < 0)
{
Debug
("Unable to retrieve IP from lr save in stack frame - %d\n",
ret);
return ret;
}
ret = 1;
}
else
{
/* Find the sigcontext record by taking the CFA and adjusting by
the dummy signal frame size.
Note that there isn't any way to determined if SA_SIGINFO was
set in the sa_flags parameter to sigaction when the signal
handler was established. If it was not set, the ucontext
record is not required to be on the stack, in which case the
following code will likely cause a seg fault or other crash
condition. */
unw_word_t ucontext = c->dwarf.cfa + __SIGNAL_FRAMESIZE;
Debug (1, "signal frame, skip over trampoline\n");
c->sigcontext_format = PPC_SCF_LINUX_RT_SIGFRAME;
c->sigcontext_addr = ucontext;
sp_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R1, 0);
ip_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_NIP, 0);
ret = dwarf_get (&c->dwarf, sp_loc, &c->dwarf.cfa);
if (ret < 0)
{
Debug (2, "returning %d\n", ret);
return ret;
}
ret = dwarf_get (&c->dwarf, ip_loc, &c->dwarf.ip);
if (ret < 0)
{
Debug (2, "returning %d\n", ret);
return ret;
}
/* Instead of just restoring the non-volatile registers, do all
of the registers for now. This will incur a performance hit,
but it's rare enough not to cause too much of a problem, and
might be useful in some cases. */
c->dwarf.loc[UNW_PPC32_R0] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R0, 0);
c->dwarf.loc[UNW_PPC32_R1] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R1, 0);
c->dwarf.loc[UNW_PPC32_R2] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R2, 0);
c->dwarf.loc[UNW_PPC32_R3] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R3, 0);
c->dwarf.loc[UNW_PPC32_R4] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R4, 0);
c->dwarf.loc[UNW_PPC32_R5] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R5, 0);
c->dwarf.loc[UNW_PPC32_R6] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R6, 0);
c->dwarf.loc[UNW_PPC32_R7] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R7, 0);
c->dwarf.loc[UNW_PPC32_R8] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R8, 0);
c->dwarf.loc[UNW_PPC32_R9] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R9, 0);
c->dwarf.loc[UNW_PPC32_R10] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R10, 0);
c->dwarf.loc[UNW_PPC32_R11] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R11, 0);
c->dwarf.loc[UNW_PPC32_R12] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R12, 0);
c->dwarf.loc[UNW_PPC32_R13] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R13, 0);
c->dwarf.loc[UNW_PPC32_R14] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R14, 0);
c->dwarf.loc[UNW_PPC32_R15] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R15, 0);
c->dwarf.loc[UNW_PPC32_R16] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R16, 0);
c->dwarf.loc[UNW_PPC32_R17] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R17, 0);
c->dwarf.loc[UNW_PPC32_R18] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R18, 0);
c->dwarf.loc[UNW_PPC32_R19] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R19, 0);
c->dwarf.loc[UNW_PPC32_R20] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R20, 0);
c->dwarf.loc[UNW_PPC32_R21] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R21, 0);
c->dwarf.loc[UNW_PPC32_R22] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R22, 0);
c->dwarf.loc[UNW_PPC32_R23] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R23, 0);
c->dwarf.loc[UNW_PPC32_R24] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R24, 0);
c->dwarf.loc[UNW_PPC32_R25] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R25, 0);
c->dwarf.loc[UNW_PPC32_R26] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R26, 0);
c->dwarf.loc[UNW_PPC32_R27] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R27, 0);
c->dwarf.loc[UNW_PPC32_R28] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R28, 0);
c->dwarf.loc[UNW_PPC32_R29] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R29, 0);
c->dwarf.loc[UNW_PPC32_R30] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R30, 0);
c->dwarf.loc[UNW_PPC32_R31] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R31, 0);
c->dwarf.loc[UNW_PPC32_LR] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_LINK, 0);
c->dwarf.loc[UNW_PPC32_CTR] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_CTR, 0);
/* This CR0 assignment is probably wrong. There are 8 dwarf columns
assigned to the CR registers, but only one CR register in the
mcontext structure */
c->dwarf.loc[UNW_PPC32_CR0] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_CCR, 0);
c->dwarf.loc[UNW_PPC32_XER] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_XER, 0);
c->dwarf.loc[UNW_PPC32_NIP] =
DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_NIP, 0);
/* TODO: Is there a way of obtaining the value of the
pseudo frame pointer (which is sp + some fixed offset, I
assume), based on the contents of the ucontext record
structure? For now, set this loc to null. */
c->dwarf.loc[UNW_PPC32_FRAME_POINTER] = DWARF_NULL_LOC;
c->dwarf.loc[UNW_PPC32_F0] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R0, 0);
c->dwarf.loc[UNW_PPC32_F1] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R1, 0);
c->dwarf.loc[UNW_PPC32_F2] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R2, 0);
c->dwarf.loc[UNW_PPC32_F3] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R3, 0);
c->dwarf.loc[UNW_PPC32_F4] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R4, 0);
c->dwarf.loc[UNW_PPC32_F5] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R5, 0);
c->dwarf.loc[UNW_PPC32_F6] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R6, 0);
c->dwarf.loc[UNW_PPC32_F7] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R7, 0);
c->dwarf.loc[UNW_PPC32_F8] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R8, 0);
c->dwarf.loc[UNW_PPC32_F9] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R9, 0);
c->dwarf.loc[UNW_PPC32_F10] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R10, 0);
c->dwarf.loc[UNW_PPC32_F11] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R11, 0);
c->dwarf.loc[UNW_PPC32_F12] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R12, 0);
c->dwarf.loc[UNW_PPC32_F13] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R13, 0);
c->dwarf.loc[UNW_PPC32_F14] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R14, 0);
c->dwarf.loc[UNW_PPC32_F15] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R15, 0);
c->dwarf.loc[UNW_PPC32_F16] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R16, 0);
c->dwarf.loc[UNW_PPC32_F17] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R17, 0);
c->dwarf.loc[UNW_PPC32_F18] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R18, 0);
c->dwarf.loc[UNW_PPC32_F19] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R19, 0);
c->dwarf.loc[UNW_PPC32_F20] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R20, 0);
c->dwarf.loc[UNW_PPC32_F21] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R21, 0);
c->dwarf.loc[UNW_PPC32_F22] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R22, 0);
c->dwarf.loc[UNW_PPC32_F23] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R23, 0);
c->dwarf.loc[UNW_PPC32_F24] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R24, 0);
c->dwarf.loc[UNW_PPC32_F25] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R25, 0);
c->dwarf.loc[UNW_PPC32_F26] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R26, 0);
c->dwarf.loc[UNW_PPC32_F27] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R27, 0);
c->dwarf.loc[UNW_PPC32_F28] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R28, 0);
c->dwarf.loc[UNW_PPC32_F29] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R29, 0);
c->dwarf.loc[UNW_PPC32_F30] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R30, 0);
c->dwarf.loc[UNW_PPC32_F31] =
DWARF_LOC (ucontext + UC_MCONTEXT_FREGS_R31, 0);
ret = 1;
}
}
return ret;
}

5
src/ppc32/Lglobal.c Normal file
View file

@ -0,0 +1,5 @@
#define UNW_LOCAL_ONLY
#include <libunwind.h>
#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
#include "Gglobal.c"
#endif

5
src/ppc32/Linit.c Normal file
View file

@ -0,0 +1,5 @@
#define UNW_LOCAL_ONLY
#include <libunwind.h>
#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
#include "Ginit.c"
#endif

5
src/ppc32/Lregs.c Normal file
View file

@ -0,0 +1,5 @@
#define UNW_LOCAL_ONLY
#include <libunwind.h>
#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
#include "Gregs.c"
#endif

5
src/ppc32/Lresume.c Normal file
View file

@ -0,0 +1,5 @@
#define UNW_LOCAL_ONLY
#include <libunwind.h>
#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
#include "Gresume.c"
#endif

5
src/ppc32/Lstep.c Normal file
View file

@ -0,0 +1,5 @@
#define UNW_LOCAL_ONLY
#include <libunwind.h>
#if defined(UNW_LOCAL_ONLY) && !defined(UNW_REMOTE_ONLY)
#include "Gstep.c"
#endif

45
src/ppc32/get_func_addr.c Normal file
View file

@ -0,0 +1,45 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "unwind_i.h"
int
tdep_get_func_addr (unw_addr_space_t as, unw_word_t addr,
unw_word_t *entry_point)
{
unw_accessors_t *a;
int ret;
a = unw_get_accessors (as);
/* Entry-point is stored in the 1st word of the function descriptor.
In case that changes in the future, we'd have to update the line
below and read the word at addr + offset: */
ret = (*a->access_mem) (as, addr, entry_point, 0, NULL);
if (ret < 0)
return ret;
return 0;
}

80
src/ppc32/init.h Normal file
View file

@ -0,0 +1,80 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "unwind_i.h"
/* Here is the "common" init, for remote and local debuging" */
static inline int
common_init_ppc32 (struct cursor *c)
{
int ret;
int i;
for (i = UNW_PPC32_R0; i <= UNW_PPC32_R31; i++) {
c->dwarf.loc[i] = DWARF_REG_LOC (&c->dwarf, i);
}
for (i = UNW_PPC32_F0; i <= UNW_PPC32_F31; i++) {
c->dwarf.loc[i] = DWARF_FPREG_LOC (&c->dwarf, i);
}
for (i = UNW_PPC32_CR0; i <= UNW_PPC32_CR7; i++) {
c->dwarf.loc[i] = DWARF_REG_LOC (&c->dwarf, i);
}
c->dwarf.loc[UNW_PPC32_ARG_POINTER] = DWARF_REG_LOC (&c->dwarf, UNW_PPC32_ARG_POINTER);
c->dwarf.loc[UNW_PPC32_CTR] = DWARF_REG_LOC (&c->dwarf, UNW_PPC32_CTR);
c->dwarf.loc[UNW_PPC32_VSCR] = DWARF_REG_LOC (&c->dwarf, UNW_PPC32_VSCR);
c->dwarf.loc[UNW_PPC32_XER] = DWARF_REG_LOC (&c->dwarf, UNW_PPC32_XER);
c->dwarf.loc[UNW_PPC32_LR] = DWARF_REG_LOC (&c->dwarf, UNW_PPC32_LR);
c->dwarf.loc[UNW_PPC32_VRSAVE] = DWARF_REG_LOC (&c->dwarf, UNW_PPC32_VRSAVE);
c->dwarf.loc[UNW_PPC32_SPEFSCR] = DWARF_REG_LOC (&c->dwarf, UNW_PPC32_SPEFSCR);
c->dwarf.loc[UNW_PPC32_SPE_ACC] = DWARF_REG_LOC (&c->dwarf, UNW_PPC32_SPE_ACC);
c->dwarf.loc[UNW_PPC32_NIP] = DWARF_REG_LOC (&c->dwarf, UNW_PPC32_NIP);
ret = dwarf_get (&c->dwarf, c->dwarf.loc[UNW_PPC32_NIP], &c->dwarf.ip);
if (ret < 0)
return ret;
ret = dwarf_get (&c->dwarf, DWARF_REG_LOC (&c->dwarf, UNW_PPC32_R1),
&c->dwarf.cfa);
if (ret < 0)
return ret;
c->sigcontext_format = PPC_SCF_NONE;
c->sigcontext_addr = 0;
c->dwarf.args_size = 0;
c->dwarf.ret_addr_column = 0;
c->dwarf.pi_valid = 0;
c->dwarf.pi_is_dynamic = 0;
c->dwarf.hint = 0;
c->dwarf.prev_rs = 0;
return 0;
}

34
src/ppc32/is_fpreg.c Normal file
View file

@ -0,0 +1,34 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "libunwind_i.h"
PROTECTED int
unw_is_fpreg (int regnum)
{
return (regnum >= UNW_PPC32_F0 && regnum <= UNW_PPC32_F31);
}

128
src/ppc32/regname.c Normal file
View file

@ -0,0 +1,128 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "unwind_i.h"
static const char *regname[] =
{
[UNW_PPC32_R0]="GPR0",
[UNW_PPC32_R1]="GPR1",
[UNW_PPC32_R2]="GPR2",
[UNW_PPC32_R3]="GPR3",
[UNW_PPC32_R4]="GPR4",
[UNW_PPC32_R5]="GPR5",
[UNW_PPC32_R6]="GPR6",
[UNW_PPC32_R7]="GPR7",
[UNW_PPC32_R8]="GPR8",
[UNW_PPC32_R9]="GPR9",
[UNW_PPC32_R10]="GPR10",
[UNW_PPC32_R11]="GPR11",
[UNW_PPC32_R12]="GPR12",
[UNW_PPC32_R13]="GPR13",
[UNW_PPC32_R14]="GPR14",
[UNW_PPC32_R15]="GPR15",
[UNW_PPC32_R16]="GPR16",
[UNW_PPC32_R17]="GPR17",
[UNW_PPC32_R18]="GPR18",
[UNW_PPC32_R19]="GPR19",
[UNW_PPC32_R20]="GPR20",
[UNW_PPC32_R21]="GPR21",
[UNW_PPC32_R22]="GPR22",
[UNW_PPC32_R23]="GPR23",
[UNW_PPC32_R24]="GPR24",
[UNW_PPC32_R25]="GPR25",
[UNW_PPC32_R26]="GPR26",
[UNW_PPC32_R27]="GPR27",
[UNW_PPC32_R28]="GPR28",
[UNW_PPC32_R29]="GPR29",
[UNW_PPC32_R30]="GPR30",
[UNW_PPC32_R31]="GPR31",
[UNW_PPC32_F0]="FPR0",
[UNW_PPC32_F1]="FPR1",
[UNW_PPC32_F2]="FPR2",
[UNW_PPC32_F3]="FPR3",
[UNW_PPC32_F4]="FPR4",
[UNW_PPC32_F5]="FPR5",
[UNW_PPC32_F6]="FPR6",
[UNW_PPC32_F7]="FPR7",
[UNW_PPC32_F8]="FPR8",
[UNW_PPC32_F9]="FPR9",
[UNW_PPC32_F10]="FPR10",
[UNW_PPC32_F11]="FPR11",
[UNW_PPC32_F12]="FPR12",
[UNW_PPC32_F13]="FPR13",
[UNW_PPC32_F14]="FPR14",
[UNW_PPC32_F15]="FPR15",
[UNW_PPC32_F16]="FPR16",
[UNW_PPC32_F17]="FPR17",
[UNW_PPC32_F18]="FPR18",
[UNW_PPC32_F19]="FPR19",
[UNW_PPC32_F20]="FPR20",
[UNW_PPC32_F21]="FPR21",
[UNW_PPC32_F22]="FPR22",
[UNW_PPC32_F23]="FPR23",
[UNW_PPC32_F24]="FPR24",
[UNW_PPC32_F25]="FPR25",
[UNW_PPC32_F26]="FPR26",
[UNW_PPC32_F27]="FPR27",
[UNW_PPC32_F28]="FPR28",
[UNW_PPC32_F29]="FPR29",
[UNW_PPC32_F30]="FPR30",
[UNW_PPC32_F31]="FPR31",
[UNW_PPC32_LR]="LR",
[UNW_PPC32_CTR]="CTR",
[UNW_PPC32_ARG_POINTER]="ARG_POINTER",
[UNW_PPC32_CR0]="CR0",
[UNW_PPC32_CR1]="CR1",
[UNW_PPC32_CR2]="CR2",
[UNW_PPC32_CR3]="CR3",
[UNW_PPC32_CR4]="CR4",
[UNW_PPC32_CR5]="CR5",
[UNW_PPC32_CR6]="CR6",
[UNW_PPC32_CR7]="CR7",
[UNW_PPC32_XER]="XER",
[UNW_PPC32_VSCR]="VSCR",
[UNW_PPC32_VRSAVE]="VRSAVE",
[UNW_PPC32_SPE_ACC]="SPE_ACC",
[UNW_PPC32_SPEFSCR]="SPEFSCR",
};
PROTECTED const char *
unw_regname (unw_regnum_t reg)
{
if (reg < (unw_regnum_t) ARRAY_SIZE (regname))
return regname[reg];
else
return "???";
}

4
src/ppc32/setcontext.S Normal file
View file

@ -0,0 +1,4 @@
.global _UI_setcontext
_UI_setcontext:
retq

173
src/ppc32/ucontext_i.h Normal file
View file

@ -0,0 +1,173 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#ifndef ucontext_i_h
#define ucontext_i_h
#include <ucontext.h>
/* These values were derived by reading
/usr/src/linux-2.6.18-1.8/arch/um/include/sysdep-ppc/ptrace.h and
/usr/src/linux-2.6.18-1.8/arch/powerpc/kernel/ppc32.h
*/
#define NIP_IDX 32
#define MSR_IDX 33
#define ORIG_GPR3_IDX 34
#define CTR_IDX 35
#define LINK_IDX 36
#define XER_IDX 37
#define CCR_IDX 38
#define SOFTE_IDX 39
#define TRAP_IDX 40
#define DAR_IDX 41
#define DSISR_IDX 42
#define RESULT_IDX 43
#define VSCR_IDX 32
#define VRSAVE_IDX 33
/* These are dummy structures used only for obtaining the offsets of the
various structure members. */
static ucontext_t dmy_ctxt;
static vrregset_t dmy_vrregset;
#define UC_MCONTEXT_GREGS_R0 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[0] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R1 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[1] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R2 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[2] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R3 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[3] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R4 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[4] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R5 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[5] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R6 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[6] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R7 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[7] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R8 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[8] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R9 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[9] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R10 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[10] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R11 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[11] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R12 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[12] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R13 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[13] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R14 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[14] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R15 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[15] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R16 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[16] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R17 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[17] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R18 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[18] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R19 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[19] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R20 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[20] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R21 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[21] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R22 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[22] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R23 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[23] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R24 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[24] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R25 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[25] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R26 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[26] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R27 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[27] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R28 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[28] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R29 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[29] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R30 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[30] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_R31 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[31] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_NIP ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[NIP_IDX] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_MSR ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[MSR_IDX] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_ORIG_GPR3 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[ORIG_GPR3_IDX] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_CTR ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[CTR_IDX] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_LINK ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[LINK_IDX] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_XER ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[XER_IDX] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_CCR ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[CCR_IDX] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_SOFTE ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[SOFTE_IDX] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_TRAP ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[TRAP_IDX] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_DAR ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[DAR_IDX] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_DSISR ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[DSISR_IDX] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_GREGS_RESULT ((void *)&dmy_ctxt.uc_mcontext.uc_regs->gregs[RESULT_IDX] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R0 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[0] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R1 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[1] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R2 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[2] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R3 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[3] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R4 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[4] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R5 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[5] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R6 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[6] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R7 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[7] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R8 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[8] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R9 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[9] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R10 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[10] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R11 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[11] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R12 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[12] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R13 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[13] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R14 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[14] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R15 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[15] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R16 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[16] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R17 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[17] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R18 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[18] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R19 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[19] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R20 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[20] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R21 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[21] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R22 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[22] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R23 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[23] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R24 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[24] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R25 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[25] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R26 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[26] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R27 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[27] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R28 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[28] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R29 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[29] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R30 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[30] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_R31 ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[31] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_FREGS_FPSCR ((void *)&dmy_ctxt.uc_mcontext.uc_regs->fpregs.fpregs[32] - (void *)&dmy_ctxt)
#define UC_MCONTEXT_V_REGS ((void *)&dmy_ctxt.uc_mcontext.v_regs - (void *)&dmy_ctxt)
#define UC_MCONTEXT_VREGS_R0 ((void *)&dmy_vrregset.vrregs[0] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R1 ((void *)&dmy_vrregset.vrregs[1] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R2 ((void *)&dmy_vrregset.vrregs[2] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R3 ((void *)&dmy_vrregset.vrregs[3] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R4 ((void *)&dmy_vrregset.vrregs[4] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R5 ((void *)&dmy_vrregset.vrregs[5] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R6 ((void *)&dmy_vrregset.vrregs[6] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R7 ((void *)&dmy_vrregset.vrregs[7] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R8 ((void *)&dmy_vrregset.vrregs[8] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R9 ((void *)&dmy_vrregset.vrregs[9] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R10 ((void *)&dmy_vrregset.vrregs[10] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R11 ((void *)&dmy_vrregset.vrregs[11] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R12 ((void *)&dmy_vrregset.vrregs[12] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R13 ((void *)&dmy_vrregset.vrregs[13] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R14 ((void *)&dmy_vrregset.vrregs[14] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R15 ((void *)&dmy_vrregset.vrregs[15] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R16 ((void *)&dmy_vrregset.vrregs[16] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R17 ((void *)&dmy_vrregset.vrregs[17] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R18 ((void *)&dmy_vrregset.vrregs[18] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R19 ((void *)&dmy_vrregset.vrregs[19] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R20 ((void *)&dmy_vrregset.vrregs[20] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R21 ((void *)&dmy_vrregset.vrregs[21] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R22 ((void *)&dmy_vrregset.vrregs[22] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R23 ((void *)&dmy_vrregset.vrregs[23] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R24 ((void *)&dmy_vrregset.vrregs[24] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R25 ((void *)&dmy_vrregset.vrregs[25] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R26 ((void *)&dmy_vrregset.vrregs[26] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R27 ((void *)&dmy_vrregset.vrregs[27] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R28 ((void *)&dmy_vrregset.vrregs[28] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R29 ((void *)&dmy_vrregset.vrregs[29] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R30 ((void *)&dmy_vrregset.vrregs[30] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_R31 ((void *)&dmy_vrregset.vrregs[31] - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_VSCR ((void *)&dmy_vrregset.vscr - (void *)&dmy_vrregset)
#define UC_MCONTEXT_VREGS_VRSAVE ((void *)&dmy_vrregset.vrsave - (void *)&dmy_vrregset)
#endif

47
src/ppc32/unwind_i.h Normal file
View file

@ -0,0 +1,47 @@
/* libunwind - a platform-independent unwind library
Copyright (C) 2006-2007 IBM
Contributed by
Corey Ashford <cjashfor@us.ibm.com>
Jose Flavio Aguilar Paulino <jflavio@br.ibm.com> <joseflavio@gmail.com>
This file is part of libunwind.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#ifndef unwind_i_h
#define unwind_i_h
#include <memory.h>
#include <stdint.h>
#include <libunwind-ppc32.h>
#include <libunwind_i.h>
#include <sys/ucontext.h>
#define ppc32_lock UNW_OBJ(lock)
#define ppc32_local_resume UNW_OBJ(local_resume)
#define ppc32_local_addr_space_init UNW_OBJ(local_addr_space_init)
extern void ppc32_local_addr_space_init (void);
extern int ppc32_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
void *arg);
#endif /* unwind_i_h */

View file

@ -137,7 +137,7 @@ unw_step (unw_cursor_t * cursor)
Debug (1, "signal frame, skip over trampoline\n");
c->sigcontext_format = PPC64_SCF_LINUX_RT_SIGFRAME;
c->sigcontext_format = PPC_SCF_LINUX_RT_SIGFRAME;
c->sigcontext_addr = ucontext;
sp_loc = DWARF_LOC (ucontext + UC_MCONTEXT_GREGS_R1, 0);

View file

@ -28,7 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "unwind_i.h"
static inline int
common_init (struct cursor *c)
common_init_ppc64 (struct cursor *c)
{
int ret;
int i;
@ -67,7 +67,7 @@ common_init (struct cursor *c)
if (ret < 0)
return ret;
c->sigcontext_format = PPC64_SCF_NONE;
c->sigcontext_format = PPC_SCF_NONE;
c->sigcontext_addr = 0;
c->dwarf.args_size = 0;

View file

@ -286,6 +286,7 @@ int _UPT_reg_offset[UNW_REG_LAST + 1] =
// [UNW_X86_64_EFLAGS] = 0x90,
// [UNW_X86_64_RSP] = 0x98,
// [UNW_X86_64_SS] = 0xa0
#elif defined(UNW_TARGET_PPC32)
#elif defined(UNW_TARGET_PPC64)
#else
# error Fix me.

View file

@ -47,7 +47,17 @@ flush_cache:
bv %r0(%rp)
.procend
#elif defined(__powerpc64__)
# warning IMPLEMENT ME!!
# warning IMPLEMENT ME FOR PPC64!!
.globl flush_cache
flush_cache:
lwz 11, 0(1) ;
lwz 0, 4(11) ;
mtlr 0 ;
lwz 31, -4(11) ;
mr 1, 11 ;
blr
#elif defined(__powerpc__)
# warning IMPLEMENT ME FOR PPC32!!
.globl flush_cache
flush_cache:
lwz 11, 0(1) ;