xref: /aosp_15_r20/external/swiftshader/src/System/Debug.cpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2018 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker //    http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker 
15*03ce13f7SAndroid Build Coastguard Worker #include "Debug.hpp"
16*03ce13f7SAndroid Build Coastguard Worker 
17*03ce13f7SAndroid Build Coastguard Worker #if __ANDROID__
18*03ce13f7SAndroid Build Coastguard Worker #	include <android/log.h>
19*03ce13f7SAndroid Build Coastguard Worker #endif
20*03ce13f7SAndroid Build Coastguard Worker 
21*03ce13f7SAndroid Build Coastguard Worker #if defined(__unix__)
22*03ce13f7SAndroid Build Coastguard Worker #	define PTRACE
23*03ce13f7SAndroid Build Coastguard Worker #	include <sys/ptrace.h>
24*03ce13f7SAndroid Build Coastguard Worker #	include <sys/types.h>
25*03ce13f7SAndroid Build Coastguard Worker #elif defined(_WIN32) || defined(_WIN64)
26*03ce13f7SAndroid Build Coastguard Worker #	include <windows.h>
27*03ce13f7SAndroid Build Coastguard Worker #elif defined(__APPLE__) || defined(__MACH__)
28*03ce13f7SAndroid Build Coastguard Worker #	include <sys/sysctl.h>
29*03ce13f7SAndroid Build Coastguard Worker #	include <unistd.h>
30*03ce13f7SAndroid Build Coastguard Worker #endif
31*03ce13f7SAndroid Build Coastguard Worker 
32*03ce13f7SAndroid Build Coastguard Worker #include <atomic>
33*03ce13f7SAndroid Build Coastguard Worker #include <cstdarg>
34*03ce13f7SAndroid Build Coastguard Worker #include <cstdio>
35*03ce13f7SAndroid Build Coastguard Worker #include <string>
36*03ce13f7SAndroid Build Coastguard Worker 
37*03ce13f7SAndroid Build Coastguard Worker #ifdef ERROR
38*03ce13f7SAndroid Build Coastguard Worker #	undef ERROR  // b/127920555
39*03ce13f7SAndroid Build Coastguard Worker #endif
40*03ce13f7SAndroid Build Coastguard Worker 
41*03ce13f7SAndroid Build Coastguard Worker #ifndef SWIFTSHADER_LOGGING_LEVEL
42*03ce13f7SAndroid Build Coastguard Worker #	define SWIFTSHADER_LOGGING_LEVEL Info
43*03ce13f7SAndroid Build Coastguard Worker #endif
44*03ce13f7SAndroid Build Coastguard Worker 
45*03ce13f7SAndroid Build Coastguard Worker namespace {
46*03ce13f7SAndroid Build Coastguard Worker 
47*03ce13f7SAndroid Build Coastguard Worker enum class Level
48*03ce13f7SAndroid Build Coastguard Worker {
49*03ce13f7SAndroid Build Coastguard Worker 	Verbose,
50*03ce13f7SAndroid Build Coastguard Worker 	Debug,
51*03ce13f7SAndroid Build Coastguard Worker 	Info,
52*03ce13f7SAndroid Build Coastguard Worker 	Warn,
53*03ce13f7SAndroid Build Coastguard Worker 	Error,
54*03ce13f7SAndroid Build Coastguard Worker 	Fatal,
55*03ce13f7SAndroid Build Coastguard Worker 	Disabled,
56*03ce13f7SAndroid Build Coastguard Worker };
57*03ce13f7SAndroid Build Coastguard Worker 
58*03ce13f7SAndroid Build Coastguard Worker #ifdef __ANDROID__
logv_android(Level level,const char * msg)59*03ce13f7SAndroid Build Coastguard Worker [[maybe_unused]] void logv_android(Level level, const char *msg)
60*03ce13f7SAndroid Build Coastguard Worker {
61*03ce13f7SAndroid Build Coastguard Worker 	switch(level)
62*03ce13f7SAndroid Build Coastguard Worker 	{
63*03ce13f7SAndroid Build Coastguard Worker 	case Level::Debug:
64*03ce13f7SAndroid Build Coastguard Worker 		__android_log_write(ANDROID_LOG_DEBUG, "SwiftShader", msg);
65*03ce13f7SAndroid Build Coastguard Worker 		break;
66*03ce13f7SAndroid Build Coastguard Worker 	case Level::Info:
67*03ce13f7SAndroid Build Coastguard Worker 		__android_log_write(ANDROID_LOG_INFO, "SwiftShader", msg);
68*03ce13f7SAndroid Build Coastguard Worker 		break;
69*03ce13f7SAndroid Build Coastguard Worker 	case Level::Warn:
70*03ce13f7SAndroid Build Coastguard Worker 		__android_log_write(ANDROID_LOG_WARN, "SwiftShader", msg);
71*03ce13f7SAndroid Build Coastguard Worker 		break;
72*03ce13f7SAndroid Build Coastguard Worker 	case Level::Error:
73*03ce13f7SAndroid Build Coastguard Worker 		__android_log_write(ANDROID_LOG_ERROR, "SwiftShader", msg);
74*03ce13f7SAndroid Build Coastguard Worker 		break;
75*03ce13f7SAndroid Build Coastguard Worker 	case Level::Fatal:
76*03ce13f7SAndroid Build Coastguard Worker 		__android_log_write(ANDROID_LOG_FATAL, "SwiftShader", msg);
77*03ce13f7SAndroid Build Coastguard Worker 		break;
78*03ce13f7SAndroid Build Coastguard Worker 	default:
79*03ce13f7SAndroid Build Coastguard Worker 		break;
80*03ce13f7SAndroid Build Coastguard Worker 	}
81*03ce13f7SAndroid Build Coastguard Worker }
82*03ce13f7SAndroid Build Coastguard Worker #else
logv_std(Level level,const char * msg)83*03ce13f7SAndroid Build Coastguard Worker [[maybe_unused]] void logv_std(Level level, const char *msg)
84*03ce13f7SAndroid Build Coastguard Worker {
85*03ce13f7SAndroid Build Coastguard Worker 	switch(level)
86*03ce13f7SAndroid Build Coastguard Worker 	{
87*03ce13f7SAndroid Build Coastguard Worker 	case Level::Debug:
88*03ce13f7SAndroid Build Coastguard Worker 	case Level::Info:
89*03ce13f7SAndroid Build Coastguard Worker 		fprintf(stdout, "%s", msg);
90*03ce13f7SAndroid Build Coastguard Worker 		break;
91*03ce13f7SAndroid Build Coastguard Worker 	case Level::Warn:
92*03ce13f7SAndroid Build Coastguard Worker 	case Level::Error:
93*03ce13f7SAndroid Build Coastguard Worker 	case Level::Fatal:
94*03ce13f7SAndroid Build Coastguard Worker 		fprintf(stderr, "%s", msg);
95*03ce13f7SAndroid Build Coastguard Worker 		break;
96*03ce13f7SAndroid Build Coastguard Worker 	default:
97*03ce13f7SAndroid Build Coastguard Worker 		break;
98*03ce13f7SAndroid Build Coastguard Worker 	}
99*03ce13f7SAndroid Build Coastguard Worker }
100*03ce13f7SAndroid Build Coastguard Worker #endif
101*03ce13f7SAndroid Build Coastguard Worker 
logv(Level level,const char * format,va_list args)102*03ce13f7SAndroid Build Coastguard Worker void logv(Level level, const char *format, va_list args)
103*03ce13f7SAndroid Build Coastguard Worker {
104*03ce13f7SAndroid Build Coastguard Worker 	if(static_cast<int>(level) >= static_cast<int>(Level::SWIFTSHADER_LOGGING_LEVEL))
105*03ce13f7SAndroid Build Coastguard Worker 	{
106*03ce13f7SAndroid Build Coastguard Worker #ifndef SWIFTSHADER_DISABLE_TRACE
107*03ce13f7SAndroid Build Coastguard Worker 		char buffer[2048];
108*03ce13f7SAndroid Build Coastguard Worker 		vsnprintf(buffer, sizeof(buffer), format, args);
109*03ce13f7SAndroid Build Coastguard Worker 
110*03ce13f7SAndroid Build Coastguard Worker #	if defined(__ANDROID__)
111*03ce13f7SAndroid Build Coastguard Worker 		logv_android(level, buffer);
112*03ce13f7SAndroid Build Coastguard Worker #	elif defined(_WIN32)
113*03ce13f7SAndroid Build Coastguard Worker 		logv_std(level, buffer);
114*03ce13f7SAndroid Build Coastguard Worker 		::OutputDebugString(buffer);
115*03ce13f7SAndroid Build Coastguard Worker #	else
116*03ce13f7SAndroid Build Coastguard Worker 		logv_std(level, buffer);
117*03ce13f7SAndroid Build Coastguard Worker #	endif
118*03ce13f7SAndroid Build Coastguard Worker 	}
119*03ce13f7SAndroid Build Coastguard Worker 
120*03ce13f7SAndroid Build Coastguard Worker 	const Level traceToFileLevel = Level::Disabled;
121*03ce13f7SAndroid Build Coastguard Worker 	if(static_cast<int>(level) >= static_cast<int>(traceToFileLevel))
122*03ce13f7SAndroid Build Coastguard Worker 	{
123*03ce13f7SAndroid Build Coastguard Worker 		FILE *file = fopen(TRACE_OUTPUT_FILE, "a");
124*03ce13f7SAndroid Build Coastguard Worker 
125*03ce13f7SAndroid Build Coastguard Worker 		if(file)
126*03ce13f7SAndroid Build Coastguard Worker 		{
127*03ce13f7SAndroid Build Coastguard Worker 			vfprintf(file, format, args);
128*03ce13f7SAndroid Build Coastguard Worker 			fclose(file);
129*03ce13f7SAndroid Build Coastguard Worker 		}
130*03ce13f7SAndroid Build Coastguard Worker #endif  // SWIFTSHADER_DISABLE_TRACE
131*03ce13f7SAndroid Build Coastguard Worker 	}
132*03ce13f7SAndroid Build Coastguard Worker }
133*03ce13f7SAndroid Build Coastguard Worker 
134*03ce13f7SAndroid Build Coastguard Worker }  // anonymous namespace
135*03ce13f7SAndroid Build Coastguard Worker 
136*03ce13f7SAndroid Build Coastguard Worker namespace sw {
137*03ce13f7SAndroid Build Coastguard Worker 
trace(const char * format,...)138*03ce13f7SAndroid Build Coastguard Worker void trace(const char *format, ...)
139*03ce13f7SAndroid Build Coastguard Worker {
140*03ce13f7SAndroid Build Coastguard Worker 	va_list vararg;
141*03ce13f7SAndroid Build Coastguard Worker 	va_start(vararg, format);
142*03ce13f7SAndroid Build Coastguard Worker 	logv(Level::Debug, format, vararg);
143*03ce13f7SAndroid Build Coastguard Worker 	va_end(vararg);
144*03ce13f7SAndroid Build Coastguard Worker }
145*03ce13f7SAndroid Build Coastguard Worker 
warn(const char * format,...)146*03ce13f7SAndroid Build Coastguard Worker void warn(const char *format, ...)
147*03ce13f7SAndroid Build Coastguard Worker {
148*03ce13f7SAndroid Build Coastguard Worker 	va_list vararg;
149*03ce13f7SAndroid Build Coastguard Worker 	va_start(vararg, format);
150*03ce13f7SAndroid Build Coastguard Worker 	logv(Level::Warn, format, vararg);
151*03ce13f7SAndroid Build Coastguard Worker 	va_end(vararg);
152*03ce13f7SAndroid Build Coastguard Worker }
153*03ce13f7SAndroid Build Coastguard Worker 
abort(const char * format,...)154*03ce13f7SAndroid Build Coastguard Worker void abort(const char *format, ...)
155*03ce13f7SAndroid Build Coastguard Worker {
156*03ce13f7SAndroid Build Coastguard Worker 	va_list vararg;
157*03ce13f7SAndroid Build Coastguard Worker 
158*03ce13f7SAndroid Build Coastguard Worker 	va_start(vararg, format);
159*03ce13f7SAndroid Build Coastguard Worker 	logv(Level::Fatal, format, vararg);
160*03ce13f7SAndroid Build Coastguard Worker 	va_end(vararg);
161*03ce13f7SAndroid Build Coastguard Worker 
162*03ce13f7SAndroid Build Coastguard Worker 	::abort();
163*03ce13f7SAndroid Build Coastguard Worker }
164*03ce13f7SAndroid Build Coastguard Worker 
165*03ce13f7SAndroid Build Coastguard Worker }  // namespace sw
166