130 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===--------------------- PipelinePrinter.cpp ------------------*- C++ -*-===//
 | |
| //
 | |
| // 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
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| /// \file
 | |
| ///
 | |
| /// This file implements the PipelinePrinter interface.
 | |
| ///
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "PipelinePrinter.h"
 | |
| #include "CodeRegion.h"
 | |
| #include "Views/InstructionView.h"
 | |
| 
 | |
| namespace llvm {
 | |
| namespace mca {
 | |
| 
 | |
| void PipelinePrinter::printRegionHeader(llvm::raw_ostream &OS) const {
 | |
|   StringRef RegionName;
 | |
|   if (!Region.getDescription().empty())
 | |
|     RegionName = Region.getDescription();
 | |
| 
 | |
|   OS << "\n[" << RegionIdx << "] Code Region";
 | |
|   if (!RegionName.empty())
 | |
|     OS << " - " << RegionName;
 | |
|   OS << "\n\n";
 | |
| }
 | |
| 
 | |
| json::Object PipelinePrinter::getJSONReportRegion() const {
 | |
|   json::Object JO;
 | |
| 
 | |
|   StringRef RegionName = "";
 | |
|   if (!Region.getDescription().empty())
 | |
|     RegionName = Region.getDescription();
 | |
| 
 | |
|   JO.try_emplace("Name", RegionName);
 | |
|   for (const auto &V : Views)
 | |
|     if (V->isSerializable())
 | |
|       JO.try_emplace(V->getNameAsString().str(), V->toJSON());
 | |
| 
 | |
|   return JO;
 | |
| }
 | |
| 
 | |
| json::Object PipelinePrinter::getJSONSimulationParameters() const {
 | |
|   json::Object SimParameters({{"-mcpu", STI.getCPU()},
 | |
|                               {"-mtriple", STI.getTargetTriple().getTriple()},
 | |
|                               {"-march", STI.getTargetTriple().getArchName()}});
 | |
| 
 | |
|   const MCSchedModel &SM = STI.getSchedModel();
 | |
|   if (!SM.isOutOfOrder())
 | |
|     return SimParameters;
 | |
| 
 | |
|   if (PO.RegisterFileSize)
 | |
|     SimParameters.try_emplace("-register-file-size", PO.RegisterFileSize);
 | |
| 
 | |
|   if (!PO.AssumeNoAlias)
 | |
|     SimParameters.try_emplace("-noalias", PO.AssumeNoAlias);
 | |
| 
 | |
|   if (PO.DecodersThroughput)
 | |
|     SimParameters.try_emplace("-decoder-throughput", PO.DecodersThroughput);
 | |
| 
 | |
|   if (PO.MicroOpQueueSize)
 | |
|     SimParameters.try_emplace("-micro-op-queue-size", PO.MicroOpQueueSize);
 | |
| 
 | |
|   if (PO.DispatchWidth)
 | |
|     SimParameters.try_emplace("-dispatch", PO.DispatchWidth);
 | |
| 
 | |
|   if (PO.LoadQueueSize)
 | |
|     SimParameters.try_emplace("-lqueue", PO.LoadQueueSize);
 | |
| 
 | |
|   if (PO.StoreQueueSize)
 | |
|     SimParameters.try_emplace("-squeue", PO.StoreQueueSize);
 | |
| 
 | |
|   return SimParameters;
 | |
| }
 | |
| 
 | |
| json::Object PipelinePrinter::getJSONTargetInfo() const {
 | |
|   json::Array Resources;
 | |
|   const MCSchedModel &SM = STI.getSchedModel();
 | |
|   StringRef MCPU = STI.getCPU();
 | |
| 
 | |
|   for (unsigned I = 1, E = SM.getNumProcResourceKinds(); I < E; ++I) {
 | |
|     const MCProcResourceDesc &ProcResource = *SM.getProcResource(I);
 | |
|     unsigned NumUnits = ProcResource.NumUnits;
 | |
|     if (ProcResource.SubUnitsIdxBegin || !NumUnits)
 | |
|       continue;
 | |
| 
 | |
|     for (unsigned J = 0; J < NumUnits; ++J) {
 | |
|       std::string ResourceName = ProcResource.Name;
 | |
|       if (NumUnits > 1) {
 | |
|         ResourceName += ".";
 | |
|         ResourceName += J;
 | |
|       }
 | |
| 
 | |
|       Resources.push_back(ResourceName);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return json::Object({{"CPUName", MCPU}, {"Resources", std::move(Resources)}});
 | |
| }
 | |
| 
 | |
| void PipelinePrinter::printReport(json::Object &JO) const {
 | |
|   if (!RegionIdx) {
 | |
|     JO.try_emplace("TargetInfo", getJSONTargetInfo());
 | |
|     JO.try_emplace("SimulationParameters", getJSONSimulationParameters());
 | |
|     // Construct an array of regions.
 | |
|     JO.try_emplace("CodeRegions", json::Array());
 | |
|   }
 | |
| 
 | |
|   json::Array *Regions = JO.getArray("CodeRegions");
 | |
|   assert(Regions && "This array must exist!");
 | |
|   Regions->push_back(getJSONReportRegion());
 | |
| }
 | |
| 
 | |
| void PipelinePrinter::printReport(llvm::raw_ostream &OS) const {
 | |
|   // Don't print the header of this region if it is the default region, and if
 | |
|   // it doesn't have an end location.
 | |
|   if (Region.startLoc().isValid() || Region.endLoc().isValid())
 | |
|     printRegionHeader(OS);
 | |
| 
 | |
|   for (const auto &V : Views)
 | |
|     V->printView(OS);
 | |
| }
 | |
| 
 | |
| } // namespace mca
 | |
| } // namespace llvm
 |