brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · 9d06c6a Raw
130 lines · cpp
1//===--------------------- PipelinePrinter.cpp ------------------*- C++ -*-===//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/// \file9///10/// This file implements the PipelinePrinter interface.11///12//===----------------------------------------------------------------------===//13 14#include "PipelinePrinter.h"15#include "CodeRegion.h"16#include "Views/InstructionView.h"17 18namespace llvm {19namespace mca {20 21void PipelinePrinter::printRegionHeader(llvm::raw_ostream &OS) const {22  StringRef RegionName;23  if (!Region.getDescription().empty())24    RegionName = Region.getDescription();25 26  OS << "\n[" << RegionIdx << "] Code Region";27  if (!RegionName.empty())28    OS << " - " << RegionName;29  OS << "\n\n";30}31 32json::Object PipelinePrinter::getJSONReportRegion() const {33  json::Object JO;34 35  StringRef RegionName = "";36  if (!Region.getDescription().empty())37    RegionName = Region.getDescription();38 39  JO.try_emplace("Name", RegionName);40  for (const auto &V : Views)41    if (V->isSerializable())42      JO.try_emplace(V->getNameAsString().str(), V->toJSON());43 44  return JO;45}46 47json::Object PipelinePrinter::getJSONSimulationParameters() const {48  json::Object SimParameters({{"-mcpu", STI.getCPU()},49                              {"-mtriple", STI.getTargetTriple().getTriple()},50                              {"-march", STI.getTargetTriple().getArchName()}});51 52  const MCSchedModel &SM = STI.getSchedModel();53  if (!SM.isOutOfOrder())54    return SimParameters;55 56  if (PO.RegisterFileSize)57    SimParameters.try_emplace("-register-file-size", PO.RegisterFileSize);58 59  if (!PO.AssumeNoAlias)60    SimParameters.try_emplace("-noalias", PO.AssumeNoAlias);61 62  if (PO.DecodersThroughput)63    SimParameters.try_emplace("-decoder-throughput", PO.DecodersThroughput);64 65  if (PO.MicroOpQueueSize)66    SimParameters.try_emplace("-micro-op-queue-size", PO.MicroOpQueueSize);67 68  if (PO.DispatchWidth)69    SimParameters.try_emplace("-dispatch", PO.DispatchWidth);70 71  if (PO.LoadQueueSize)72    SimParameters.try_emplace("-lqueue", PO.LoadQueueSize);73 74  if (PO.StoreQueueSize)75    SimParameters.try_emplace("-squeue", PO.StoreQueueSize);76 77  return SimParameters;78}79 80json::Object PipelinePrinter::getJSONTargetInfo() const {81  json::Array Resources;82  const MCSchedModel &SM = STI.getSchedModel();83  StringRef MCPU = STI.getCPU();84 85  for (unsigned I = 1, E = SM.getNumProcResourceKinds(); I < E; ++I) {86    const MCProcResourceDesc &ProcResource = *SM.getProcResource(I);87    unsigned NumUnits = ProcResource.NumUnits;88    if (ProcResource.SubUnitsIdxBegin || !NumUnits)89      continue;90 91    for (unsigned J = 0; J < NumUnits; ++J) {92      std::string ResourceName = ProcResource.Name;93      if (NumUnits > 1) {94        ResourceName += ".";95        ResourceName += J;96      }97 98      Resources.push_back(ResourceName);99    }100  }101 102  return json::Object({{"CPUName", MCPU}, {"Resources", std::move(Resources)}});103}104 105void PipelinePrinter::printReport(json::Object &JO) const {106  if (!RegionIdx) {107    JO.try_emplace("TargetInfo", getJSONTargetInfo());108    JO.try_emplace("SimulationParameters", getJSONSimulationParameters());109    // Construct an array of regions.110    JO.try_emplace("CodeRegions", json::Array());111  }112 113  json::Array *Regions = JO.getArray("CodeRegions");114  assert(Regions && "This array must exist!");115  Regions->push_back(getJSONReportRegion());116}117 118void PipelinePrinter::printReport(llvm::raw_ostream &OS) const {119  // Don't print the header of this region if it is the default region, and if120  // it doesn't have an end location.121  if (Region.startLoc().isValid() || Region.endLoc().isValid())122    printRegionHeader(OS);123 124  for (const auto &V : Views)125    V->printView(OS);126}127 128} // namespace mca129} // namespace llvm130