xref: /aosp_15_r20/external/armnn/profiling/client/src/ProfilingUtils.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #pragma once
7 
8 #include "IPacketBuffer.hpp"
9 
10 #include <client/include/ISendTimelinePacket.hpp>
11 
12 #include <common/include/ICounterDirectory.hpp>
13 #include <common/include/Packet.hpp>
14 #include <common/include/ProfilingException.hpp>
15 
16 #include <algorithm>
17 #include <cstring>
18 #include <memory>
19 #include <string>
20 #include <thread>
21 #include <vector>
22 
23 namespace arm
24 {
25 
26 namespace pipe
27 {
28 
29 constexpr unsigned int ThreadIdSize = sizeof(int); // Is platform dependent
30 
31 void WriteBytes(const IPacketBuffer& packetBuffer, unsigned int offset, const void* value, unsigned int valueSize);
32 
33 uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetId);
34 
35 uint32_t ConstructHeader(uint32_t packetFamily, uint32_t packetClass, uint32_t packetType);
36 
37 void WriteUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint64_t value);
38 
39 void WriteUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint32_t value);
40 
41 void WriteUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint16_t value);
42 
43 void WriteUint8(const IPacketBufferPtr& packetBuffer, unsigned int offset, uint8_t value);
44 
45 void WriteBytes(unsigned char* buffer, unsigned int offset, const void* value, unsigned int valueSize);
46 
47 void WriteUint64(unsigned char* buffer, unsigned int offset, uint64_t value);
48 
49 void WriteUint32(unsigned char* buffer, unsigned int offset, uint32_t value);
50 
51 void WriteUint16(unsigned char* buffer, unsigned int offset, uint16_t value);
52 
53 void WriteUint8(unsigned char* buffer, unsigned int offset, uint8_t value);
54 
55 void ReadBytes(const IPacketBufferPtr& packetBuffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]);
56 
57 uint64_t ReadUint64(const IPacketBufferPtr& packetBuffer, unsigned int offset);
58 
59 uint32_t ReadUint32(const IPacketBufferPtr& packetBuffer, unsigned int offset);
60 
61 uint16_t ReadUint16(const IPacketBufferPtr& packetBuffer, unsigned int offset);
62 
63 uint8_t ReadUint8(const IPacketBufferPtr& packetBuffer, unsigned int offset);
64 
65 void ReadBytes(const unsigned char* buffer, unsigned int offset, unsigned int valueSize, uint8_t outValue[]);
66 
67 uint64_t ReadUint64(unsigned const char* buffer, unsigned int offset);
68 
69 uint32_t ReadUint32(unsigned const char* buffer, unsigned int offset);
70 
71 uint16_t ReadUint16(unsigned const char* buffer, unsigned int offset);
72 
73 uint8_t ReadUint8(unsigned const char* buffer, unsigned int offset);
74 
75 std::pair<uint32_t, uint32_t> CreateTimelinePacketHeader(uint32_t packetFamily,
76                                                          uint32_t packetClass,
77                                                          uint32_t packetType,
78                                                          uint32_t streamId,
79                                                          uint32_t sequenceNumbered,
80                                                          uint32_t dataLength);
81 
82 std::string GetProcessName();
83 
84 enum class TimelinePacketStatus
85 {
86     Ok,
87     Error,
88     BufferExhaustion
89 };
90 
91 TimelinePacketStatus WriteTimelineLabelBinaryPacket(uint64_t profilingGuid,
92                                                     const std::string& label,
93                                                     unsigned char* buffer,
94                                                     unsigned int bufferSize,
95                                                     unsigned int& numberOfBytesWritten);
96 
97 TimelinePacketStatus WriteTimelineEntityBinary(uint64_t profilingGuid,
98                                                unsigned char* buffer,
99                                                unsigned int bufferSize,
100                                                unsigned int& numberOfBytesWritten);
101 
102 TimelinePacketStatus WriteTimelineRelationshipBinary(ProfilingRelationshipType relationshipType,
103                                                      uint64_t relationshipGuid,
104                                                      uint64_t headGuid,
105                                                      uint64_t tailGuid,
106                                                      uint64_t attributeGuid,
107                                                      unsigned char* buffer,
108                                                      unsigned int bufferSize,
109                                                      unsigned int& numberOfBytesWritten);
110 
111 TimelinePacketStatus WriteTimelineMessageDirectoryPackage(unsigned char* buffer,
112                                                           unsigned int bufferSize,
113                                                           unsigned int& numberOfBytesWritten);
114 
115 TimelinePacketStatus WriteTimelineEventClassBinary(uint64_t profilingGuid,
116                                                    uint64_t nameGuid,
117                                                    unsigned char* buffer,
118                                                    unsigned int bufferSize,
119                                                    unsigned int& numberOfBytesWritten);
120 
121 TimelinePacketStatus WriteTimelineEventBinary(uint64_t timestamp,
122                                               int threadId,
123                                               uint64_t profilingGuid,
124                                               unsigned char* buffer,
125                                               unsigned int bufferSize,
126                                               unsigned int& numberOfBytesWritten);
127 
128 std::string CentreAlignFormatting(const std::string& stringToPass, const int spacingWidth);
129 
130 uint64_t GetTimestamp();
131 
132 arm::pipe::Packet ReceivePacket(const unsigned char* buffer, uint32_t length);
133 
134 } // namespace pipe
135 
136 } // namespace arm
137 
138 namespace std
139 {
140 
141 bool operator==(const std::vector<uint8_t>& left, int right);
142 
143 } // namespace std
144