curl: remove curl-7.26.0_win-proxy.patch
[LibreOffice.git] / sal / osl / unx / backtrace.c
blobf7bd01c334aa5158e9af508f666eee87b288398d
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "backtrace.h"
22 #if ! HAVE_FEATURE_BACKTRACE /* no GNU backtrace implementation available */
24 #include <sal/types.h>
26 #ifdef __sun /* Solaris */
28 #include <dlfcn.h>
29 #include <pthread.h>
30 #include <setjmp.h>
31 #include <stdio.h>
32 #include <sys/frame.h>
34 #if defined(SPARC)
36 #if defined IS_LP64
38 #define FRAME_PTR_OFFSET 1
39 #define FRAME_OFFSET 0
40 #define STACK_BIAS 0x7ff
42 #else
44 #define FRAME_PTR_OFFSET 1
45 #define FRAME_OFFSET 0
46 #define STACK_BIAS 0
48 #endif
50 #elif defined( INTEL )
52 #define FRAME_PTR_OFFSET 3
53 #define FRAME_OFFSET 0
54 #define STACK_BIAS 0
56 #else
58 #error Unknown Solaris target platform.
60 #endif /* defined SPARC or INTEL */
62 int backtrace( void **buffer, int max_frames )
64 jmp_buf ctx;
65 long fpval;
66 struct frame *fp;
67 int i;
69 /* flush register windows */
70 #ifdef SPARC
71 asm("ta 3");
72 #endif
74 /* get stack- and framepointer */
75 setjmp(ctx);
77 fpval = ((long*)(ctx))[FRAME_PTR_OFFSET];
78 fp = (struct frame*)((char*)(fpval) + STACK_BIAS);
80 for (i = 0; (i < FRAME_OFFSET) && (fp != 0); i++)
81 fp = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS);
83 /* iterate through backtrace */
84 for (i = 0; (fp != 0) && (fp->fr_savpc != 0) && (i < max_frames); i++)
86 /* saved (prev) frame */
87 struct frame * prev = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS);
89 /* store frame */
90 *(buffer++) = (void*)(fp->fr_savpc);
92 /* prev frame (w/ stack growing top down) */
93 fp = (prev > fp) ? prev : 0;
96 /* return number of frames stored */
97 return i;
100 char ** backtrace_symbols(void * const * buffer, int size)
102 (void)buffer; (void)size;
103 return NULL; /*TODO*/
106 void backtrace_symbols_fd( void **buffer, int size, int fd )
108 FILE *fp = fdopen( fd, "w" );
110 if ( fp )
112 void **pFramePtr;
114 for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- )
116 Dl_info dli;
117 ptrdiff_t offset;
119 if ( 0 != dladdr( *pFramePtr, &dli ) )
121 if ( dli.dli_fname && dli.dli_fbase )
123 offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase;
124 fprintf( fp, "%s+0x%" SAL_PRI_PTRDIFFT "x", dli.dli_fname, offset );
126 if ( dli.dli_sname && dli.dli_saddr )
128 offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr;
129 fprintf( fp, "(%s+0x%" SAL_PRI_PTRDIFFT "x)", dli.dli_sname, offset );
132 fprintf( fp, "[%p]\n", *pFramePtr );
135 fclose( fp );
139 #elif defined FREEBSD || defined NETBSD || defined OPENBSD || defined(DRAGONFLY)
141 #include <dlfcn.h>
142 #include <pthread.h>
143 #include <setjmp.h>
144 #include <stddef.h>
145 #include <stdio.h>
147 /* no frame.h on FreeBSD */
148 struct frame {
149 struct frame *fr_savfp;
150 long fr_savpc;
153 #if defined(POWERPC) || defined(POWERPC64)
155 #define FRAME_PTR_OFFSET 1
156 #define FRAME_OFFSET 0
158 #else
160 #define FRAME_PTR_OFFSET 3
161 #define FRAME_OFFSET 0
163 #endif
165 int backtrace( void **buffer, int max_frames )
167 struct frame *fp;
168 jmp_buf ctx;
169 int i;
170 /* get stack- and framepointer */
171 setjmp(ctx);
172 fp = (struct frame*)(((size_t*)(ctx))[FRAME_PTR_OFFSET]);
173 for ( i=0; (i<FRAME_OFFSET) && (fp!=0); i++)
174 fp = fp->fr_savfp;
175 /* iterate through backtrace */
176 for (i=0; fp && fp->fr_savpc && i<max_frames; i++)
178 /* store frame */
179 *(buffer++) = (void *)fp->fr_savpc;
180 /* next frame */
181 fp=fp->fr_savfp;
183 return i;
186 char ** backtrace_symbols(void * const * buffer, int size)
188 (void)buffer; (void)size;
189 return NULL; /*TODO*/
192 void backtrace_symbols_fd( void **buffer, int size, int fd )
194 FILE *fp = fdopen( fd, "w" );
196 if ( fp )
198 void **pFramePtr;
199 for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- )
201 Dl_info dli;
202 ptrdiff_t offset;
204 if ( 0 != dladdr( *pFramePtr, &dli ) )
206 if ( dli.dli_fname && dli.dli_fbase )
208 offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase;
209 fprintf( fp, "%s+0x%" SAL_PRI_PTRDIFFT "x", dli.dli_fname, offset );
211 if ( dli.dli_sname && dli.dli_saddr )
213 offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr;
214 fprintf( fp, "(%s+0x%" SAL_PRI_PTRDIFFT "x)", dli.dli_sname, offset );
217 fprintf( fp, "[%p]\n", *pFramePtr );
219 fclose( fp );
223 #else /* not GNU/BSD/Solaris */
225 int backtrace( void **buffer, int max_frames )
227 (void)buffer; (void)max_frames;
228 return 0;
231 char ** backtrace_symbols(void * const * buffer, int size)
233 (void)buffer; (void)size;
234 return NULL; /*TODO*/
237 void backtrace_symbols_fd( void **buffer, int size, int fd )
239 (void)buffer; (void)size; (void)fd;
242 #endif /* not GNU/BSD/Solaris */
244 #endif /* ! HAVE_FEATURE_BACKTRACE */
246 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */