1dea343d2SMatt Davis //===--------------------- PipelinePrinter.cpp ------------------*- C++ -*-===//
2dea343d2SMatt Davis //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6dea343d2SMatt Davis //
7dea343d2SMatt Davis //===----------------------------------------------------------------------===//
8dea343d2SMatt Davis /// \file
9dea343d2SMatt Davis ///
10dea343d2SMatt Davis /// This file implements the PipelinePrinter interface.
11dea343d2SMatt Davis ///
12dea343d2SMatt Davis //===----------------------------------------------------------------------===//
13dea343d2SMatt Davis
14dea343d2SMatt Davis #include "PipelinePrinter.h"
1510cb0362SAndrea Di Biagio #include "CodeRegion.h"
1610cb0362SAndrea Di Biagio #include "Views/InstructionView.h"
17dea343d2SMatt Davis
185a8fd657SFangrui Song namespace llvm {
19dea343d2SMatt Davis namespace mca {
20dea343d2SMatt Davis
printRegionHeader(llvm::raw_ostream & OS) const2110cb0362SAndrea Di Biagio void PipelinePrinter::printRegionHeader(llvm::raw_ostream &OS) const {
2210cb0362SAndrea Di Biagio StringRef RegionName;
2310cb0362SAndrea Di Biagio if (!Region.getDescription().empty())
2410cb0362SAndrea Di Biagio RegionName = Region.getDescription();
2510cb0362SAndrea Di Biagio
2610cb0362SAndrea Di Biagio OS << "\n[" << RegionIdx << "] Code Region";
2710cb0362SAndrea Di Biagio if (!RegionName.empty())
2810cb0362SAndrea Di Biagio OS << " - " << RegionName;
2910cb0362SAndrea Di Biagio OS << "\n\n";
3010cb0362SAndrea Di Biagio }
3110cb0362SAndrea Di Biagio
getJSONReportRegion() const32b11d31ebSMarcos Horro json::Object PipelinePrinter::getJSONReportRegion() const {
33aa13e4feSMarcos Horro json::Object JO;
3410cb0362SAndrea Di Biagio
354fe0fcd1SAndrea Di Biagio StringRef RegionName = "";
364fe0fcd1SAndrea Di Biagio if (!Region.getDescription().empty())
374fe0fcd1SAndrea Di Biagio RegionName = Region.getDescription();
384fe0fcd1SAndrea Di Biagio
394fe0fcd1SAndrea Di Biagio JO.try_emplace("Name", RegionName);
4010cb0362SAndrea Di Biagio for (const auto &V : Views)
4110cb0362SAndrea Di Biagio if (V->isSerializable())
42aa13e4feSMarcos Horro JO.try_emplace(V->getNameAsString().str(), V->toJSON());
4310cb0362SAndrea Di Biagio
44b11d31ebSMarcos Horro return JO;
45b11d31ebSMarcos Horro }
46b11d31ebSMarcos Horro
getJSONSimulationParameters() const47*77f2f0f9SMarcos Horro json::Object PipelinePrinter::getJSONSimulationParameters() const {
48*77f2f0f9SMarcos Horro json::Object SimParameters({{"-mcpu", STI.getCPU()},
49*77f2f0f9SMarcos Horro {"-mtriple", STI.getTargetTriple().getTriple()},
50*77f2f0f9SMarcos Horro {"-march", STI.getTargetTriple().getArchName()}});
51*77f2f0f9SMarcos Horro
52*77f2f0f9SMarcos Horro const MCSchedModel &SM = STI.getSchedModel();
53*77f2f0f9SMarcos Horro if (!SM.isOutOfOrder())
54*77f2f0f9SMarcos Horro return SimParameters;
55*77f2f0f9SMarcos Horro
56*77f2f0f9SMarcos Horro if (PO.RegisterFileSize)
57*77f2f0f9SMarcos Horro SimParameters.try_emplace("-register-file-size", PO.RegisterFileSize);
58*77f2f0f9SMarcos Horro
59*77f2f0f9SMarcos Horro if (!PO.AssumeNoAlias)
60*77f2f0f9SMarcos Horro SimParameters.try_emplace("-noalias", PO.AssumeNoAlias);
61*77f2f0f9SMarcos Horro
62*77f2f0f9SMarcos Horro if (PO.DecodersThroughput)
63*77f2f0f9SMarcos Horro SimParameters.try_emplace("-decoder-throughput", PO.DecodersThroughput);
64*77f2f0f9SMarcos Horro
65*77f2f0f9SMarcos Horro if (PO.MicroOpQueueSize)
66*77f2f0f9SMarcos Horro SimParameters.try_emplace("-micro-op-queue-size", PO.MicroOpQueueSize);
67*77f2f0f9SMarcos Horro
68*77f2f0f9SMarcos Horro if (PO.DispatchWidth)
69*77f2f0f9SMarcos Horro SimParameters.try_emplace("-dispatch", PO.DispatchWidth);
70*77f2f0f9SMarcos Horro
71*77f2f0f9SMarcos Horro if (PO.LoadQueueSize)
72*77f2f0f9SMarcos Horro SimParameters.try_emplace("-lqueue", PO.LoadQueueSize);
73*77f2f0f9SMarcos Horro
74*77f2f0f9SMarcos Horro if (PO.StoreQueueSize)
75*77f2f0f9SMarcos Horro SimParameters.try_emplace("-squeue", PO.StoreQueueSize);
76*77f2f0f9SMarcos Horro
77*77f2f0f9SMarcos Horro return SimParameters;
78*77f2f0f9SMarcos Horro }
79*77f2f0f9SMarcos Horro
getJSONTargetInfo() const80d919bca8SAndrea Di Biagio json::Object PipelinePrinter::getJSONTargetInfo() const {
81d919bca8SAndrea Di Biagio json::Array Resources;
82d919bca8SAndrea Di Biagio const MCSchedModel &SM = STI.getSchedModel();
83d919bca8SAndrea Di Biagio StringRef MCPU = STI.getCPU();
84d919bca8SAndrea Di Biagio
85d919bca8SAndrea Di Biagio for (unsigned I = 1, E = SM.getNumProcResourceKinds(); I < E; ++I) {
86d919bca8SAndrea Di Biagio const MCProcResourceDesc &ProcResource = *SM.getProcResource(I);
87d919bca8SAndrea Di Biagio unsigned NumUnits = ProcResource.NumUnits;
88d919bca8SAndrea Di Biagio if (ProcResource.SubUnitsIdxBegin || !NumUnits)
89d919bca8SAndrea Di Biagio continue;
90d919bca8SAndrea Di Biagio
91d919bca8SAndrea Di Biagio for (unsigned J = 0; J < NumUnits; ++J) {
92d919bca8SAndrea Di Biagio std::string ResourceName = ProcResource.Name;
93d919bca8SAndrea Di Biagio if (NumUnits > 1) {
94d919bca8SAndrea Di Biagio ResourceName += ".";
95d919bca8SAndrea Di Biagio ResourceName += J;
96d919bca8SAndrea Di Biagio }
97d919bca8SAndrea Di Biagio
98d919bca8SAndrea Di Biagio Resources.push_back(ResourceName);
99d919bca8SAndrea Di Biagio }
100d919bca8SAndrea Di Biagio }
101d919bca8SAndrea Di Biagio
102d919bca8SAndrea Di Biagio return json::Object({{"CPUName", MCPU}, {"Resources", std::move(Resources)}});
103d919bca8SAndrea Di Biagio }
104d919bca8SAndrea Di Biagio
printReport(json::Object & JO) const10510cb0362SAndrea Di Biagio void PipelinePrinter::printReport(json::Object &JO) const {
1064fe0fcd1SAndrea Di Biagio if (!RegionIdx) {
107*77f2f0f9SMarcos Horro JO.try_emplace("TargetInfo", getJSONTargetInfo());
108*77f2f0f9SMarcos Horro JO.try_emplace("SimulationParameters", getJSONSimulationParameters());
1094fe0fcd1SAndrea Di Biagio // Construct an array of regions.
1104fe0fcd1SAndrea Di Biagio JO.try_emplace("CodeRegions", json::Array());
1114fe0fcd1SAndrea Di Biagio }
11210cb0362SAndrea Di Biagio
1134fe0fcd1SAndrea Di Biagio json::Array *Regions = JO.getArray("CodeRegions");
1144fe0fcd1SAndrea Di Biagio assert(Regions && "This array must exist!");
1154fe0fcd1SAndrea Di Biagio Regions->push_back(getJSONReportRegion());
11610cb0362SAndrea Di Biagio }
11710cb0362SAndrea Di Biagio
printReport(llvm::raw_ostream & OS) const118b11d31ebSMarcos Horro void PipelinePrinter::printReport(llvm::raw_ostream &OS) const {
11910cb0362SAndrea Di Biagio // Don't print the header of this region if it is the default region, and if
12010cb0362SAndrea Di Biagio // it doesn't have an end location.
12110cb0362SAndrea Di Biagio if (Region.startLoc().isValid() || Region.endLoc().isValid())
12210cb0362SAndrea Di Biagio printRegionHeader(OS);
12310cb0362SAndrea Di Biagio
12410cb0362SAndrea Di Biagio for (const auto &V : Views)
125aa13e4feSMarcos Horro V->printView(OS);
126aa13e4feSMarcos Horro }
12710cb0362SAndrea Di Biagio
12810cb0362SAndrea Di Biagio } // namespace mca
1295a8fd657SFangrui Song } // namespace llvm
130