1 //===----------------------- View.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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 /// \file
9 ///
10 /// This file defines the member functions of the class InstructionView.
11 ///
12 //===----------------------------------------------------------------------===//
13 
14 #include <sstream>
15 #include "Views/InstructionView.h"
16 #include "llvm/MC/MCInst.h"
17 #include "llvm/MC/MCSubtargetInfo.h"
18 
19 namespace llvm {
20 namespace mca {
21 
printInstructionString(const llvm::MCInst & MCI) const22 StringRef InstructionView::printInstructionString(const llvm::MCInst &MCI) const {
23   InstructionString = "";
24   MCIP.printInst(&MCI, 0, "", STI, InstrStream);
25   InstrStream.flush();
26   // Remove any tabs or spaces at the beginning of the instruction.
27   return StringRef(InstructionString).ltrim();
28 }
29 
toJSON() const30 json::Value InstructionView::toJSON() const {
31   json::Object JO;
32   json::Array SourceInfo;
33   for (const auto &MCI : getSource()) {
34     StringRef Instruction = printInstructionString(MCI);
35     SourceInfo.push_back(Instruction.str());
36   }
37   JO.try_emplace("Instructions", std::move(SourceInfo));
38 
39   json::Array Resources;
40   const MCSchedModel &SM = STI.getSchedModel();
41   for (unsigned I = 1, E = SM.getNumProcResourceKinds(); I < E; ++I) {
42     const MCProcResourceDesc &ProcResource = *SM.getProcResource(I);
43     unsigned NumUnits = ProcResource.NumUnits;
44     // Skip groups and invalid resources with zero units.
45     if (ProcResource.SubUnitsIdxBegin || !NumUnits)
46       continue;
47     for (unsigned J = 0; J < NumUnits; ++J) {
48       std::stringstream ResNameStream;
49       ResNameStream << ProcResource.Name;
50       if (NumUnits > 1)
51         ResNameStream << "." << J;
52       Resources.push_back(ResNameStream.str());
53     }
54   }
55   JO.try_emplace("Resources", json::Object({{"CPUName", MCPU}, {"Resources", std::move(Resources)}}));
56 
57   return JO;
58 }
59 } // namespace mca
60 } // namespace llvm
61