xref: /aosp_15_r20/external/armnn/profiling/common/include/Logging.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #pragma once
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include <iostream>
9*89c4ff92SAndroid Build Coastguard Worker #include <memory>
10*89c4ff92SAndroid Build Coastguard Worker #include <sstream>
11*89c4ff92SAndroid Build Coastguard Worker #include <vector>
12*89c4ff92SAndroid Build Coastguard Worker 
13*89c4ff92SAndroid Build Coastguard Worker namespace arm
14*89c4ff92SAndroid Build Coastguard Worker {
15*89c4ff92SAndroid Build Coastguard Worker 
16*89c4ff92SAndroid Build Coastguard Worker namespace pipe
17*89c4ff92SAndroid Build Coastguard Worker {
18*89c4ff92SAndroid Build Coastguard Worker 
19*89c4ff92SAndroid Build Coastguard Worker #if defined(__clang__) &&((__clang_major__>=3)||(__clang_major__==3 && __clang_minor__ >= 5))
20*89c4ff92SAndroid Build Coastguard Worker #   define ARM_PIPE_FALLTHROUGH [[clang::fallthrough]]
21*89c4ff92SAndroid Build Coastguard Worker #elif defined(__GNUC__) && (__GNUC__ >= 7)
22*89c4ff92SAndroid Build Coastguard Worker #   define ARM_PIPE_FALLTHROUGH __attribute__((fallthrough))
23*89c4ff92SAndroid Build Coastguard Worker #else
24*89c4ff92SAndroid Build Coastguard Worker #   define ARM_PIPE_FALLTHROUGH ((void)0)
25*89c4ff92SAndroid Build Coastguard Worker #endif
26*89c4ff92SAndroid Build Coastguard Worker 
27*89c4ff92SAndroid Build Coastguard Worker enum class LogSeverity
28*89c4ff92SAndroid Build Coastguard Worker {
29*89c4ff92SAndroid Build Coastguard Worker     Trace,
30*89c4ff92SAndroid Build Coastguard Worker     Debug,
31*89c4ff92SAndroid Build Coastguard Worker     Info,
32*89c4ff92SAndroid Build Coastguard Worker     Warning,
33*89c4ff92SAndroid Build Coastguard Worker     Error,
34*89c4ff92SAndroid Build Coastguard Worker     Fatal
35*89c4ff92SAndroid Build Coastguard Worker };
36*89c4ff92SAndroid Build Coastguard Worker 
LevelToString(LogSeverity level)37*89c4ff92SAndroid Build Coastguard Worker inline std::string LevelToString(LogSeverity level)
38*89c4ff92SAndroid Build Coastguard Worker {
39*89c4ff92SAndroid Build Coastguard Worker     switch(level)
40*89c4ff92SAndroid Build Coastguard Worker     {
41*89c4ff92SAndroid Build Coastguard Worker         case LogSeverity::Trace:
42*89c4ff92SAndroid Build Coastguard Worker             return "Trace";
43*89c4ff92SAndroid Build Coastguard Worker         case LogSeverity::Debug:
44*89c4ff92SAndroid Build Coastguard Worker             return "Debug";
45*89c4ff92SAndroid Build Coastguard Worker         case LogSeverity::Info:
46*89c4ff92SAndroid Build Coastguard Worker             return "Info";
47*89c4ff92SAndroid Build Coastguard Worker         case LogSeverity::Warning:
48*89c4ff92SAndroid Build Coastguard Worker             return "Warning";
49*89c4ff92SAndroid Build Coastguard Worker         case LogSeverity::Error:
50*89c4ff92SAndroid Build Coastguard Worker             return "Error";
51*89c4ff92SAndroid Build Coastguard Worker         case LogSeverity::Fatal:
52*89c4ff92SAndroid Build Coastguard Worker             return "Fatal";
53*89c4ff92SAndroid Build Coastguard Worker         default:
54*89c4ff92SAndroid Build Coastguard Worker             return "Log";
55*89c4ff92SAndroid Build Coastguard Worker     }
56*89c4ff92SAndroid Build Coastguard Worker }
57*89c4ff92SAndroid Build Coastguard Worker 
58*89c4ff92SAndroid Build Coastguard Worker /// Configures the logging behaviour of the ARMNN library.
59*89c4ff92SAndroid Build Coastguard Worker ///     printToStandardOutput: Set to true if log messages should be printed to the standard output.
60*89c4ff92SAndroid Build Coastguard Worker ///     printToDebugOutput: Set to true if log messages be printed to a platform-specific debug output
61*89c4ff92SAndroid Build Coastguard Worker ///       (where supported).
62*89c4ff92SAndroid Build Coastguard Worker ///     severity: All log messages that are at this severity level or higher will be printed, others will be ignored.
63*89c4ff92SAndroid Build Coastguard Worker void ConfigureLogging(bool printToStandardOutput, bool printToDebugOutput, LogSeverity severity);
64*89c4ff92SAndroid Build Coastguard Worker 
65*89c4ff92SAndroid Build Coastguard Worker class LogSink
66*89c4ff92SAndroid Build Coastguard Worker {
67*89c4ff92SAndroid Build Coastguard Worker public:
~LogSink()68*89c4ff92SAndroid Build Coastguard Worker     virtual ~LogSink(){};
69*89c4ff92SAndroid Build Coastguard Worker 
70*89c4ff92SAndroid Build Coastguard Worker     virtual void Consume(const std::string&) = 0;
71*89c4ff92SAndroid Build Coastguard Worker private:
72*89c4ff92SAndroid Build Coastguard Worker 
73*89c4ff92SAndroid Build Coastguard Worker };
74*89c4ff92SAndroid Build Coastguard Worker 
75*89c4ff92SAndroid Build Coastguard Worker class StandardOutputSink : public LogSink
76*89c4ff92SAndroid Build Coastguard Worker {
77*89c4ff92SAndroid Build Coastguard Worker public:
Consume(const std::string & s)78*89c4ff92SAndroid Build Coastguard Worker     void Consume(const std::string& s) override
79*89c4ff92SAndroid Build Coastguard Worker     {
80*89c4ff92SAndroid Build Coastguard Worker         std::cout << s << std::endl;
81*89c4ff92SAndroid Build Coastguard Worker     }
82*89c4ff92SAndroid Build Coastguard Worker };
83*89c4ff92SAndroid Build Coastguard Worker 
84*89c4ff92SAndroid Build Coastguard Worker struct ScopedRecord
85*89c4ff92SAndroid Build Coastguard Worker {
ScopedRecordarm::pipe::ScopedRecord86*89c4ff92SAndroid Build Coastguard Worker     ScopedRecord(const std::vector<std::shared_ptr<LogSink>>& sinks, LogSeverity level, bool enabled)
87*89c4ff92SAndroid Build Coastguard Worker     : m_LogSinks(sinks)
88*89c4ff92SAndroid Build Coastguard Worker     , m_Enabled(enabled)
89*89c4ff92SAndroid Build Coastguard Worker     {
90*89c4ff92SAndroid Build Coastguard Worker         if (enabled)
91*89c4ff92SAndroid Build Coastguard Worker         {
92*89c4ff92SAndroid Build Coastguard Worker             m_Os << LevelToString(level) << ": ";
93*89c4ff92SAndroid Build Coastguard Worker         }
94*89c4ff92SAndroid Build Coastguard Worker     }
95*89c4ff92SAndroid Build Coastguard Worker 
~ScopedRecordarm::pipe::ScopedRecord96*89c4ff92SAndroid Build Coastguard Worker     ~ScopedRecord()
97*89c4ff92SAndroid Build Coastguard Worker     {
98*89c4ff92SAndroid Build Coastguard Worker         if (m_Enabled)
99*89c4ff92SAndroid Build Coastguard Worker         {
100*89c4ff92SAndroid Build Coastguard Worker             for (auto sink : m_LogSinks)
101*89c4ff92SAndroid Build Coastguard Worker             {
102*89c4ff92SAndroid Build Coastguard Worker                 if (sink)
103*89c4ff92SAndroid Build Coastguard Worker                 {
104*89c4ff92SAndroid Build Coastguard Worker                     sink->Consume(m_Os.str());
105*89c4ff92SAndroid Build Coastguard Worker                 }
106*89c4ff92SAndroid Build Coastguard Worker             }
107*89c4ff92SAndroid Build Coastguard Worker         }
108*89c4ff92SAndroid Build Coastguard Worker     }
109*89c4ff92SAndroid Build Coastguard Worker 
110*89c4ff92SAndroid Build Coastguard Worker     ScopedRecord(const ScopedRecord&) = delete;
111*89c4ff92SAndroid Build Coastguard Worker     ScopedRecord& operator=(const ScopedRecord&) = delete;
112*89c4ff92SAndroid Build Coastguard Worker     ScopedRecord& operator=(ScopedRecord&&) = delete;
113*89c4ff92SAndroid Build Coastguard Worker 
114*89c4ff92SAndroid Build Coastguard Worker     ScopedRecord(ScopedRecord&& other) = default;
115*89c4ff92SAndroid Build Coastguard Worker 
116*89c4ff92SAndroid Build Coastguard Worker     template<typename Streamable>
operator <<arm::pipe::ScopedRecord117*89c4ff92SAndroid Build Coastguard Worker     ScopedRecord& operator<<(const Streamable& s)
118*89c4ff92SAndroid Build Coastguard Worker     {
119*89c4ff92SAndroid Build Coastguard Worker         if (m_Enabled)
120*89c4ff92SAndroid Build Coastguard Worker         {
121*89c4ff92SAndroid Build Coastguard Worker             m_Os << s;
122*89c4ff92SAndroid Build Coastguard Worker         }
123*89c4ff92SAndroid Build Coastguard Worker         return (*this);
124*89c4ff92SAndroid Build Coastguard Worker     }
125*89c4ff92SAndroid Build Coastguard Worker 
126*89c4ff92SAndroid Build Coastguard Worker private:
127*89c4ff92SAndroid Build Coastguard Worker     const std::vector<std::shared_ptr<LogSink>>& m_LogSinks;
128*89c4ff92SAndroid Build Coastguard Worker     std::ostringstream m_Os;
129*89c4ff92SAndroid Build Coastguard Worker     bool m_Enabled;
130*89c4ff92SAndroid Build Coastguard Worker };
131*89c4ff92SAndroid Build Coastguard Worker 
132*89c4ff92SAndroid Build Coastguard Worker template<LogSeverity Level>
133*89c4ff92SAndroid Build Coastguard Worker class SimpleLogger
134*89c4ff92SAndroid Build Coastguard Worker {
135*89c4ff92SAndroid Build Coastguard Worker public:
SimpleLogger()136*89c4ff92SAndroid Build Coastguard Worker     SimpleLogger()
137*89c4ff92SAndroid Build Coastguard Worker         : m_Sinks{std::make_shared<StandardOutputSink>()}
138*89c4ff92SAndroid Build Coastguard Worker         , m_Enable(true)
139*89c4ff92SAndroid Build Coastguard Worker     {
140*89c4ff92SAndroid Build Coastguard Worker     }
141*89c4ff92SAndroid Build Coastguard Worker 
Get()142*89c4ff92SAndroid Build Coastguard Worker     static SimpleLogger<Level>& Get()
143*89c4ff92SAndroid Build Coastguard Worker     {
144*89c4ff92SAndroid Build Coastguard Worker         static SimpleLogger<Level> logger;
145*89c4ff92SAndroid Build Coastguard Worker         return logger;
146*89c4ff92SAndroid Build Coastguard Worker     }
147*89c4ff92SAndroid Build Coastguard Worker 
Enable(bool enable=true)148*89c4ff92SAndroid Build Coastguard Worker     void Enable(bool enable = true)
149*89c4ff92SAndroid Build Coastguard Worker     {
150*89c4ff92SAndroid Build Coastguard Worker         m_Enable = enable;
151*89c4ff92SAndroid Build Coastguard Worker     }
152*89c4ff92SAndroid Build Coastguard Worker 
StartNewRecord()153*89c4ff92SAndroid Build Coastguard Worker     ScopedRecord StartNewRecord()
154*89c4ff92SAndroid Build Coastguard Worker     {
155*89c4ff92SAndroid Build Coastguard Worker         ScopedRecord record(m_Sinks, Level, m_Enable);
156*89c4ff92SAndroid Build Coastguard Worker         return record;
157*89c4ff92SAndroid Build Coastguard Worker     }
158*89c4ff92SAndroid Build Coastguard Worker 
RemoveAllSinks()159*89c4ff92SAndroid Build Coastguard Worker     void RemoveAllSinks()
160*89c4ff92SAndroid Build Coastguard Worker     {
161*89c4ff92SAndroid Build Coastguard Worker         m_Sinks.clear();
162*89c4ff92SAndroid Build Coastguard Worker     }
163*89c4ff92SAndroid Build Coastguard Worker 
AddSink(std::shared_ptr<LogSink> sink)164*89c4ff92SAndroid Build Coastguard Worker     void AddSink(std::shared_ptr<LogSink> sink)
165*89c4ff92SAndroid Build Coastguard Worker     {
166*89c4ff92SAndroid Build Coastguard Worker         m_Sinks.push_back(sink);
167*89c4ff92SAndroid Build Coastguard Worker     }
168*89c4ff92SAndroid Build Coastguard Worker private:
169*89c4ff92SAndroid Build Coastguard Worker     std::vector<std::shared_ptr<LogSink>> m_Sinks;
170*89c4ff92SAndroid Build Coastguard Worker     bool m_Enable;
171*89c4ff92SAndroid Build Coastguard Worker };
172*89c4ff92SAndroid Build Coastguard Worker 
173*89c4ff92SAndroid Build Coastguard Worker void SetLogFilter(LogSeverity level);
174*89c4ff92SAndroid Build Coastguard Worker 
175*89c4ff92SAndroid Build Coastguard Worker void SetAllLoggingSinks(bool standardOut, bool debugOut, bool coloured);
176*89c4ff92SAndroid Build Coastguard Worker 
177*89c4ff92SAndroid Build Coastguard Worker enum class BoostLogSeverityMapping
178*89c4ff92SAndroid Build Coastguard Worker {
179*89c4ff92SAndroid Build Coastguard Worker     trace,
180*89c4ff92SAndroid Build Coastguard Worker     debug,
181*89c4ff92SAndroid Build Coastguard Worker     info,
182*89c4ff92SAndroid Build Coastguard Worker     warning,
183*89c4ff92SAndroid Build Coastguard Worker     error,
184*89c4ff92SAndroid Build Coastguard Worker     fatal
185*89c4ff92SAndroid Build Coastguard Worker };
186*89c4ff92SAndroid Build Coastguard Worker 
ConvertLogSeverity(BoostLogSeverityMapping severity)187*89c4ff92SAndroid Build Coastguard Worker constexpr LogSeverity ConvertLogSeverity(BoostLogSeverityMapping severity)
188*89c4ff92SAndroid Build Coastguard Worker {
189*89c4ff92SAndroid Build Coastguard Worker     return static_cast<LogSeverity>(severity);
190*89c4ff92SAndroid Build Coastguard Worker }
191*89c4ff92SAndroid Build Coastguard Worker 
192*89c4ff92SAndroid Build Coastguard Worker 
193*89c4ff92SAndroid Build Coastguard Worker #define ARM_PIPE_LOG(severity) \
194*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::SimpleLogger<ConvertLogSeverity(arm::pipe::BoostLogSeverityMapping::severity)>::Get().StartNewRecord()
195*89c4ff92SAndroid Build Coastguard Worker 
196*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe
197*89c4ff92SAndroid Build Coastguard Worker } // namespace arm
198