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