summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-xray
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-xray')
-rw-r--r--llvm/tools/llvm-xray/CMakeLists.txt4
-rw-r--r--llvm/tools/llvm-xray/xray-converter.cc59
-rw-r--r--llvm/tools/llvm-xray/xray-converter.h8
-rw-r--r--llvm/tools/llvm-xray/xray-log-reader.cc163
-rw-r--r--llvm/tools/llvm-xray/xray-log-reader.h57
-rw-r--r--llvm/tools/llvm-xray/xray-record-yaml.h102
-rw-r--r--llvm/tools/llvm-xray/xray-record.h55
7 files changed, 26 insertions, 422 deletions
diff --git a/llvm/tools/llvm-xray/CMakeLists.txt b/llvm/tools/llvm-xray/CMakeLists.txt
index 5b0b854cb29..e8cfe9f709e 100644
--- a/llvm/tools/llvm-xray/CMakeLists.txt
+++ b/llvm/tools/llvm-xray/CMakeLists.txt
@@ -3,14 +3,14 @@ set(LLVM_LINK_COMPONENTS
DebugInfoDWARF
Object
Support
- Symbolize)
+ Symbolize
+ XRay)
set(LLVM_XRAY_TOOLS
func-id-helper.cc
xray-converter.cc
xray-extract.cc
xray-extract.cc
- xray-log-reader.cc
xray-registry.cc)
add_llvm_tool(llvm-xray llvm-xray.cc ${LLVM_XRAY_TOOLS})
diff --git a/llvm/tools/llvm-xray/xray-converter.cc b/llvm/tools/llvm-xray/xray-converter.cc
index 81fdca2d26c..7dfc8374c28 100644
--- a/llvm/tools/llvm-xray/xray-converter.cc
+++ b/llvm/tools/llvm-xray/xray-converter.cc
@@ -13,13 +13,14 @@
#include "xray-converter.h"
#include "xray-extract.h"
-#include "xray-record-yaml.h"
#include "xray-registry.h"
#include "llvm/DebugInfo/Symbolize/Symbolize.h"
#include "llvm/Support/EndianStream.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/YAMLTraits.h"
#include "llvm/Support/raw_ostream.h"
+#include "llvm/XRay/Trace.h"
+#include "llvm/XRay/YAMLXRayRecord.h"
using namespace llvm;
using namespace xray;
@@ -31,15 +32,6 @@ static cl::opt<std::string> ConvertInput(cl::Positional,
cl::desc("<xray log file>"),
cl::Required, cl::sub(Convert));
enum class ConvertFormats { BINARY, YAML };
-static cl::opt<ConvertFormats> ConvertInputFormat(
- "input-format", cl::desc("input format"),
- cl::values(clEnumValN(ConvertFormats::BINARY, "raw",
- "input is in raw binary"),
- clEnumValN(ConvertFormats::YAML, "yaml", "input is in yaml")),
- cl::sub(Convert));
-static cl::alias ConvertInputFormat2("i", cl::aliasopt(ConvertInputFormat),
- cl::desc("Alias for -input-format"),
- cl::sub(Convert));
static cl::opt<ConvertFormats> ConvertOutputFormat(
"output-format", cl::desc("output format"),
cl::values(clEnumValN(ConvertFormats::BINARY, "raw", "output in binary"),
@@ -91,12 +83,10 @@ static cl::alias InstrMapFormat2("t", cl::aliasopt(InstrMapFormat),
cl::desc("Alias for -instr-map-format"),
cl::sub(Convert));
-using llvm::yaml::MappingTraits;
-using llvm::yaml::ScalarEnumerationTraits;
using llvm::yaml::IO;
using llvm::yaml::Output;
-void TraceConverter::exportAsYAML(const LogReader &Records, raw_ostream &OS) {
+void TraceConverter::exportAsYAML(const Trace &Records, raw_ostream &OS) {
YAMLXRayTrace Trace;
const auto &FH = Records.getFileHeader();
Trace.Header = {FH.Version, FH.Type, FH.ConstantTSC, FH.NonstopTSC,
@@ -112,7 +102,7 @@ void TraceConverter::exportAsYAML(const LogReader &Records, raw_ostream &OS) {
Out << Trace;
}
-void TraceConverter::exportAsRAWv1(const LogReader &Records, raw_ostream &OS) {
+void TraceConverter::exportAsRAWv1(const Trace &Records, raw_ostream &OS) {
// First write out the file header, in the correct endian-appropriate format
// (XRay assumes currently little endian).
support::endian::Writer<support::endianness::little> Writer(OS);
@@ -180,24 +170,6 @@ static CommandRegistration Unused(&Convert, []() -> Error {
llvm::xray::FuncIdConversionHelper FuncIdHelper(ConvertInstrMap, Symbolizer,
FunctionAddresses);
llvm::xray::TraceConverter TC(FuncIdHelper, ConvertSymbolize);
- LogReader::LoaderFunction Loader;
- switch (ConvertInputFormat) {
- case ConvertFormats::BINARY:
- Loader = NaiveLogLoader;
- break;
- case ConvertFormats::YAML:
- Loader = YAMLLogLoader;
- break;
- }
-
- LogReader Reader(ConvertInput, Err, ConvertSortInput, Loader);
- if (Err)
- return joinErrors(
- make_error<StringError>(
- Twine("Failed loading input file '") + ConvertInput + "'.",
- std::make_error_code(std::errc::executable_format_error)),
- std::move(Err));
-
raw_fd_ostream OS(ConvertOutput, EC,
ConvertOutputFormat == ConvertFormats::BINARY
? sys::fs::OpenFlags::F_None
@@ -206,13 +178,22 @@ static CommandRegistration Unused(&Convert, []() -> Error {
return make_error<StringError>(
Twine("Cannot open file '") + ConvertOutput + "' for writing.", EC);
- switch (ConvertOutputFormat) {
- case ConvertFormats::YAML:
- TC.exportAsYAML(Reader, OS);
- break;
- case ConvertFormats::BINARY:
- TC.exportAsRAWv1(Reader, OS);
- break;
+ if (auto TraceOrErr = loadTraceFile(ConvertInput, ConvertSortInput)) {
+ auto &T = *TraceOrErr;
+ switch (ConvertOutputFormat) {
+ case ConvertFormats::YAML:
+ TC.exportAsYAML(T, OS);
+ break;
+ case ConvertFormats::BINARY:
+ TC.exportAsRAWv1(T, OS);
+ break;
+ }
+ } else {
+ return joinErrors(
+ make_error<StringError>(
+ Twine("Failed loading input file '") + ConvertInput + "'.",
+ std::make_error_code(std::errc::protocol_error)),
+ TraceOrErr.takeError());
}
return Error::success();
});
diff --git a/llvm/tools/llvm-xray/xray-converter.h b/llvm/tools/llvm-xray/xray-converter.h
index f830c7fa316..fa0d5e132f1 100644
--- a/llvm/tools/llvm-xray/xray-converter.h
+++ b/llvm/tools/llvm-xray/xray-converter.h
@@ -15,8 +15,8 @@
#define LLVM_TOOLS_LLVM_XRAY_XRAY_CONVERTER_H
#include "func-id-helper.h"
-#include "xray-log-reader.h"
-#include "xray-record.h"
+#include "llvm/XRay/XRayRecord.h"
+#include "llvm/XRay/Trace.h"
namespace llvm {
namespace xray {
@@ -29,8 +29,8 @@ public:
TraceConverter(FuncIdConversionHelper &FuncIdHelper, bool Symbolize = false)
: FuncIdHelper(FuncIdHelper), Symbolize(Symbolize) {}
- void exportAsYAML(const LogReader &Records, raw_ostream &OS);
- void exportAsRAWv1(const LogReader &Records, raw_ostream &OS);
+ void exportAsYAML(const Trace &Records, raw_ostream &OS);
+ void exportAsRAWv1(const Trace &Records, raw_ostream &OS);
};
} // namespace xray
diff --git a/llvm/tools/llvm-xray/xray-log-reader.cc b/llvm/tools/llvm-xray/xray-log-reader.cc
deleted file mode 100644
index 1dc745fe59a..00000000000
--- a/llvm/tools/llvm-xray/xray-log-reader.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-//===- xray-log-reader.cc - XRay Log Reader Implementation ----------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// XRay log reader implementation.
-//
-//===----------------------------------------------------------------------===//
-#include "xray-log-reader.h"
-#include "xray-record-yaml.h"
-#include "llvm/Support/DataExtractor.h"
-#include "llvm/Support/FileSystem.h"
-
-using namespace llvm;
-using namespace llvm::xray;
-using llvm::yaml::Input;
-
-LogReader::LogReader(
- StringRef Filename, Error &Err, bool Sort,
- std::function<Error(StringRef, XRayFileHeader &, std::vector<XRayRecord> &)>
- Loader) {
- ErrorAsOutParameter Guard(&Err);
- int Fd;
- if (auto EC = sys::fs::openFileForRead(Filename, Fd)) {
- Err = make_error<StringError>(
- Twine("Cannot read log from '") + Filename + "'", EC);
- return;
- }
- uint64_t FileSize;
- if (auto EC = sys::fs::file_size(Filename, FileSize)) {
- Err = make_error<StringError>(
- Twine("Cannot read log from '") + Filename + "'", EC);
- return;
- }
-
- std::error_code EC;
- sys::fs::mapped_file_region MappedFile(
- Fd, sys::fs::mapped_file_region::mapmode::readonly, FileSize, 0, EC);
- if (EC) {
- Err = make_error<StringError>(
- Twine("Cannot read log from '") + Filename + "'", EC);
- return;
- }
-
- if (auto E = Loader(StringRef(MappedFile.data(), MappedFile.size()),
- FileHeader, Records)) {
- Err = std::move(E);
- return;
- }
-
- if (Sort)
- std::sort(
- Records.begin(), Records.end(),
- [](const XRayRecord &L, const XRayRecord &R) { return L.TSC < R.TSC; });
-}
-
-Error llvm::xray::NaiveLogLoader(StringRef Data, XRayFileHeader &FileHeader,
- std::vector<XRayRecord> &Records) {
- // FIXME: Maybe deduce whether the data is little or big-endian using some
- // magic bytes in the beginning of the file?
-
- // First 32 bytes of the file will always be the header. We assume a certain
- // format here:
- //
- // (2) uint16 : version
- // (2) uint16 : type
- // (4) uint32 : bitfield
- // (8) uint64 : cycle frequency
- // (16) - : padding
- //
- if (Data.size() < 32)
- return make_error<StringError>(
- "Not enough bytes for an XRay log.",
- std::make_error_code(std::errc::invalid_argument));
-
- if (Data.size() - 32 == 0 || Data.size() % 32 != 0)
- return make_error<StringError>(
- "Invalid-sized XRay data.",
- std::make_error_code(std::errc::invalid_argument));
-
- DataExtractor HeaderExtractor(Data, true, 8);
- uint32_t OffsetPtr = 0;
- FileHeader.Version = HeaderExtractor.getU16(&OffsetPtr);
- FileHeader.Type = HeaderExtractor.getU16(&OffsetPtr);
- uint32_t Bitfield = HeaderExtractor.getU32(&OffsetPtr);
- FileHeader.ConstantTSC = Bitfield & 1uL;
- FileHeader.NonstopTSC = Bitfield & 1uL << 1;
- FileHeader.CycleFrequency = HeaderExtractor.getU64(&OffsetPtr);
-
- if (FileHeader.Version != 1)
- return make_error<StringError>(
- Twine("Unsupported XRay file version: ") + Twine(FileHeader.Version),
- std::make_error_code(std::errc::invalid_argument));
-
- // Each record after the header will be 32 bytes, in the following format:
- //
- // (2) uint16 : record type
- // (1) uint8 : cpu id
- // (1) uint8 : type
- // (4) sint32 : function id
- // (8) uint64 : tsc
- // (4) uint32 : thread id
- // (12) - : padding
- for (auto S = Data.drop_front(32); !S.empty(); S = S.drop_front(32)) {
- DataExtractor RecordExtractor(S, true, 8);
- uint32_t OffsetPtr = 0;
- Records.emplace_back();
- auto &Record = Records.back();
- Record.RecordType = RecordExtractor.getU16(&OffsetPtr);
- Record.CPU = RecordExtractor.getU8(&OffsetPtr);
- auto Type = RecordExtractor.getU8(&OffsetPtr);
- switch (Type) {
- case 0:
- Record.Type = RecordTypes::ENTER;
- break;
- case 1:
- Record.Type = RecordTypes::EXIT;
- break;
- default:
- return make_error<StringError>(
- Twine("Unknown record type '") + Twine(int{Type}) + "'",
- std::make_error_code(std::errc::executable_format_error));
- }
- Record.FuncId = RecordExtractor.getSigned(&OffsetPtr, sizeof(int32_t));
- Record.TSC = RecordExtractor.getU64(&OffsetPtr);
- Record.TId = RecordExtractor.getU32(&OffsetPtr);
- }
- return Error::success();
-}
-
-Error llvm::xray::YAMLLogLoader(StringRef Data, XRayFileHeader &FileHeader,
- std::vector<XRayRecord> &Records) {
-
- // Load the documents from the MappedFile.
- YAMLXRayTrace Trace;
- Input In(Data);
- In >> Trace;
- if (In.error())
- return make_error<StringError>("Failed loading YAML Data.", In.error());
-
- FileHeader.Version = Trace.Header.Version;
- FileHeader.Type = Trace.Header.Type;
- FileHeader.ConstantTSC = Trace.Header.ConstantTSC;
- FileHeader.NonstopTSC = Trace.Header.NonstopTSC;
- FileHeader.CycleFrequency = Trace.Header.CycleFrequency;
-
- if (FileHeader.Version != 1)
- return make_error<StringError>(
- Twine("Unsupported XRay file version: ") + Twine(FileHeader.Version),
- std::make_error_code(std::errc::invalid_argument));
-
- Records.clear();
- std::transform(Trace.Records.begin(), Trace.Records.end(),
- std::back_inserter(Records), [&](const YAMLXRayRecord &R) {
- return XRayRecord{R.RecordType, R.CPU, R.Type,
- R.FuncId, R.TSC, R.TId};
- });
- return Error::success();
-}
diff --git a/llvm/tools/llvm-xray/xray-log-reader.h b/llvm/tools/llvm-xray/xray-log-reader.h
deleted file mode 100644
index 4dd544328cf..00000000000
--- a/llvm/tools/llvm-xray/xray-log-reader.h
+++ /dev/null
@@ -1,57 +0,0 @@
-//===- xray-log-reader.h - XRay Log Reader Interface ----------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// Define the interface for an XRay log reader. Currently we only support one
-// version of the log (naive log) with fixed-sized records.
-//
-//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_XRAY_XRAY_LOG_READER_H
-#define LLVM_TOOLS_LLVM_XRAY_XRAY_LOG_READER_H
-
-#include <cstdint>
-#include <deque>
-#include <vector>
-
-#include "xray-record-yaml.h"
-#include "xray-record.h"
-#include "llvm/Support/Error.h"
-#include "llvm/Support/FileSystem.h"
-
-namespace llvm {
-namespace xray {
-
-class LogReader {
- XRayFileHeader FileHeader;
- std::vector<XRayRecord> Records;
-
- typedef std::vector<XRayRecord>::const_iterator citerator;
-
-public:
- typedef std::function<Error(StringRef, XRayFileHeader &,
- std::vector<XRayRecord> &)>
- LoaderFunction;
-
- LogReader(StringRef Filename, Error &Err, bool Sort, LoaderFunction Loader);
-
- const XRayFileHeader &getFileHeader() const { return FileHeader; }
-
- citerator begin() const { return Records.begin(); }
- citerator end() const { return Records.end(); }
- size_t size() const { return Records.size(); }
-};
-
-Error NaiveLogLoader(StringRef Data, XRayFileHeader &FileHeader,
- std::vector<XRayRecord> &Records);
-Error YAMLLogLoader(StringRef Data, XRayFileHeader &FileHeader,
- std::vector<XRayRecord> &Records);
-
-} // namespace xray
-} // namespace llvm
-
-#endif // LLVM_TOOLS_LLVM_XRAY_XRAY_LOG_READER_H
diff --git a/llvm/tools/llvm-xray/xray-record-yaml.h b/llvm/tools/llvm-xray/xray-record-yaml.h
deleted file mode 100644
index abce8ff60a9..00000000000
--- a/llvm/tools/llvm-xray/xray-record-yaml.h
+++ /dev/null
@@ -1,102 +0,0 @@
-//===- xray-record-yaml.h - XRay Record YAML Support Definitions ----------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// Types and traits specialisations for YAML I/O of XRay log entries.
-//
-//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_XRAY_XRAY_RECORD_YAML_H
-#define LLVM_TOOLS_LLVM_XRAY_XRAY_RECORD_YAML_H
-
-#include <type_traits>
-
-#include "xray-record.h"
-#include "llvm/Support/YAMLTraits.h"
-
-namespace llvm {
-namespace xray {
-
-struct YAMLXRayFileHeader {
- uint16_t Version;
- uint16_t Type;
- bool ConstantTSC;
- bool NonstopTSC;
- uint64_t CycleFrequency;
-};
-
-struct YAMLXRayRecord {
- uint16_t RecordType;
- uint8_t CPU;
- RecordTypes Type;
- int32_t FuncId;
- std::string Function;
- uint64_t TSC;
- uint32_t TId;
-};
-
-struct YAMLXRayTrace {
- YAMLXRayFileHeader Header;
- std::vector<YAMLXRayRecord> Records;
-};
-
-using XRayRecordStorage =
- std::aligned_storage<sizeof(XRayRecord), alignof(XRayRecord)>::type;
-
-} // namespace xray
-
-namespace yaml {
-
-// YAML Traits
-// -----------
-template <> struct ScalarEnumerationTraits<xray::RecordTypes> {
- static void enumeration(IO &IO, xray::RecordTypes &Type) {
- IO.enumCase(Type, "function-enter", xray::RecordTypes::ENTER);
- IO.enumCase(Type, "function-exit", xray::RecordTypes::EXIT);
- }
-};
-
-template <> struct MappingTraits<xray::YAMLXRayFileHeader> {
- static void mapping(IO &IO, xray::YAMLXRayFileHeader &Header) {
- IO.mapRequired("version", Header.Version);
- IO.mapRequired("type", Header.Type);
- IO.mapRequired("constant-tsc", Header.ConstantTSC);
- IO.mapRequired("nonstop-tsc", Header.NonstopTSC);
- IO.mapRequired("cycle-frequency", Header.CycleFrequency);
- }
-};
-
-template <> struct MappingTraits<xray::YAMLXRayRecord> {
- static void mapping(IO &IO, xray::YAMLXRayRecord &Record) {
- // FIXME: Make this type actually be descriptive
- IO.mapRequired("type", Record.RecordType);
- IO.mapRequired("func-id", Record.FuncId);
- IO.mapOptional("function", Record.Function);
- IO.mapRequired("cpu", Record.CPU);
- IO.mapRequired("thread", Record.TId);
- IO.mapRequired("kind", Record.Type);
- IO.mapRequired("tsc", Record.TSC);
- }
-
- static constexpr bool flow = true;
-};
-
-template <> struct MappingTraits<xray::YAMLXRayTrace> {
- static void mapping(IO &IO, xray::YAMLXRayTrace &Trace) {
- // A trace file contains two parts, the header and the list of all the
- // trace records.
- IO.mapRequired("header", Trace.Header);
- IO.mapRequired("records", Trace.Records);
- }
-};
-
-} // namespace yaml
-} // namespace llvm
-
-LLVM_YAML_IS_SEQUENCE_VECTOR(xray::YAMLXRayRecord)
-
-#endif // LLVM_TOOLS_LLVM_XRAY_XRAY_RECORD_YAML_H
diff --git a/llvm/tools/llvm-xray/xray-record.h b/llvm/tools/llvm-xray/xray-record.h
deleted file mode 100644
index 4a794d1dcfa..00000000000
--- a/llvm/tools/llvm-xray/xray-record.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//===- xray-record.h - XRay Trace Record ----------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file replicates the record definition for XRay log entries. This should
-// follow the evolution of the log record versions supported in the compiler-rt
-// xray project.
-//
-//===----------------------------------------------------------------------===//
-#ifndef LLVM_TOOLS_LLVM_XRAY_XRAY_RECORD_H
-#define LLVM_TOOLS_LLVM_XRAY_XRAY_RECORD_H
-
-#include <cstdint>
-
-namespace llvm {
-namespace xray {
-
-struct XRayFileHeader {
- uint16_t Version = 0;
- uint16_t Type = 0;
- bool ConstantTSC;
- bool NonstopTSC;
- uint64_t CycleFrequency = 0;
-};
-
-enum class RecordTypes { ENTER, EXIT };
-
-struct XRayRecord {
- uint16_t RecordType;
-
- // The CPU where the thread is running. We assume number of CPUs <= 256.
- uint8_t CPU;
-
- // Identifies the type of record.
- RecordTypes Type;
-
- // The function ID for the record.
- int32_t FuncId;
-
- // Get the full 8 bytes of the TSC when we get the log record.
- uint64_t TSC;
-
- // The thread ID for the currently running thread.
- uint32_t TId;
-};
-
-} // namespace xray
-} // namespace llvm
-
-#endif // LLVM_TOOLS_LLVM_XRAY_XRAY_RECORD_H
OpenPOWER on IntegriCloud