reference, declaration → definition definition → references, declarations, derived classes, virtual overrides reference to multiple definitions → definitions unreferenced |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | //===- xray-fc-account.cpp: XRay Function Call Accounting Tool ------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Implementation of the helper tools dealing with XRay-generated function ids. // //===----------------------------------------------------------------------===// #include "func-id-helper.h" #include "llvm/Support/Path.h" #include <sstream> using namespace llvm; using namespace xray; std::string FuncIdConversionHelper::SymbolOrNumber(int32_t FuncId) const { auto CacheIt = CachedNames.find(FuncId); if (CacheIt != CachedNames.end()) return CacheIt->second; std::ostringstream F; auto It = FunctionAddresses.find(FuncId); if (It == FunctionAddresses.end()) { F << "#" << FuncId; return F.str(); } object::SectionedAddress ModuleAddress; ModuleAddress.Address = It->second; // TODO: set proper section index here. // object::SectionedAddress::UndefSection works for only absolute addresses. ModuleAddress.SectionIndex = object::SectionedAddress::UndefSection; if (auto ResOrErr = Symbolizer.symbolizeCode(BinaryInstrMap, ModuleAddress)) { auto &DI = *ResOrErr; if (DI.FunctionName == DILineInfo::BadString) F << "@(" << std::hex << It->second << ")"; else F << DI.FunctionName; } else handleAllErrors(ResOrErr.takeError(), [&](const ErrorInfoBase &) { F << "@(" << std::hex << It->second << ")"; }); auto S = F.str(); CachedNames[FuncId] = S; return S; } std::string FuncIdConversionHelper::FileLineAndColumn(int32_t FuncId) const { auto It = FunctionAddresses.find(FuncId); if (It == FunctionAddresses.end()) return "(unknown)"; std::ostringstream F; object::SectionedAddress ModuleAddress; ModuleAddress.Address = It->second; // TODO: set proper section index here. // object::SectionedAddress::UndefSection works for only absolute addresses. ModuleAddress.SectionIndex = object::SectionedAddress::UndefSection; auto ResOrErr = Symbolizer.symbolizeCode(BinaryInstrMap, ModuleAddress); if (!ResOrErr) { consumeError(ResOrErr.takeError()); return "(unknown)"; } auto &DI = *ResOrErr; F << sys::path::filename(DI.FileName).str() << ":" << DI.Line << ":" << DI.Column; return F.str(); } |