cleanup: style
[blender-staging.git] / source / blender / blenlib / intern / system.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 /** \file blender/blenlib/intern/system.c
22  *  \ingroup bli
23  */
24
25 #include <stdio.h>
26 #include <stdlib.h>
27
28 #include "BLI_system.h"
29
30 /* for backtrace */
31 #if defined(__linux__) || defined(__APPLE__)
32 #  include <execinfo.h>
33 #elif defined(_MSV_VER)
34 #  include <DbgHelp.h>
35 #endif
36
37 int BLI_cpu_support_sse2(void)
38 {
39 #if defined(__x86_64__) || defined(_M_X64)
40         /* x86_64 always has SSE2 instructions */
41         return 1;
42 #elif defined(__GNUC__) && defined(i386)
43         /* for GCC x86 we check cpuid */
44         unsigned int d;
45         __asm__(
46             "pushl %%ebx\n\t"
47             "cpuid\n\t"
48             "popl %%ebx\n\t"
49                 : "=d" (d)
50                 : "a" (1));
51         return (d & 0x04000000) != 0;
52 #elif (defined(_MSC_VER) && defined(_M_IX86))
53         /* also check cpuid for MSVC x86 */
54         unsigned int d;
55         __asm {
56                 xor     eax, eax
57                 inc eax
58                 push ebx
59                 cpuid
60                 pop ebx
61                 mov d, edx
62         }
63         return (d & 0x04000000) != 0;
64 #else
65         return 0;
66 #endif
67 }
68
69 /**
70  * Write a backtrace into a file for systems which support it.
71  */
72 void BLI_system_backtrace(FILE *fp)
73 {
74         /* ------------- */
75         /* Linux / Apple */
76 #if defined(__linux__) || defined(__APPLE__)
77
78 #define SIZE 100
79         void *buffer[SIZE];
80         int nptrs;
81         char **strings;
82         int i;
83
84         /* include a backtrace for good measure */
85         nptrs = backtrace(buffer, SIZE);
86         strings = backtrace_symbols(buffer, nptrs);
87         for (i = 0; i < nptrs; i++) {
88                 fputs(strings[i], fp);
89                 fputc('\n', fp);
90         }
91
92         free(strings);
93 #undef SIZE
94
95         /* -------- */
96         /* Windows  */
97 #elif defined(_MSC_VER)
98
99         (void)fp;
100 #if 0
101 #define MAXSYMBOL 256
102         unsigned short  i;
103         void *stack[SIZE];
104         unsigned short nframes;
105         SYMBOL_INFO     *symbolinfo;
106         HANDLE process;
107
108         process = GetCurrentProcess();
109
110         SymInitialize(process, NULL, true);
111
112         nframes = CaptureStackBackTrace(0, SIZE, stack, NULL);
113         symbolinfo = MEM_callocN(sizeof(SYMBOL_INFO) + MAXSYMBOL * sizeof(char), "crash Symbol table");
114         symbolinfo->MaxNameLen = MAXSYMBOL - 1;
115         symbolinfo->SizeOfStruct = sizeof(SYMBOL_INFO);
116
117         for (i = 0; i < nframes; i++) {
118                 SymFromAddr(process, (DWORD64)(stack[i]), 0, symbolinfo);
119
120                 fprintf(fp, "%u: %s - 0x%0X\n", nframes - i - 1, symbolinfo->Name, symbolinfo->Address);
121         }
122
123         MEM_freeN(symbolinfo);
124 #undef MAXSYMBOL
125 #endif
126
127         /* ------------------ */
128         /* non msvc/osx/linux */
129 #else
130         (void)fp;
131 #endif
132
133 }
134 /* end BLI_system_backtrace */