diff options
Diffstat (limited to 'llvm/tools/llvm-xray')
-rw-r--r-- | llvm/tools/llvm-xray/trie-node.h | 2 | ||||
-rw-r--r-- | llvm/tools/llvm-xray/xray-color-helper.cpp | 4 | ||||
-rw-r--r-- | llvm/tools/llvm-xray/xray-extract.cpp | 16 | ||||
-rw-r--r-- | llvm/tools/llvm-xray/xray-graph-diff.cpp | 12 | ||||
-rw-r--r-- | llvm/tools/llvm-xray/xray-graph.cpp | 29 | ||||
-rw-r--r-- | llvm/tools/llvm-xray/xray-stacks.cpp | 9 |
6 files changed, 54 insertions, 18 deletions
diff --git a/llvm/tools/llvm-xray/trie-node.h b/llvm/tools/llvm-xray/trie-node.h index 47d4b8f1e78c..7bff81473b5d 100644 --- a/llvm/tools/llvm-xray/trie-node.h +++ b/llvm/tools/llvm-xray/trie-node.h @@ -48,7 +48,7 @@ template <typename T, typename Callable> TrieNode<T> * mergeTrieNodes(const TrieNode<T> &Left, const TrieNode<T> &Right, /*Non-deduced pointer type for nullptr compatibility*/ - typename std::remove_reference<TrieNode<T> *>::type NewParent, + std::remove_reference_t<TrieNode<T> *> NewParent, std::forward_list<TrieNode<T>> &NodeStore, Callable &&MergeCallable) { llvm::function_ref<T(const T &, const T &)> MergeFn( diff --git a/llvm/tools/llvm-xray/xray-color-helper.cpp b/llvm/tools/llvm-xray/xray-color-helper.cpp index c09cad3ba7d2..ea7ff357826b 100644 --- a/llvm/tools/llvm-xray/xray-color-helper.cpp +++ b/llvm/tools/llvm-xray/xray-color-helper.cpp @@ -208,8 +208,8 @@ ColorHelper::getColorTuple(double Point) const { // string. std::string ColorHelper::getColorString(std::tuple<uint8_t, uint8_t, uint8_t> t) { - return llvm::formatv("#{0:X-2}{1:X-2}{2:X-2}", std::get<0>(t), std::get<1>(t), - std::get<2>(t)); + return std::string(llvm::formatv("#{0:X-2}{1:X-2}{2:X-2}", std::get<0>(t), + std::get<1>(t), std::get<2>(t))); } // Gets a color in a gradient given a number in the interval [0,1], it does this diff --git a/llvm/tools/llvm-xray/xray-extract.cpp b/llvm/tools/llvm-xray/xray-extract.cpp index af9255af21c3..8304d2d27afa 100644 --- a/llvm/tools/llvm-xray/xray-extract.cpp +++ b/llvm/tools/llvm-xray/xray-extract.cpp @@ -45,6 +45,11 @@ static cl::opt<bool> ExtractSymbolize("symbolize", cl::value_desc("symbolize"), cl::sub(Extract)); static cl::alias ExtractSymbolize2("s", cl::aliasopt(ExtractSymbolize), cl::desc("alias for -symbolize")); +static cl::opt<bool> ExtractNoDemangle("no-demangle", + cl::value_desc("no-demangle"), + cl::init(false), + cl::desc("don't demangle symbols"), + cl::sub(Extract)); namespace { @@ -58,9 +63,9 @@ void exportAsYAML(const InstrumentationMap &Map, raw_ostream &OS, auto FuncId = Map.getFunctionId(Sled.Function); if (!FuncId) return; - YAMLSleds.push_back({*FuncId, Sled.Address, Sled.Function, Sled.Kind, - Sled.AlwaysInstrument, - ExtractSymbolize ? FH.SymbolOrNumber(*FuncId) : ""}); + YAMLSleds.push_back( + {*FuncId, Sled.Address, Sled.Function, Sled.Kind, Sled.AlwaysInstrument, + ExtractSymbolize ? FH.SymbolOrNumber(*FuncId) : "", Sled.Version}); } Output Out(OS, nullptr, 0); Out << YAMLSleds; @@ -84,7 +89,10 @@ static CommandRegistration Unused(&Extract, []() -> Error { Twine("Cannot open file '") + ExtractOutput + "' for writing.", EC); const auto &FunctionAddresses = InstrumentationMapOrError->getFunctionAddresses(); - symbolize::LLVMSymbolizer Symbolizer; + symbolize::LLVMSymbolizer::Options opts; + if (ExtractNoDemangle) + opts.Demangle = false; + symbolize::LLVMSymbolizer Symbolizer(opts); llvm::xray::FuncIdConversionHelper FuncIdHelper(ExtractInput, Symbolizer, FunctionAddresses); exportAsYAML(*InstrumentationMapOrError, OS, FuncIdHelper); diff --git a/llvm/tools/llvm-xray/xray-graph-diff.cpp b/llvm/tools/llvm-xray/xray-graph-diff.cpp index a1bca326930e..11210e2004a7 100644 --- a/llvm/tools/llvm-xray/xray-graph-diff.cpp +++ b/llvm/tools/llvm-xray/xray-graph-diff.cpp @@ -314,7 +314,7 @@ static std::string getLabel(const GraphDiffRenderer::GraphT::EdgeValueType &E, const auto &RightStat = EdgeAttr.CorrEdgePtr[1]->second.S; double RelDiff = statRelDiff(LeftStat, RightStat, EL); - return formatv(R"({0:P})", RelDiff); + return std::string(formatv(R"({0:P})", RelDiff)); } } @@ -324,17 +324,19 @@ static std::string getLabel(const GraphDiffRenderer::GraphT::VertexValueType &V, const auto &VertexAttr = V.second; switch (VL) { case GraphDiffRenderer::StatType::NONE: - return formatv(R"({0})", truncateString(VertexId, TrunLen).str()); + return std::string( + formatv(R"({0})", truncateString(VertexId, TrunLen).str())); default: if (containsNullptr(VertexAttr.CorrVertexPtr)) - return formatv(R"({0})", truncateString(VertexId, TrunLen).str()); + return std::string( + formatv(R"({0})", truncateString(VertexId, TrunLen).str())); const auto &LeftStat = VertexAttr.CorrVertexPtr[0]->second.S; const auto &RightStat = VertexAttr.CorrVertexPtr[1]->second.S; double RelDiff = statRelDiff(LeftStat, RightStat, VL); - return formatv(R"({{{0}|{1:P}})", truncateString(VertexId, TrunLen).str(), - RelDiff); + return std::string(formatv( + R"({{{0}|{1:P}})", truncateString(VertexId, TrunLen).str(), RelDiff)); } } diff --git a/llvm/tools/llvm-xray/xray-graph.cpp b/llvm/tools/llvm-xray/xray-graph.cpp index f836f9ba54fc..522609b938f2 100644 --- a/llvm/tools/llvm-xray/xray-graph.cpp +++ b/llvm/tools/llvm-xray/xray-graph.cpp @@ -163,6 +163,30 @@ static void updateStat(GraphRenderer::TimeStat &S, int64_t L) { S.Sum += L; } +// Labels in a DOT graph must be legal XML strings so it's necessary to escape +// certain characters. +static std::string escapeString(StringRef Label) { + std::string Str; + Str.reserve(Label.size()); + for (const auto C : Label) { + switch (C) { + case '&': + Str.append("&"); + break; + case '<': + Str.append("<"); + break; + case '>': + Str.append(">"); + break; + default: + Str.push_back(C); + break; + } + } + return Str; +} + // Evaluates an XRay record and performs accounting on it. // // If the record is an ENTER record it pushes the FuncID and TSC onto a @@ -398,8 +422,9 @@ void GraphRenderer::exportGraphAsDOT(raw_ostream &OS, StatType ET, StatType EC, if (V.first == 0) continue; OS << "F" << V.first << " [label=\"" << (VT != StatType::NONE ? "{" : "") - << (VA.SymbolName.size() > 40 ? VA.SymbolName.substr(0, 40) + "..." - : VA.SymbolName); + << escapeString(VA.SymbolName.size() > 40 + ? VA.SymbolName.substr(0, 40) + "..." + : VA.SymbolName); if (VT != StatType::NONE) OS << "|" << VA.S.getString(VT) << "}\""; else diff --git a/llvm/tools/llvm-xray/xray-stacks.cpp b/llvm/tools/llvm-xray/xray-stacks.cpp index cf292887b6b8..1e4490289534 100644 --- a/llvm/tools/llvm-xray/xray-stacks.cpp +++ b/llvm/tools/llvm-xray/xray-stacks.cpp @@ -674,11 +674,12 @@ std::string CreateErrorMessage(StackTrie::AccountRecordStatus Error, const FuncIdConversionHelper &Converter) { switch (Error) { case StackTrie::AccountRecordStatus::ENTRY_NOT_FOUND: - return formatv("Found record {0} with no matching function entry\n", - format_xray_record(Record, Converter)); + return std::string( + formatv("Found record {0} with no matching function entry\n", + format_xray_record(Record, Converter))); default: - return formatv("Unknown error type for record {0}\n", - format_xray_record(Record, Converter)); + return std::string(formatv("Unknown error type for record {0}\n", + format_xray_record(Record, Converter))); } } |