#include "HighLevelBreakdown.h" #include namespace mapfileparser { static bool Contains(const std::string& haystack, const std::string& needle) { return haystack.find(needle) != std::string::npos; } static bool EndsWith(const std::string& haystack, const std::string& needle) { if (haystack.length() >= needle.length()) return 0 == haystack.compare(haystack.length() - needle.length(), needle.length(), needle); return false; } static int Percent(int64_t value, int64_t total) { return static_cast(static_cast(value) / static_cast(total) * 100.0f); } static void FormatOutput(std::ostream& out, const std::string& name, int64_t value, int64_t total) { out << name << ": " << value << " bytes (" << Percent(value, total) << "%)" << std::endl; } static bool IsGeneratedCode(const std::string& objectFile) { return Contains(objectFile, "Bulk_") || Contains(objectFile, "Il2Cpp"); } static bool IsOtherCode(const std::string& objectFile) { // This only makes sense for clang output. return EndsWith(objectFile, ".o)"); } std::string HighLevelBreakdown(const std::vector& symbols) { int64_t totalCodeSizeBytes = 0; int64_t generatedCodeSizeBytes = 0; int64_t otherCodeSizeBytes = 0; int64_t engineCodeSizeBytes = 0; for (std::vector::const_iterator symbol = symbols.begin(); symbol != symbols.end(); ++symbol) { if (symbol->segmentType == kSegmentTypeCode) { totalCodeSizeBytes += symbol->length; if (IsGeneratedCode(symbol->objectFile)) generatedCodeSizeBytes += symbol->length; else if (IsOtherCode(symbol->objectFile)) otherCodeSizeBytes += symbol->length; else engineCodeSizeBytes += symbol->length; } } std::stringstream output; output << "High level breakdown of code segments\n"; output << "-------------------------------------\n"; FormatOutput(output, "Total code", totalCodeSizeBytes, totalCodeSizeBytes); FormatOutput(output, "Generated code", generatedCodeSizeBytes, totalCodeSizeBytes); FormatOutput(output, "Engine code", engineCodeSizeBytes, totalCodeSizeBytes); FormatOutput(output, "Other code", otherCodeSizeBytes, totalCodeSizeBytes); return output.str(); } }