brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.2 KiB · 5ff8dc1 Raw
98 lines · cpp
1//===- xray-extract.cpp: XRay Instrumentation Map Extraction --------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Implementation of the xray-extract.h interface.10//11// FIXME: Support other XRay-instrumented binary formats other than ELF.12//13//===----------------------------------------------------------------------===//14 15 16#include "func-id-helper.h"17#include "xray-registry.h"18#include "llvm/Object/ObjectFile.h"19#include "llvm/Support/CommandLine.h"20#include "llvm/Support/Error.h"21#include "llvm/Support/FileSystem.h"22#include "llvm/Support/Format.h"23#include "llvm/Support/raw_ostream.h"24#include "llvm/XRay/InstrumentationMap.h"25 26using namespace llvm;27using namespace llvm::xray;28using namespace llvm::yaml;29 30// llvm-xray extract31// ----------------------------------------------------------------------------32static cl::SubCommand Extract("extract", "Extract instrumentation maps");33static cl::opt<std::string> ExtractInput(cl::Positional,34                                         cl::desc("<input file>"), cl::Required,35                                         cl::sub(Extract));36static cl::opt<std::string>37    ExtractOutput("output", cl::value_desc("output file"), cl::init("-"),38                  cl::desc("output file; use '-' for stdout"),39                  cl::sub(Extract));40static cl::alias ExtractOutput2("o", cl::aliasopt(ExtractOutput),41                                cl::desc("Alias for -output"));42static cl::opt<bool> ExtractSymbolize("symbolize", cl::value_desc("symbolize"),43                                      cl::init(false),44                                      cl::desc("symbolize functions"),45                                      cl::sub(Extract));46static cl::alias ExtractSymbolize2("s", cl::aliasopt(ExtractSymbolize),47                                   cl::desc("alias for -symbolize"));48static cl::opt<bool> Demangle("demangle",49                              cl::desc("demangle symbols (default)"),50                              cl::sub(Extract));51static cl::opt<bool> NoDemangle("no-demangle",52                                cl::desc("don't demangle symbols"),53                                cl::sub(Extract));54 55static void exportAsYAML(const InstrumentationMap &Map, raw_ostream &OS,56                         FuncIdConversionHelper &FH) {57  // First we translate the sleds into the YAMLXRaySledEntry objects in a deque.58  std::vector<YAMLXRaySledEntry> YAMLSleds;59  auto Sleds = Map.sleds();60  YAMLSleds.reserve(llvm::size(Sleds));61  for (const auto &Sled : Sleds) {62    auto FuncId = Map.getFunctionId(Sled.Function);63    if (!FuncId)64      return;65    YAMLSleds.push_back(66        {*FuncId, Sled.Address, Sled.Function, Sled.Kind, Sled.AlwaysInstrument,67         ExtractSymbolize ? FH.SymbolOrNumber(*FuncId) : "", Sled.Version});68  }69  Output Out(OS, nullptr, 0);70  Out << YAMLSleds;71}72 73static CommandRegistration Unused(&Extract, []() -> Error {74  auto InstrumentationMapOrError = loadInstrumentationMap(ExtractInput);75  if (!InstrumentationMapOrError)76    return joinErrors(make_error<StringError>(77                          Twine("Cannot extract instrumentation map from '") +78                              ExtractInput + "'.",79                          std::make_error_code(std::errc::invalid_argument)),80                      InstrumentationMapOrError.takeError());81 82  std::error_code EC;83  raw_fd_ostream OS(ExtractOutput, EC, sys::fs::OpenFlags::OF_TextWithCRLF);84  if (EC)85    return make_error<StringError>(86        Twine("Cannot open file '") + ExtractOutput + "' for writing.", EC);87  const auto &FunctionAddresses =88      InstrumentationMapOrError->getFunctionAddresses();89  symbolize::LLVMSymbolizer::Options opts;90  if (Demangle.getPosition() < NoDemangle.getPosition())91    opts.Demangle = false;92  symbolize::LLVMSymbolizer Symbolizer(opts);93  FuncIdConversionHelper FuncIdHelper(ExtractInput, Symbolizer,94                                      FunctionAddresses);95  exportAsYAML(*InstrumentationMapOrError, OS, FuncIdHelper);96  return Error::success();97});98