diff options
author | Sadik Armagan <sadik.armagan@arm.com> | 2019-10-24 10:26:05 +0100 |
---|---|---|
committer | Jim Flynn Arm <jim.flynn@arm.com> | 2019-10-24 10:06:40 +0000 |
commit | 7bbdf9db051f40377a284a28375816e60349376d (patch) | |
tree | dc7d8442cecb2f23ca2f93c8535316ed5207be69 /src/profiling/ProfilingUtils.cpp | |
parent | a87698211b6aaab38424865d200534d96f55dcf2 (diff) | |
download | armnn-7bbdf9db051f40377a284a28375816e60349376d.tar.gz |
IVGCVSW-3950 Create SendTimelinePacket interface and class
* Implemented ISendTimelinePacket interface and its implementation SendTimelinePacket
* Implemented TimelinePacketWriterFactory
* Implemented unit tests for SendTimelinePacket functions
Signed-off-by: Sadik Armagan <sadik.armagan@arm.com>
Change-Id: I0a47586437f99510394d4d94589dccfb397d38e5
Diffstat (limited to 'src/profiling/ProfilingUtils.cpp')
-rw-r--r-- | src/profiling/ProfilingUtils.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/profiling/ProfilingUtils.cpp b/src/profiling/ProfilingUtils.cpp index f4d4f8fa44..905ecb559d 100644 --- a/src/profiling/ProfilingUtils.cpp +++ b/src/profiling/ProfilingUtils.cpp @@ -279,6 +279,91 @@ std::pair<uint32_t, uint32_t> CreateTimelinePacketHeader(uint32_t packetFamily, return std::make_pair(packetHeaderWord0, packetHeaderWord1); } +// Calculate the actual length an SwString will be including the terminating null character +// padding to bring it to the next uint32_t boundary but minus the leading uint32_t encoding +// the size to allow the offset to be correctly updated when decoding a binary packet. +uint32_t CalculateSizeOfPaddedSwString(const std::string& str) +{ + std::vector<uint32_t> swTraceString; + StringToSwTraceString<SwTraceCharPolicy>(str, swTraceString); + unsigned int uint32_t_size = sizeof(uint32_t); + uint32_t size = (boost::numeric_cast<uint32_t>(swTraceString.size()) - 1) * uint32_t_size; + return size; +} + +// Read TimelineMessageDirectoryPacket from given IPacketBuffer and offset +SwTraceMessage ReadSwTraceMessage(const std::unique_ptr<IPacketBuffer>& packetBuffer, unsigned int& offset) +{ + BOOST_ASSERT(packetBuffer); + + unsigned int uint32_t_size = sizeof(uint32_t); + + SwTraceMessage swTraceMessage; + + // Read the decl_id + uint32_t readDeclId = ReadUint32(packetBuffer, offset); + swTraceMessage.id = readDeclId; + + // SWTrace "namestring" format + // length of the string (first 4 bytes) + string + null terminator + + // Check the decl_name + offset += uint32_t_size; + uint32_t swTraceDeclNameLength = ReadUint32(packetBuffer, offset); + + offset += uint32_t_size; + std::vector<unsigned char> swTraceStringBuffer(swTraceDeclNameLength - 1); + std::memcpy(swTraceStringBuffer.data(), + packetBuffer->GetReadableData() + offset, swTraceStringBuffer.size()); + + swTraceMessage.name.assign(swTraceStringBuffer.begin(), swTraceStringBuffer.end()); // name + + // Check the ui_name + offset += CalculateSizeOfPaddedSwString(swTraceMessage.name); + uint32_t swTraceUINameLength = ReadUint32(packetBuffer, offset); + + offset += uint32_t_size; + swTraceStringBuffer.resize(swTraceUINameLength - 1); + std::memcpy(swTraceStringBuffer.data(), + packetBuffer->GetReadableData() + offset, swTraceStringBuffer.size()); + + swTraceMessage.uiName.assign(swTraceStringBuffer.begin(), swTraceStringBuffer.end()); // ui_name + + // Check arg_types + offset += CalculateSizeOfPaddedSwString(swTraceMessage.uiName); + uint32_t swTraceArgTypesLength = ReadUint32(packetBuffer, offset); + + offset += uint32_t_size; + swTraceStringBuffer.resize(swTraceArgTypesLength - 1); + std::memcpy(swTraceStringBuffer.data(), + packetBuffer->GetReadableData() + offset, swTraceStringBuffer.size()); + + swTraceMessage.argTypes.assign(swTraceStringBuffer.begin(), swTraceStringBuffer.end()); // arg_types + + std::string swTraceString(swTraceStringBuffer.begin(), swTraceStringBuffer.end()); + + // Check arg_names + offset += CalculateSizeOfPaddedSwString(swTraceString); + uint32_t swTraceArgNamesLength = ReadUint32(packetBuffer, offset); + + offset += uint32_t_size; + swTraceStringBuffer.resize(swTraceArgNamesLength - 1); + std::memcpy(swTraceStringBuffer.data(), + packetBuffer->GetReadableData() + offset, swTraceStringBuffer.size()); + + swTraceString.assign(swTraceStringBuffer.begin(), swTraceStringBuffer.end()); + std::stringstream stringStream(swTraceString); + std::string argName; + while (std::getline(stringStream, argName, ',')) + { + swTraceMessage.argNames.push_back(argName); + } + + offset += CalculateSizeOfPaddedSwString(swTraceString); + + return swTraceMessage; +} + /// Creates a packet header for the timeline messages: /// * declareLabel /// * declareEntity |