diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2023-10-12 11:00:48 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2023-10-12 16:11:16 +0200 |
commit | ff5863d46c1730c65f27f3f6234d71b727af5ca9 (patch) | |
tree | e49ee8f8c3524d6a12cb0683d7881e80936e2870 /sal | |
parent | a0b003257aa87d34a4403531798d0074e19a18ac (diff) |
split up the backtrace implementations into separate files
Because I cannot keep what is inside what #ifdef straight in my head
Change-Id: Ie986a6928df179fc0e30ca12c6d2a6866ed82078
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157861
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'sal')
-rw-r--r-- | sal/osl/unx/backtrace.c | 210 | ||||
-rw-r--r-- | sal/osl/unx/backtrace_bsd.c | 105 | ||||
-rw-r--r-- | sal/osl/unx/backtrace_other.c | 39 | ||||
-rw-r--r-- | sal/osl/unx/backtrace_solaris.c | 134 |
4 files changed, 281 insertions, 207 deletions
diff --git a/sal/osl/unx/backtrace.c b/sal/osl/unx/backtrace.c index f7bd01c334aa..f757c8506688 100644 --- a/sal/osl/unx/backtrace.c +++ b/sal/osl/unx/backtrace.c @@ -25,219 +25,15 @@ #ifdef __sun /* Solaris */ -#include <dlfcn.h> -#include <pthread.h> -#include <setjmp.h> -#include <stdio.h> -#include <sys/frame.h> - -#if defined(SPARC) - -#if defined IS_LP64 - -#define FRAME_PTR_OFFSET 1 -#define FRAME_OFFSET 0 -#define STACK_BIAS 0x7ff - -#else - -#define FRAME_PTR_OFFSET 1 -#define FRAME_OFFSET 0 -#define STACK_BIAS 0 - -#endif - -#elif defined( INTEL ) - -#define FRAME_PTR_OFFSET 3 -#define FRAME_OFFSET 0 -#define STACK_BIAS 0 - -#else - -#error Unknown Solaris target platform. - -#endif /* defined SPARC or INTEL */ - -int backtrace( void **buffer, int max_frames ) -{ - jmp_buf ctx; - long fpval; - struct frame *fp; - int i; - - /* flush register windows */ -#ifdef SPARC - asm("ta 3"); -#endif - - /* get stack- and framepointer */ - setjmp(ctx); - - fpval = ((long*)(ctx))[FRAME_PTR_OFFSET]; - fp = (struct frame*)((char*)(fpval) + STACK_BIAS); - - for (i = 0; (i < FRAME_OFFSET) && (fp != 0); i++) - fp = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS); - - /* iterate through backtrace */ - for (i = 0; (fp != 0) && (fp->fr_savpc != 0) && (i < max_frames); i++) - { - /* saved (prev) frame */ - struct frame * prev = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS); - - /* store frame */ - *(buffer++) = (void*)(fp->fr_savpc); - - /* prev frame (w/ stack growing top down) */ - fp = (prev > fp) ? prev : 0; - } - - /* return number of frames stored */ - return i; -} - -char ** backtrace_symbols(void * const * buffer, int size) -{ - (void)buffer; (void)size; - return NULL; /*TODO*/ -} - -void backtrace_symbols_fd( void **buffer, int size, int fd ) -{ - FILE *fp = fdopen( fd, "w" ); - - if ( fp ) - { - void **pFramePtr; - - for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- ) - { - Dl_info dli; - ptrdiff_t offset; - - if ( 0 != dladdr( *pFramePtr, &dli ) ) - { - if ( dli.dli_fname && dli.dli_fbase ) - { - offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase; - fprintf( fp, "%s+0x%" SAL_PRI_PTRDIFFT "x", dli.dli_fname, offset ); - } - if ( dli.dli_sname && dli.dli_saddr ) - { - offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr; - fprintf( fp, "(%s+0x%" SAL_PRI_PTRDIFFT "x)", dli.dli_sname, offset ); - } - } - fprintf( fp, "[%p]\n", *pFramePtr ); - } - - fclose( fp ); - } -} +#include "backtrace_solaris.c" #elif defined FREEBSD || defined NETBSD || defined OPENBSD || defined(DRAGONFLY) -#include <dlfcn.h> -#include <pthread.h> -#include <setjmp.h> -#include <stddef.h> -#include <stdio.h> - -/* no frame.h on FreeBSD */ -struct frame { - struct frame *fr_savfp; - long fr_savpc; -}; - -#if defined(POWERPC) || defined(POWERPC64) - -#define FRAME_PTR_OFFSET 1 -#define FRAME_OFFSET 0 - -#else - -#define FRAME_PTR_OFFSET 3 -#define FRAME_OFFSET 0 - -#endif - -int backtrace( void **buffer, int max_frames ) -{ - struct frame *fp; - jmp_buf ctx; - int i; - /* get stack- and framepointer */ - setjmp(ctx); - fp = (struct frame*)(((size_t*)(ctx))[FRAME_PTR_OFFSET]); - for ( i=0; (i<FRAME_OFFSET) && (fp!=0); i++) - fp = fp->fr_savfp; - /* iterate through backtrace */ - for (i=0; fp && fp->fr_savpc && i<max_frames; i++) - { - /* store frame */ - *(buffer++) = (void *)fp->fr_savpc; - /* next frame */ - fp=fp->fr_savfp; - } - return i; -} - -char ** backtrace_symbols(void * const * buffer, int size) -{ - (void)buffer; (void)size; - return NULL; /*TODO*/ -} - -void backtrace_symbols_fd( void **buffer, int size, int fd ) -{ - FILE *fp = fdopen( fd, "w" ); - - if ( fp ) - { - void **pFramePtr; - for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- ) - { - Dl_info dli; - ptrdiff_t offset; - - if ( 0 != dladdr( *pFramePtr, &dli ) ) - { - if ( dli.dli_fname && dli.dli_fbase ) - { - offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase; - fprintf( fp, "%s+0x%" SAL_PRI_PTRDIFFT "x", dli.dli_fname, offset ); - } - if ( dli.dli_sname && dli.dli_saddr ) - { - offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr; - fprintf( fp, "(%s+0x%" SAL_PRI_PTRDIFFT "x)", dli.dli_sname, offset ); - } - } - fprintf( fp, "[%p]\n", *pFramePtr ); - } - fclose( fp ); - } -} +#include "backtrace_bsd.c" #else /* not GNU/BSD/Solaris */ -int backtrace( void **buffer, int max_frames ) -{ - (void)buffer; (void)max_frames; - return 0; -} - -char ** backtrace_symbols(void * const * buffer, int size) -{ - (void)buffer; (void)size; - return NULL; /*TODO*/ -} - -void backtrace_symbols_fd( void **buffer, int size, int fd ) -{ - (void)buffer; (void)size; (void)fd; -} +#include "backtrace_other.c" #endif /* not GNU/BSD/Solaris */ diff --git a/sal/osl/unx/backtrace_bsd.c b/sal/osl/unx/backtrace_bsd.c new file mode 100644 index 000000000000..f20b739cc25c --- /dev/null +++ b/sal/osl/unx/backtrace_bsd.c @@ -0,0 +1,105 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +// This file is #include from backtrace.c + +#include <dlfcn.h> +#include <pthread.h> +#include <setjmp.h> +#include <stddef.h> +#include <stdio.h> + +/* no frame.h on FreeBSD */ +struct frame { + struct frame *fr_savfp; + long fr_savpc; +}; + +#if defined(POWERPC) || defined(POWERPC64) + +#define FRAME_PTR_OFFSET 1 +#define FRAME_OFFSET 0 + +#else + +#define FRAME_PTR_OFFSET 3 +#define FRAME_OFFSET 0 + +#endif + +int backtrace( void **buffer, int max_frames ) +{ + struct frame *fp; + jmp_buf ctx; + int i; + /* get stack- and framepointer */ + setjmp(ctx); + fp = (struct frame*)(((size_t*)(ctx))[FRAME_PTR_OFFSET]); + for ( i=0; (i<FRAME_OFFSET) && (fp!=0); i++) + fp = fp->fr_savfp; + /* iterate through backtrace */ + for (i=0; fp && fp->fr_savpc && i<max_frames; i++) + { + /* store frame */ + *(buffer++) = (void *)fp->fr_savpc; + /* next frame */ + fp=fp->fr_savfp; + } + return i; +} + +char ** backtrace_symbols(void * const * buffer, int size) +{ + (void)buffer; (void)size; + return NULL; /*TODO*/ +} + +void backtrace_symbols_fd( void **buffer, int size, int fd ) +{ + FILE *fp = fdopen( fd, "w" ); + + if ( fp ) + { + void **pFramePtr; + for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- ) + { + Dl_info dli; + ptrdiff_t offset; + + if ( 0 != dladdr( *pFramePtr, &dli ) ) + { + if ( dli.dli_fname && dli.dli_fbase ) + { + offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase; + fprintf( fp, "%s+0x%" SAL_PRI_PTRDIFFT "x", dli.dli_fname, offset ); + } + if ( dli.dli_sname && dli.dli_saddr ) + { + offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr; + fprintf( fp, "(%s+0x%" SAL_PRI_PTRDIFFT "x)", dli.dli_sname, offset ); + } + } + fprintf( fp, "[%p]\n", *pFramePtr ); + } + fclose( fp ); + } +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/backtrace_other.c b/sal/osl/unx/backtrace_other.c new file mode 100644 index 000000000000..d5ad0a8e53b9 --- /dev/null +++ b/sal/osl/unx/backtrace_other.c @@ -0,0 +1,39 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +// This file is #include from backtrace.c + +int backtrace( void **buffer, int max_frames ) +{ + (void)buffer; (void)max_frames; + return 0; +} + +char ** backtrace_symbols(void * const * buffer, int size) +{ + (void)buffer; (void)size; + return NULL; /*TODO*/ +} + +void backtrace_symbols_fd( void **buffer, int size, int fd ) +{ + (void)buffer; (void)size; (void)fd; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/osl/unx/backtrace_solaris.c b/sal/osl/unx/backtrace_solaris.c new file mode 100644 index 000000000000..76f4475bfb2f --- /dev/null +++ b/sal/osl/unx/backtrace_solaris.c @@ -0,0 +1,134 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +// This file is #include from backtrace.c + +#include <dlfcn.h> +#include <pthread.h> +#include <setjmp.h> +#include <stdio.h> +#include <sys/frame.h> + +#if defined(SPARC) + +#if defined IS_LP64 + +#define FRAME_PTR_OFFSET 1 +#define FRAME_OFFSET 0 +#define STACK_BIAS 0x7ff + +#else + +#define FRAME_PTR_OFFSET 1 +#define FRAME_OFFSET 0 +#define STACK_BIAS 0 + +#endif + +#elif defined( INTEL ) + +#define FRAME_PTR_OFFSET 3 +#define FRAME_OFFSET 0 +#define STACK_BIAS 0 + +#else + +#error Unknown Solaris target platform. + +#endif /* defined SPARC or INTEL */ + +int backtrace( void **buffer, int max_frames ) +{ + jmp_buf ctx; + long fpval; + struct frame *fp; + int i; + + /* flush register windows */ +#ifdef SPARC + asm("ta 3"); +#endif + + /* get stack- and framepointer */ + setjmp(ctx); + + fpval = ((long*)(ctx))[FRAME_PTR_OFFSET]; + fp = (struct frame*)((char*)(fpval) + STACK_BIAS); + + for (i = 0; (i < FRAME_OFFSET) && (fp != 0); i++) + fp = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS); + + /* iterate through backtrace */ + for (i = 0; (fp != 0) && (fp->fr_savpc != 0) && (i < max_frames); i++) + { + /* saved (prev) frame */ + struct frame * prev = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS); + + /* store frame */ + *(buffer++) = (void*)(fp->fr_savpc); + + /* prev frame (w/ stack growing top down) */ + fp = (prev > fp) ? prev : 0; + } + + /* return number of frames stored */ + return i; +} + +char ** backtrace_symbols(void * const * buffer, int size) +{ + (void)buffer; (void)size; + return NULL; /*TODO*/ +} + +void backtrace_symbols_fd( void **buffer, int size, int fd ) +{ + FILE *fp = fdopen( fd, "w" ); + + if ( fp ) + { + void **pFramePtr; + + for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- ) + { + Dl_info dli; + ptrdiff_t offset; + + if ( 0 != dladdr( *pFramePtr, &dli ) ) + { + if ( dli.dli_fname && dli.dli_fbase ) + { + offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase; + fprintf( fp, "%s+0x%" SAL_PRI_PTRDIFFT "x", dli.dli_fname, offset ); + } + if ( dli.dli_sname && dli.dli_saddr ) + { + offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr; + fprintf( fp, "(%s+0x%" SAL_PRI_PTRDIFFT "x)", dli.dli_sname, offset ); + } + } + fprintf( fp, "[%p]\n", *pFramePtr ); + } + + fclose( fp ); + } +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |