blob: 1b91e144bd2ab138417e74f0bdd75532e2207fa2 [file] [log] [blame]
Ben Clayton25e06e02020-02-07 11:19:08 +00001// Copyright 2018 The SwiftShader Authors. All Rights Reserved.
Nicolas Capens68a82382018-10-02 13:16:55 -04002//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "Debug.hpp"
16
Ben Clayton25e06e02020-02-07 11:19:08 +000017#include <atomic>
18#include <cstdarg>
19#include <cstdio>
20#include <string>
21
22#if __ANDROID__
23# include <android/log.h>
24#endif
25
26#if defined(__unix__)
27# define PTRACE
28# include <sys/ptrace.h>
29# include <sys/types.h>
30#elif defined(_WIN32) || defined(_WIN64)
31# include <windows.h>
32#elif defined(__APPLE__) || defined(__MACH__)
33# include <sys/sysctl.h>
34# include <unistd.h>
35#endif
36
37#ifdef ERROR
38# undef ERROR // b/127920555
39#endif
40
Ben Clayton4bc07ad2020-02-07 20:26:19 +000041#ifndef SWIFTSHADER_LOGGING_LEVEL
Ben Clayton196d8172020-02-10 21:42:18 +000042# define SWIFTSHADER_LOGGING_LEVEL Info
Ben Clayton4bc07ad2020-02-07 20:26:19 +000043#endif
44
Ben Clayton25e06e02020-02-07 11:19:08 +000045namespace {
46
47bool IsUnderDebugger()
48{
49#if defined(PTRACE) && !defined(__APPLE__) && !defined(__MACH__)
50 static bool checked = false;
51 static bool res = false;
52
53 if(!checked)
54 {
55 // If a debugger is attached then we're already being ptraced and ptrace
56 // will return a non-zero value.
57 checked = true;
58 if(ptrace(PTRACE_TRACEME, 0, 1, 0) != 0)
59 {
60 res = true;
61 }
62 else
63 {
64 ptrace(PTRACE_DETACH, 0, 1, 0);
65 }
66 }
67
68 return res;
69#elif defined(_WIN32) || defined(_WIN64)
70 return IsDebuggerPresent() != 0;
71#elif defined(__APPLE__) || defined(__MACH__)
72 // Code comes from the Apple Technical Q&A QA1361
73
74 // Tell sysctl what info we're requestion. Specifically we're asking for
75 // info about this our PID.
76 int res = 0;
77 int request[4] = {
78 CTL_KERN,
79 KERN_PROC,
80 KERN_PROC_PID,
81 getpid()
82 };
83 struct kinfo_proc info;
84 size_t size = sizeof(info);
85
86 info.kp_proc.p_flag = 0;
87
88 // Get the info we're requesting, if sysctl fails then info.kp_proc.p_flag will remain 0.
89 res = sysctl(request, sizeof(request) / sizeof(*request), &info, &size, NULL, 0);
90 ASSERT_MSG(res == 0, "syscl returned %d", res);
91
92 // We're being debugged if the P_TRACED flag is set
93 return ((info.kp_proc.p_flag & P_TRACED) != 0);
94#else
95 return false;
96#endif
97}
98
99enum class Level
100{
Sean Risserc1e60dc2020-02-19 12:52:24 -0500101 Verbose,
Ben Clayton196d8172020-02-10 21:42:18 +0000102 Debug,
103 Info,
104 Warn,
105 Error,
106 Fatal,
Sean Risserc1e60dc2020-02-19 12:52:24 -0500107 Disabled,
Ben Clayton25e06e02020-02-07 11:19:08 +0000108};
109
110#ifdef __ANDROID__
111void logv_android(Level level, const char *msg)
112{
113 switch(level)
114 {
Ben Clayton196d8172020-02-10 21:42:18 +0000115 case Level::Debug:
Ben Clayton25e06e02020-02-07 11:19:08 +0000116 __android_log_write(ANDROID_LOG_DEBUG, "SwiftShader", msg);
117 break;
Ben Clayton196d8172020-02-10 21:42:18 +0000118 case Level::Info:
Ben Clayton25e06e02020-02-07 11:19:08 +0000119 __android_log_write(ANDROID_LOG_INFO, "SwiftShader", msg);
120 break;
Ben Clayton196d8172020-02-10 21:42:18 +0000121 case Level::Warn:
Ben Clayton25e06e02020-02-07 11:19:08 +0000122 __android_log_write(ANDROID_LOG_WARN, "SwiftShader", msg);
123 break;
Ben Clayton196d8172020-02-10 21:42:18 +0000124 case Level::Error:
Ben Clayton25e06e02020-02-07 11:19:08 +0000125 __android_log_write(ANDROID_LOG_ERROR, "SwiftShader", msg);
126 break;
Ben Clayton196d8172020-02-10 21:42:18 +0000127 case Level::Fatal:
Ben Clayton25e06e02020-02-07 11:19:08 +0000128 __android_log_write(ANDROID_LOG_FATAL, "SwiftShader", msg);
129 break;
Sean Risserc1e60dc2020-02-19 12:52:24 -0500130 default:
131 break;
Ben Clayton25e06e02020-02-07 11:19:08 +0000132 }
133}
134#else
135void logv_std(Level level, const char *msg)
136{
137 switch(level)
138 {
Ben Clayton196d8172020-02-10 21:42:18 +0000139 case Level::Debug:
140 case Level::Info:
Ben Clayton25e06e02020-02-07 11:19:08 +0000141 fprintf(stdout, "%s", msg);
142 break;
Ben Clayton196d8172020-02-10 21:42:18 +0000143 case Level::Warn:
144 case Level::Error:
145 case Level::Fatal:
Ben Clayton25e06e02020-02-07 11:19:08 +0000146 fprintf(stderr, "%s", msg);
147 break;
Sean Risserc1e60dc2020-02-19 12:52:24 -0500148 default:
149 break;
Ben Clayton25e06e02020-02-07 11:19:08 +0000150 }
151}
152#endif
153
154void logv(Level level, const char *format, va_list args)
155{
Sean Risserc1e60dc2020-02-19 12:52:24 -0500156 if(static_cast<int>(level) >= static_cast<int>(Level::SWIFTSHADER_LOGGING_LEVEL))
Ben Clayton4bc07ad2020-02-07 20:26:19 +0000157 {
Ben Clayton25e06e02020-02-07 11:19:08 +0000158#ifndef SWIFTSHADER_DISABLE_TRACE
Sean Risserc1e60dc2020-02-19 12:52:24 -0500159 char buffer[2048];
160 vsnprintf(buffer, sizeof(buffer), format, args);
Ben Clayton25e06e02020-02-07 11:19:08 +0000161
162# if defined(__ANDROID__)
Sean Risserc1e60dc2020-02-19 12:52:24 -0500163 logv_android(level, buffer);
Ben Clayton25e06e02020-02-07 11:19:08 +0000164# elif defined(_WIN32)
Sean Risserc1e60dc2020-02-19 12:52:24 -0500165 logv_std(level, buffer);
166 ::OutputDebugString(buffer);
Ben Clayton25e06e02020-02-07 11:19:08 +0000167# else
Sean Risserc1e60dc2020-02-19 12:52:24 -0500168 logv_std(level, buffer);
Ben Clayton25e06e02020-02-07 11:19:08 +0000169# endif
Sean Risserc1e60dc2020-02-19 12:52:24 -0500170 }
Ben Clayton25e06e02020-02-07 11:19:08 +0000171
Sean Risserc1e60dc2020-02-19 12:52:24 -0500172 const Level traceToFileLevel = Level::Disabled;
173 if(static_cast<int>(level) >= static_cast<int>(traceToFileLevel))
Ben Clayton25e06e02020-02-07 11:19:08 +0000174 {
175 FILE *file = fopen(TRACE_OUTPUT_FILE, "a");
176
177 if(file)
178 {
179 vfprintf(file, format, args);
180 fclose(file);
181 }
182 }
183#endif // SWIFTSHADER_DISABLE_TRACE
184}
185
186} // anonymous namespace
Nicolas Capens68a82382018-10-02 13:16:55 -0400187
Nicolas Capens157ba262019-12-10 17:49:14 -0500188namespace sw {
189
Nicolas Capens68a82382018-10-02 13:16:55 -0400190void trace(const char *format, ...)
191{
Ben Clayton25e06e02020-02-07 11:19:08 +0000192 va_list vararg;
193 va_start(vararg, format);
Ben Clayton196d8172020-02-10 21:42:18 +0000194 logv(Level::Debug, format, vararg);
Ben Clayton25e06e02020-02-07 11:19:08 +0000195 va_end(vararg);
196}
197
198void warn(const char *format, ...)
199{
200 va_list vararg;
201 va_start(vararg, format);
Ben Clayton196d8172020-02-10 21:42:18 +0000202 logv(Level::Warn, format, vararg);
Ben Clayton25e06e02020-02-07 11:19:08 +0000203 va_end(vararg);
204}
205
206void abort(const char *format, ...)
207{
208 va_list vararg;
209
210 va_start(vararg, format);
Ben Clayton196d8172020-02-10 21:42:18 +0000211 logv(Level::Fatal, format, vararg);
Ben Clayton25e06e02020-02-07 11:19:08 +0000212 va_end(vararg);
213
214 ::abort();
215}
216
Sean Risserc1e60dc2020-02-19 12:52:24 -0500217void log_trap(const char *format, ...)
Ben Clayton25e06e02020-02-07 11:19:08 +0000218{
Sean Risserc1e60dc2020-02-19 12:52:24 -0500219 // If enabled, log_assert will log all messages, and otherwise ignore them
220 // unless a debugger is attached.
Ben Clayton25e06e02020-02-07 11:19:08 +0000221 static std::atomic<bool> asserted = { false };
222 if(IsUnderDebugger() && !asserted.exchange(true))
Nicolas Capens68a82382018-10-02 13:16:55 -0400223 {
Ben Clayton25e06e02020-02-07 11:19:08 +0000224 // Abort after tracing and printing to stderr
225 va_list vararg;
226 va_start(vararg, format);
Ben Clayton196d8172020-02-10 21:42:18 +0000227 logv(Level::Fatal, format, vararg);
Ben Clayton25e06e02020-02-07 11:19:08 +0000228 va_end(vararg);
Nicolas Capens68a82382018-10-02 13:16:55 -0400229
Ben Clayton25e06e02020-02-07 11:19:08 +0000230 ::abort();
231 }
232 else if(!asserted)
233 {
234 va_list vararg;
235 va_start(vararg, format);
Sean Risserc1e60dc2020-02-19 12:52:24 -0500236 logv(Level::Verbose, format, vararg);
Ben Clayton25e06e02020-02-07 11:19:08 +0000237 va_end(vararg);
Nicolas Capens68a82382018-10-02 13:16:55 -0400238 }
239}
Nicolas Capens157ba262019-12-10 17:49:14 -0500240
241} // namespace sw