blob: bb7451e33e7568e80d9f4a6c3414d55f26110267 [file] [log] [blame]
Nicolas Capensc07dc4b2018-08-06 14:20:45 -04001// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
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#ifndef DebugAndroid_hpp
16#define DebugAndroid_hpp
17
18#if ANDROID_PLATFORM_SDK_VERSION < 27
19#include <cutils/log.h>
20#elif ANDROID_PLATFORM_SDK_VERSION >= 27
21#include <log/log.h>
22#else
23#error "ANDROID_PLATFORM_SDK_VERSION is not defined"
24#endif
25
26#include <cassert>
27
28// On Android Virtual Devices we heavily depend on logging, even in
29// production builds. We do this because AVDs are components of larger
30// systems, and may be configured in ways that are difficult to
31// reproduce locally. For example some system run tests against
32// third-party code that we cannot access. Aborting (cf. assert) on
33// unimplemented functionality creates two problems. First, it produces
34// a service failure where none is needed. Second, it puts the
35// customer on the critical path for notifying us of a problem.
36// The alternative, skipping unimplemented functionality silently, is
37// arguably worse: neither the service provider nor the customer will
38// learn that unimplemented functionality may have compromised the test
39// results.
40// Logging invocations of unimplemented functionality is useful to both
41// service provider and the customer. The service provider can learn
42// that the functionality is needed. The customer learns that the test
43// results may be compromised.
44
45/**
46 * Enter the debugger with a memory fault iff debuggerd is set to capture this
47 * process. Otherwise return.
48 */
49void AndroidEnterDebugger();
50
51#define ASSERT(E) do { \
Nicolas Capens81bc9d92019-12-16 15:05:57 -050052 if(!(E)) { \
Nicolas Capensc07dc4b2018-08-06 14:20:45 -040053 ALOGE("badness: assertion_failed %s in %s at %s:%d", #E, \
54 __FUNCTION__, __FILE__, __LINE__); \
55 AndroidEnterDebugger(); \
56 } \
57 } while(0)
58
59#undef assert
60#define assert(E) ASSERT(E)
61
62#define ERR(format, ...) \
63 do { \
64 ALOGE("badness: err %s %s:%d (" format ")", __FUNCTION__, __FILE__, \
65 __LINE__, ##__VA_ARGS__); \
66 AndroidEnterDebugger(); \
67 } while(0)
68
69#define FIXME(format, ...) \
70 do { \
71 ALOGE("badness: fixme %s %s:%d (" format ")", __FUNCTION__, __FILE__, \
72 __LINE__, ##__VA_ARGS__); \
73 AndroidEnterDebugger(); \
74 } while(0)
75
76// TODO: Handle __VA_ARGS__ (can be empty)
77#define UNIMPLEMENTED(...) do { \
78 ALOGE("badness: unimplemented: %s %s:%d", \
79 __FUNCTION__, __FILE__, __LINE__); \
80 AndroidEnterDebugger(); \
81 } while(0)
82
83#define UNREACHABLE(value) do { \
84 ALOGE("badness: unreachable case reached: %s %s:%d. %s: %d", \
85 __FUNCTION__, __FILE__, __LINE__, #value, value); \
86 AndroidEnterDebugger(); \
87 } while(0)
88
89#ifndef NDEBUG
90 #define TRACE(format, ...) \
91 ALOGV("%s %s:%d (" format ")", __FUNCTION__, __FILE__, \
92 __LINE__, ##__VA_ARGS__)
93#else
94 #define TRACE(...) ((void)0)
95#endif
96
97void trace(const char *format, ...);
98
99#endif // DebugAndroid_hpp