1
0
Fork 0
mirror of https://github.com/tobast/libunwind-eh_elf.git synced 2024-07-08 08:05:34 +02:00
Commit graph

208 commits

Author SHA1 Message Date
mostang.com!davidm 7915b799c8 Drop argument names from prototypes to reduce namespace pollution.
Define libunwind routines such that it is possible to take their
addresses.

(Logical change 1.156)
2004-01-21 01:05:07 +00:00
mostang.com!davidm 64854d0d7c Drop argument names from prototypes to reduce namespace pollution.
(Logical change 1.156)
2004-01-21 01:05:07 +00:00
mostang.com!davidm 24ac6e693d (unw_tdep_is_fpreg): Define it as an external function (a macro would
have to evaluate the argument multiple times so it's better
	to implement it out-of-line).

(Logical change 1.156)
2004-01-21 01:05:07 +00:00
mostang.com!davidm 66e78e1ca3 (Logical change 1.156) 2004-01-21 01:05:07 +00:00
mostang.com!davidm cd7dcba0ed Rename AO_TS_T to AO_TS_t (gets syntax coloring right... ;-).
(Logical change 1.155)
2004-01-20 23:50:00 +00:00
mostang.com!davidm 40fcb9b7e5 (unw_addr_space.cache_generation): Declare as AO_t instead of AO_T
(gets syntax-coloring right ;-).

(Logical change 1.155)
2004-01-20 23:50:00 +00:00
mostang.com!davidm 195eb64285 (struct mempool): Move "reserve" and "num_free" next to
each other to minimize padding.

(Logical change 1.155)
2004-01-20 23:50:00 +00:00
mostang.com!davidm 82cfd4862f (cmpxchg_ptr): Use a union to do the pointer-casting so that
GCC knows it can't use ANSI-C aliasing rules.

(Logical change 1.155)
2004-01-20 23:50:00 +00:00
mostang.com!davidm c1bbbb2a3a (unwi_dyn_validate_cache): Declare.
(Logical change 1.154)
2004-01-20 23:32:28 +00:00
mostang.com!davidm 2d4098ac19 (unw): Remove debug_level.
(tdep_debug_level): Declare it as a separate variable.  This
	ensures that only one debug-level variable is in use
	at any given time, no matter what combination of
	local-only vs generic and static vs. dynamic libraries
	are in use.
(unw): Document why it's not an UNW_ARCH_OBJ().

(Logical change 1.154)
2004-01-20 23:32:28 +00:00
mostang.com!davidm 47c32cd07f (_Uia64_search_unwind_table): Make it an UNW_OBJ() instead.
(unw_search_ia64_unwind_table): Declare.

(Logical change 1.154)
2004-01-20 23:32:28 +00:00
hp.com!davidm ea78d27d97 (unwi_dyn_remote_find_proc_info): Drop GENERATION argument.
(Logical change 1.153)
2004-01-20 01:51:17 +00:00
hp.com!davidm a2301f6f57 (struct unw_addr_space.shared_object_removals) [!UNW_REMOTE_ONLY]: New member.
(Logical change 1.153)
2004-01-20 01:51:17 +00:00
hp.com!davidm 23024e28c0 Add includes of <string.h> and <unistd.h>.
(NORETURN): New macro.
(PROTECTED): Likewise.
(print_error): New inline routine.
(fetch8): Provide UNW_LOCAL_ONLY-version.
(fetch16): Likewise.
(fetch32): Likewise.
(fetchw): Likewise.
(_U_dyn_info_list_addr): Declare.

(Logical change 1.151)
2004-01-03 10:50:24 +00:00
hp.com!davidm 9b52d39425 (tdep_find_proc_info): Declare it as a regular object (not arch-obj).
(tdep_uc_addr): Likewise.
(tdep_put_unwind_info): Define only if not UNW_LOCAL_ONLY.
(unw): Declare as regular object.

(Logical change 1.151)
2004-01-03 10:50:24 +00:00
mostang.com!davidm b9d2cc7919 Drop HIDDEN from declarations, only the definitions need it.
(Logical change 1.150)
2003-12-21 07:57:42 +00:00
mostang.com!davidm aa800d423d (unw): Mark it as HIDDEN.
(Logical change 1.148)
2003-12-21 07:21:28 +00:00
mostang.com!davidm e6aedd3089 (dyn_generation): Drop bogus comment.
(Logical change 1.147)
2003-12-21 05:53:57 +00:00
mostang.com!davidm d5db6013ff (UNW_PI_FLAG_FIRST_TDEP_BIT): Fix comment.
(Logical change 1.147)
2003-12-21 05:53:57 +00:00
hp.com!davidm 468aaccf17 Switch over to DWARF-based unwinder.
(Logical change 1.146)
2003-12-20 11:50:00 +00:00
hp.com!davidm 45fccdc2f3 (unw_dyn_dwarf_fde_info_t): New type to handle (pre-parsed) DWARF
unwind-info.
(unw_dyn_info_t): Add member "dfi".

(Logical change 1.145)
2003-12-20 11:43:08 +00:00
hp.com!davidm eb51b4294a (Logical change 1.145) 2003-12-20 11:43:08 +00:00
hp.com!davidm 0bbb2fab68 Initial revision 2003-12-20 11:38:49 +00:00
hp.com!davidm b6adfb75c4 Declare mempool-routines as HIDDEN.
(Logical change 1.143)
2003-12-20 11:35:09 +00:00
hp.com!davidm 7d3de049e6 (Debug): New macro. This one automates some of usual stuff that
gets printed during debugging and is supposed to produce
	a nicer format.  Eventually, we'll switch everything over
	from debug() to Debug().
(extract_dynamic_proc_info): We need both generic and local-only.
(dyn_remote_find_proc_info): Likewise.
(dyn_remote_put_unwind_info): Likewise.

(Logical change 1.142)
2003-12-20 11:32:43 +00:00
hp.com!davidm fbe40e537f (unw_word_t): Let the architecture-specific header take care of
defining this type---it's needed very early on.
(unw_proc_info_t): Add architecture-specific "extra" member.  Empty
	for ia64, so no ABI change.
Don't include libunwind-dynamic.h here.

(Logical change 1.140)
2003-12-20 11:20:42 +00:00
hp.com!davidm 77b06d67aa (unw_word_t): Declare it here.
(unw_tdep_proc_info_t): New type.
Include "libunwind-dynamic.h" here.

(Logical change 1.140)
2003-12-20 11:20:42 +00:00
mostang.com!davidm bcdedf6b28 Switch from __sync_val_compare_and_swap() to
__sync_bool_compare_and_swap() since that's we need nowadays anyhow
and since that's also provided by ecc v7.0.

(Logical change 1.138)
2003-12-05 06:42:28 +00:00
hp.com!davidm ab0fdbbb4c (Logical change 1.135) 2003-12-04 07:44:21 +00:00
hp.com!davidm 1a7d4ee7ed Initial revision 2003-12-04 07:44:21 +00:00
hp.com!davidm 7549674169 (unw_get_proc_info_by_ip): New routine.
(Logical change 1.133)
2003-12-04 07:34:21 +00:00
hp.com!davidm 1334cae324 (HAVE___THREAD): Force it off for now---the per-thread cache uses
about 128KB of thread-local storage for each and every
	thread, even if a thread never ever needs to unwind its
	stack.  Seems a bit much.
(ALWAYS_INLINE): New macro which can be used to force inlining
	on compilers that support it.

(Logical change 1.132)
2003-12-04 07:30:39 +00:00
hp.com!davidm 497018e941 Include "elf32.h".
(Logical change 1.130)
2003-11-27 06:52:54 +00:00
hp.com!davidm 7305d26f26 (struct cursor): Declare pi_valid and pi_is_dynamic as unsigned to
avoid compiler warnings.

(Logical change 1.130)
2003-11-27 06:52:54 +00:00
hp.com!davidm 04dd29b6eb (UNUSED): New macro.
(UNW_DEBUG): If DEBUG is not defined, set it to 0.
(inline): Take advantage of UNUSED macro.
(HAVE_CMPXCHG): Don't define it if we're on HP-UX with GCC v3.2 to
	work around a compiler-bug.

(Logical change 1.130)
2003-11-27 06:52:54 +00:00
hp.com!davidm dd8806c82d (unw_dyn_info_format_t): Add UNW_INFO_FORMAT_REMOTE_TABLE.
(unw_dyn_remote_table_info_t): New type.
(unw_dyn_info): Add "rti" member.

(Logical change 1.126)
2003-11-25 22:33:49 +00:00
hp.com!davidm 48723262f7 (_Uia64_find_dyn_list): Pass unw_dyn_info_t pointer instead of its members.
(Logical change 1.126)
2003-11-25 22:33:49 +00:00
hp.com!davidm e01fb3b27e (cmpxchg_ptr): Correct sense of comparison.
(Logical change 1.125)
2003-11-25 20:13:21 +00:00
hp.com!davidm d61f300b7b (ia64_script_cache): If HAVE_ATOMIC_OPS_H is true, declare "busy" member
in lieu of "lock" member.

(Logical change 1.124)
2003-11-24 23:53:25 +00:00
hp.com!davidm c3fa0b6fa8 Regenerate.
(Logical change 1.123)
2003-11-24 21:37:22 +00:00
hp.com!davidm 8e36032bc5 (unw_addr_space): If HAVE_ATOMIC_OPS_H is defined, declare cache_generation
of type AO_T.  This is a temporary work-around until atomic_ops.h
	supports atomic ops on 32-bit variables.

(Logical change 1.123)
2003-11-24 21:37:22 +00:00
hp.com!davidm 90e8393da3 (inline): Add #undef of "inline" before (re-)defining it.
Add support for atomic_ops.h.
	Add fetch_and_add1() and if it is supported, define
	HAVE_FETCH_AND_ADD1.

(Logical change 1.123)
2003-11-24 21:37:22 +00:00
hp.com!davidm 3f35f343c3 (needs_initialization): Declare it as volatile so we get proper memory
ordering when accessing it.  Also, shrink size to 1 byte and move
	it closer to other frequently-used fields.

(Logical change 1.121)
2003-11-24 18:33:44 +00:00
hp.com!davidm 34085cad7b Fix a typo.
(Logical change 1.116)
2003-11-22 06:11:18 +00:00
hp.com!davidm 2c9be974dc Regenerate.
(Logical change 1.115)
2003-11-22 06:08:20 +00:00
hp.com!davidm 3cc1ec6be9 (struct ia64_global_unwind_state): Add "lock" member.
(Logical change 1.111)
2003-11-19 03:11:25 +00:00
hp.com!davidm 039accfd88 (__BYTE_ORDER): Fix HP-UX byte-order to be __BIG_ENDIAN, as it was meant
to be.

(Logical change 1.106)
2003-10-11 01:05:18 +00:00
hp.com!davidm 18626b8def (UNW_IA64_AR_SSD): New alias for ar26.
(Logical change 1.91)
2003-07-08 22:29:34 +00:00
hp.com!davidm c7db73d180 (ABI_MARKER_OLD_LINUX_SIGTRAMP): Rename from ABI_MARKER_LINUX_SIGTRAMP.
(ABI_MARKER_OLD_LINUX_INTERRUPT): Rename from ABI_MARKER_LINUX_INTERRUPT.
(ABI_MARKER_LINUX_SIGTRAMP): Define with Linux ABI value (3).
(ABI_MARKER_LINUX_INTERRUPT): Ditto.

(Logical change 1.91)
2003-07-08 22:29:34 +00:00
mostang.com!davidm d4f81e2b69 Auto merged
2003/06/03 14:35:33-07:00 mostang.com!davidm
(struct ia64_global_unwind-state): Rename member state_record_pool to
	reg_state_pool.

(Logical change 1.90)
2003-06-03 21:36:03 +00:00
hp.com!davidm e771bcab8f (ABI_MARKER_LINUX_INTERRUPT): New macro.
(struct cursor): Add "last_abi_marker" member.  This is the sticky version of
	"abi_marker".


(Logical change 1.89)
2003-04-25 07:44:23 +00:00
mostang.com!davidm 08230509a3 (ABI_LINUX): New macro.
(ABI_HPUX): Ditto.
(ABI_FREEBSD): Ditto.
(ABI_OPENVMS): Ditto.
(ABI_NSK): Ditto.
(ABI_WINDOWS): Ditto.
(unw_addr_space): Add member "abi".

(Logical change 1.87)
2003-04-24 20:45:07 +00:00
mostang.com!davidm 78a7c5a8c1 (ia64_script_insn_opcode): Rename IA64_INSN_ADD to IA64_INSN_INC_PSP,
and IA64_INSN_LOAD to IA64_INSN_LOAD_PSP.  Add IA64_INSN_SET_REG.
(struct ia64_script_insn): Add "abi_marker" member.

(Logical change 1.84)
2003-04-23 05:56:59 +00:00
mostang.com!davidm ed67c3edb7 (ia64_pregnum): Rename IA64_REG_RP to IA64_REG_IP.
(ia64_loc_t): New type.  For UNW_LOCAL_ONLY, it's a single word, as before.
	For the generic case, it's a 2-word structure.  This provides enough
	space to encode all necessary info both for 32-bit targets (which require
	only 4-byte aligned addresses) and for targets which are limited to
	accessing ucontext_t values via uc_access(3).
(ABI_MARKER_LINUX_SIGTRAMP): New macro.
(ABI_MARKER_HP_UX_SIGTRAMP): New macro.
(struct cursor): Consolidate bsp_loc, bspstore_loc, pfs_loc, rnat_loc, ip_loc,
	pri_unat_loc, unat_loc, pr_loc, lc_loc, fpsr_loc, r4-r7_loc,
	b1-b5_loc, f2-f7_loc, and fr_loc[] into loc[] array.  Note that
	there is now a separate PSP-loc (loc[IA64_REG_PSP]) in addition
	to the cached psp value.
	Rename sigcontext_loc to sigcontext_addr.
	Remove is_signal_frame memeber and add abi_marker member instead.
	Change type of rbs_area[].rnat_loc to ia64_loc_t.
(struct ia64_global_unwind_state): Remove preg_index[] array.

(Logical change 1.84)
2003-04-23 05:56:59 +00:00
hp.com!davidm 79f981aaf7 (_U_TDEP_QP_TRUE): New macro.
(Logical change 1.81)
2003-04-21 23:14:14 +00:00
mostang.com!davidm 6ab15cdec4 Regenerate.
(Logical change 1.75)
2003-04-03 07:59:15 +00:00
mostang.com!davidm 89c081cd84 On HP-UX, unset UNW_LOCAL_ONLY and defined UNW_GENERIC_ONLY, since it makes no
sense to do UNW_LOCAL_ONLY on this platform.

(Logical change 1.75)
2003-04-03 07:59:15 +00:00
mostang.com!davidm d53636d414 Move endian-stuff to internal.h.
(Logical change 1.75)
2003-04-03 07:59:15 +00:00
mostang.com!davidm a04f38ef19 Move endian-related defs from tdep-ia64.h to here.
(Logical change 1.75)
2003-04-03 07:59:15 +00:00
mostang.com!davidm 46149fdccd Regenerate.
(Logical change 1.72)
2003-03-31 18:16:54 +00:00
hp.com!davidm f9cc1e4b74 (tdep_get_elf_image): Declare.
(Logical change 1.71)
2003-03-29 07:32:50 +00:00
hp.com!davidm 1d443a63ad (pthread_mutex_init): Declare as a "weak" symbol.
(Logical change 1.71)
2003-03-29 07:32:50 +00:00
mostang.com!davidm 337c0ad989 Add C++ wrapper.
(Logical change 1.70)
2003-03-28 07:43:22 +00:00
mostang.com!davidm 271d7065c2 (cmpchg_ptr): Cast first argument to "volatile long *", since that is what the
Intel compiler wants.

(Logical change 1.70)
2003-03-28 07:43:22 +00:00
mostang.com!davidm 28fe6a6e8b Work around ECC v7.0 bug by manually definining __sync_val_compare_and_swap()
if it isn't defined yet.

(Logical change 1.68)
2003-03-27 04:29:07 +00:00
mostang.com!davidm c7aaa68495 Regenerate.
(Logical change 1.63)
2003-03-19 19:25:18 +00:00
mostang.com!davidm 15693e234b Include config.h, if we have it (HAVE_CONFIG_H).
Include <sys/types.h>.  HP-UX can't include pthread.h otherwise.
Replace test for UNW_TARGET_IA64 with test for HAVE_IA64INTRIN_H.

(Logical change 1.63)
2003-03-19 19:25:18 +00:00
mostang.com!davidm 47c70d7858 Include <inttypes.h> instead of <stdint.h>. HP-UX doesn't have the latter.
(unw_tdep_save_loc_t): Define a dummy member, so we're ANSI-C compliant (which doesn't
	allow empty structs).

(Logical change 1.63)
2003-03-19 19:25:18 +00:00
mostang.com!davidm 58e0e100d1 Include <inttypes.h> instead of <stdint.h>. HP-UX doesn't have the latter.
(Logical change 1.63)
2003-03-19 19:25:18 +00:00
mostang.com!davidm 53bd7613b7 If we don't have <endian.h>, define __LITTLE_ENDIAN and __BIG_ENDIAN here and
guess the right value for __BYTE_ORDER.

(Logical change 1.63)
2003-03-19 19:25:18 +00:00
mostang.com!davidm d5ad49b013 (unw_regname): Correct type of "regnum" from "int" to "unw_regnum_t".
(Logical change 1.62)
2003-03-13 02:15:01 +00:00
mostang.com!davidm 51095505d9 (struct addr_space): Add "dyn_info_list_addr" member.
(Logical change 1.61)
2003-03-11 01:11:18 +00:00
mostang.com!davidm 9003fd20fe Include <signal.h>. Remove include of <tdep.h>.
(mutex_init): New macro.
(HAVE_CMPXCHG): Ditto.
(cmpxchg_ptr): Ditto.
(unwi_full_sigmask): New variable.

(Logical change 1.59)
2003-03-06 06:14:36 +00:00
mostang.com!davidm 5daa8619b7 Include "internal.h".
Define sos_alloc(), mempool_init(), mempool_alloc(), and mempool_free() with
	UNWI_ARCH_OBJ() helper macro.
(sos_free): Delete.
(struct mempool): Declare "lock" member.

(Logical change 1.59)
2003-03-06 06:14:36 +00:00
mostang.com!davidm 57bdcfeb0d Delete spurious copyright message.
(struct ia64_script_cache): Declare "lock" member.
(ia64_get_cached_proc_info): Rename from ia64_script_lookup().

(Logical change 1.59)
2003-03-06 06:14:36 +00:00
mostang.com!davidm 45ce48f2e4 (unw_tdep_fpreg_t): Declare as "long double".
(UNW_TDEP_EH): Declare.
(UNW_TDEP_NUM_EH_REGS): New macro.

(Logical change 1.59)
2003-03-06 06:14:36 +00:00
mostang.com!davidm a6e367131b (UNW_TDEP_EH): Rename from UNW_TDEP_EH_ARG0.
(UNW_TDEP_EH_ARG1): Delete.
(UNW_TDEP_EH_ARG2): Ditto.
(UNW_TDEP_EH_ARG3): Ditto.
(UNT_TDEP_NUM_EH_REGS): New macro.

(Logical change 1.59)
2003-03-06 06:14:36 +00:00
mostang.com!davidm c670abba8f (UNW_REG_EH): Rename from UNW_REG_EH_ARG0.
(UNW_REG_EH_ARG1): Delete.
(UNW_REG_EH_ARG2): Ditto.
(UNW_REG_EH_ARG3): Ditto.
(UNW_NUM_EH_REGS): New macro.
(_UPT_resume): Declare.

(Logical change 1.59)
2003-03-06 06:14:36 +00:00
mostang.com!davidm 7343841308 (unw_accessors_t): Add optional get_proc_name() callback.
(Logical change 1.56)
2003-02-27 09:58:57 +00:00
mostang.com!davidm 9430d35c9b (_U_dyn_region_info_size): Define it in a more straight-forward manner.
(_U_dyn_op_label_state): Drop "qp" and "when" arguments.
(_U_dyn_op_copy_state): Ditto.
(_U_dyn_op_stop): Define qp to _U_QP_TRUE and when to -1.
(_U_QP_TRUE): New macro.

(Logical change 1.56)
2003-02-27 09:58:57 +00:00
mostang.com!davidm 9df94711bf (_U_TDEP_QP_TRUE): New macro.
(UNW_IA64_RP): New register-name.

(Logical change 1.56)
2003-02-27 09:58:57 +00:00
mostang.com!davidm 6863c4aaf5 (IA64_REG_PSP): Move it ino front of IA64_REG_BSP.
(tdep_get_proc_name): Delete.

(Logical change 1.56)
2003-02-27 09:58:57 +00:00
hp.com!davidm c503981c39 (struct ia64_global_unwind_state): Add member "r0".
(Logical change 1.55)
2003-02-26 08:33:57 +00:00
hp.com!davidm 43652d9dea (ia64): Undef this macro if it's defined (bug in Intel's ECC v7.0?).
(_Uia64_find_dyn_list): Add "gp" argument.

(Logical change 1.55)
2003-02-26 08:33:57 +00:00
hp.com!davidm cf3b756567 (_U_dyn_op_pop_frames): Fix typo in UNW_DYN_POP_FRAMES.
(Logical change 1.55)
2003-02-26 08:33:57 +00:00
mostang.com!davidm e20ecc63b8 (unwi_get_proc_name): Don't make it an arch-object. Drop "is_local" argument.
(Logical change 1.54)
2003-02-22 08:19:43 +00:00
mostang.com!davidm e61440508f (unw_dyn_region_info_t): Make insn_count signed.
(Logical change 1.54)
2003-02-22 08:19:43 +00:00
hp.com!davidm ea34cc2bee (uc_off): Remove (it wasn't used anymore).
(Logical change 1.53)
2003-02-22 03:08:22 +00:00
mostang.com!davidm c341225693 (struct cursor): Remove rbs_right_edge.
(Logical change 1.52)
2003-02-21 07:36:26 +00:00
hp.com!davidm a45c88823a (likely): Make them work even for non-GCC (or old GCC) compilers.
(unlikely): Ditto.
(debug): Print to stderr.
(dprintf): Ditto.

(Logical change 1.48)
2003-02-15 03:10:30 +00:00
hp.com!davidm 74f568c602 Regenerate.
(Logical change 1.46)
2003-02-14 03:09:27 +00:00
mostang.com!davidm 108627cab7 Include "elf64.h".
(struct cursor): Add member "eh_valid_mask" to track which eh_args[] are valid.
	Fix comment for rbs_curr.
(tdep_get_elf_image): New routine.

(Logical change 1.45)
2003-02-08 10:10:59 +00:00
mostang.com!davidm 8c2740cfe3 (unw_tdep_fpreg_t): New type.
(UNW_TDEP_EH_ARG0): Make it an alias for r15.
(UNW_TDEP_EH_ARG1): Make it an alias for r16.
(UNW_TDEP_EH_ARG2): Make it an alias for r17.
(UNW_TDEP_EH_ARG3): Make it an alias for r18.

(Logical change 1.45)
2003-02-08 10:10:59 +00:00
mostang.com!davidm 981c8cc37b (UNW_REG_EH_ARG0): New well-known register name.
(UNW_REG_EH_ARG1): Ditto.
(UNW_REG_EH_ARG2): Ditto.
(UNW_REG_EH_ARG3): Ditto.
(unw_fpreg_t): Make it a target-dependent type.
(unw_get_proc_name): Also return the offset relative to the function name returned.

(Logical change 1.45)
2003-02-08 10:10:59 +00:00
mostang.com!davidm f5265f56ba (HIDDEN): Make it empty unless we have at least GCC v3.3.
(unwi_get_proc_name): Also return the offset relative to the returned function-name.
(struct elf_image): New structure.

(Logical change 1.45)
2003-02-08 10:10:59 +00:00
hp.com!davidm 644c919345 Rename UNW_IA64_AR_25 to UNW_IA64_AR_CSD, as per SDM v2.1.
(_Uia64_search_unwind_table): Declare.
(_Uia64_find_dyn_list): Declare as "extern".
(_Uia64_get_kernel_table): Declare.

(Logical change 1.43)
2003-01-28 03:40:06 +00:00
hp.com!davidm a69cf3deb9 Regenerate.
(Logical change 1.43)
2003-01-28 03:40:06 +00:00
hp.com!davidm 68bdac3681 Add declarations for the _UPT_* helper routines (libunwind via ptrace helpers).
(Logical change 1.43)
2003-01-28 03:40:06 +00:00
hp.com!davidm bb25a5ed3b (tdep_search_unwind_table): Explicitly call _Uia64_search_unwind_table().
Remove declaration of same name; this is now done in libunwind-ia64.h.

(Logical change 1.43)
2003-01-28 03:40:06 +00:00
mostang.com!davidm 717cb71374 (struct cursor): Add "cfm" cache.
(Logical change 1.42)
2003-01-23 18:47:51 +00:00