LLVM: include/llvm/Analysis/CFGPrinter.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18#ifndef LLVM_ANALYSIS_CFGPRINTER_H

19#define LLVM_ANALYSIS_CFGPRINTER_H

20

33

34#include

35#include

36

37namespace llvm {

39

40template struct GraphTraits;

46

52

58

64

66private:

70 std::unique_ptr MSTStorage;

72 bool ShowHeat;

73 bool EdgeWeights;

74 bool RawWeights;

75 using NodeIdFormatterTy =

76 std::function<std::optionalstd::string(const BasicBlock *)>;

77 std::optional NodeIdFormatter;

78

79public:

82

86 std::optional NodeIdFormatter = std::nullopt);

87

89

91

93

95

97

99 return BFI->getBlockFreq(BB).getFrequency();

100 }

101

102 void setHeatColors(bool ShowHeat) { this->ShowHeat = ShowHeat; }

103

105

107

109

110 void setEdgeWeights(bool EdgeWeights) { this->EdgeWeights = EdgeWeights; }

111

113

115 return NodeIdFormatter;

116 }

117};

118

119template <>

122 return &(CFGInfo->getFunction()->getEntryBlock());

123 }

124

125

127

131

135

139};

140

141template

143 if (Node->getName().empty())

144 return Node->getName().str();

145

146 std::string Str;

148

150 return Str;

151}

152

153template

155 const BasicBlockT *Node,

157 HandleBasicBlock,

158 function_ref<void(std::string &, unsigned &, unsigned)>

159 HandleComment) {

160

161 enum { MaxColumns = 80 };

162 std::string OutStr;

164 HandleBasicBlock(OS, *Node);

165

166 if (OutStr[0] == '%') {

167 OutStr.erase(OutStr.begin());

168 }

169

170 OutStr.insert(OutStr.find_first_of('\n') + 1, "\\|");

171

172 unsigned ColNum = 0;

173 unsigned LastSpace = 0;

174 for (unsigned i = 0; i != OutStr.length(); ++i) {

175 if (OutStr[i] == '\n') {

176 OutStr[i] = '\\';

177 OutStr.insert(OutStr.begin() + i + 1, 'l');

178 ColNum = 0;

179 LastSpace = 0;

180 } else if (OutStr[i] == ';') {

181 unsigned Idx = OutStr.find('\n', i + 1);

182 HandleComment(OutStr, i, Idx);

183 } else if (ColNum == MaxColumns) {

184

185 if (!LastSpace)

186 LastSpace = i;

187 OutStr.insert(LastSpace, "\\l...");

188 ColNum = i - LastSpace;

189 LastSpace = 0;

190 i += 3;

191 } else

192 ++ColNum;

193 if (OutStr[i] == ' ')

194 LastSpace = i;

195 }

196 return OutStr;

197}

198

199template <>

201

202

204

206

207 static void eraseComment(std::string &OutStr, unsigned &I, unsigned Idx) {

208 OutStr.erase(OutStr.begin() + I, OutStr.begin() + Idx);

209 --I;

210 }

211

215

219

223 HandleBasicBlock = {},

224 function_ref<void(std::string &, unsigned &, unsigned)> HandleComment =

225 eraseComment);

226

234

237

239 if (BI->isConditional())

241

242

244 unsigned SuccNo = I.getSuccessorIndex();

245

246 if (SuccNo == 0)

247 return "def";

248

249 std::string Str;

252 OS << Case.getCaseValue()->getValue();

253 return Str;

254 }

255 return "";

256 }

257

259 std::string NodeName = Node->getName().str();

260 if (NodeName.empty()) {

263

264 NodeName.erase(NodeName.begin());

265 }

266 return NodeName;

267 }

268

269

272

274 return "";

275

276 unsigned OpNo = I.getSuccessorIndex();

280 double WeightPercent = ((double)BranchProb.getNumerator()) /

281 ((double)BranchProb.getDenominator());

282 std::string TTAttr =

284 getBBName(SuccBB), WeightPercent);

285

287 return TTAttr + "penwidth=2";

288

290 return TTAttr;

291

292 double Width = 1 + WeightPercent;

293

295 return TTAttr +

296 formatv("label=\"{0:P}\" penwidth={1}", WeightPercent, Width)

297 .str();

298

299

300

301

303 std::string Attrs =

304 TTAttr + formatv("label=\"W:{0}\" penwidth={1}",

305 (uint64_t)(Freq * WeightPercent), Width)

306 .str();

307 if (Attrs.size())

308 return Attrs;

309

311 if (!WeightsNode)

312 return TTAttr;

313

314 OpNo = I.getSuccessorIndex() + 1;

316 return TTAttr;

319 if (!Weight)

320 return TTAttr;

321 return (TTAttr + "label=\"W:" + std::to_string(Weight->getZExtValue()) +

322 "\" penwidth=" + std::to_string(Width));

323 }

324

326 std::stringstream Attrs;

327

329 if (auto NodeId = (*NodeIdFmt)(Node))

330 Attrs << "id=\"" << *NodeId << "\"";

331

335 std::string EdgeColor = (Freq <= (CFGInfo->getMaxFreq() / 2))

338 if (!Attrs.str().empty())

339 Attrs << ",";

340 Attrs << "color=\"" << EdgeColor << "ff\", style=filled, "

341 << "fillcolor=\"" << Color << "70\", " << "fontname=\"Courier\"";

342 }

343

344 return Attrs.str();

345 }

346

350};

351}

352

353#endif

This file contains the declarations for the subclasses of Constant, which represent the different fla...

This file provides various utilities for inspecting and working with the control flow graph in LLVM I...

This header defines various interfaces for pass management in LLVM.

This file contains the declarations for profiling metadata utility functions.

static bool isSimple(Instruction *I)

void printAsOperand(OutputBuffer &OB, Prec P=Prec::Default, bool StrictlyWorse=false) const

LLVM Basic Block Representation.

BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...

Conditional or Unconditional Branch instruction.

Analysis providing branch probability information.

LLVM_ABI BranchProbability getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const

Get an edge's probability, relative to other out-edges of the Src.

Definition CFGPrinter.h:59

static bool isRequired()

Definition CFGPrinter.h:62

LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)

Definition CFGPrinter.h:47

LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)

static bool isRequired()

Definition CFGPrinter.h:50

Definition CFGPrinter.h:53

static bool isRequired()

Definition CFGPrinter.h:56

LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)

Definition CFGPrinter.h:41

LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)

static bool isRequired()

Definition CFGPrinter.h:44

This is the shared class of boolean and integer constants.

uint64_t getZExtValue() const

Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...

Definition CFGPrinter.h:65

void setRawEdgeWeights(bool RawWeights)

Definition CFGPrinter.h:106

uint64_t getMaxFreq() const

Definition CFGPrinter.h:96

void setEdgeWeights(bool EdgeWeights)

Definition CFGPrinter.h:110

DOTFuncInfo(const Function *F)

Definition CFGPrinter.h:80

uint64_t getFreq(const BasicBlock *BB) const

Definition CFGPrinter.h:98

std::optional< NodeIdFormatterTy > getNodeIdFormatter()

Definition CFGPrinter.h:114

const BranchProbabilityInfo * getBPI() const

Definition CFGPrinter.h:90

bool showEdgeWeights()

Definition CFGPrinter.h:112

bool showHeatColors()

Definition CFGPrinter.h:104

LLVM_ABI ModuleSlotTracker * getModuleSlotTracker()

bool useRawEdgeWeights()

Definition CFGPrinter.h:108

const Function * getFunction() const

Definition CFGPrinter.h:92

const BlockFrequencyInfo * getBFI() const

Definition CFGPrinter.h:88

void setHeatColors(bool ShowHeat)

Definition CFGPrinter.h:102

LLVM_ABI unsigned getNumSuccessors() const LLVM_READONLY

Return the number of successors that this instruction has.

LLVM_ABI BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY

Return the specified successor. This instruction must be a terminator.

const MDOperand & getOperand(unsigned I) const

unsigned getNumOperands() const

Return number of MDNode operands.

Manage lifetime of a slot tracker for printing IR.

A set of analyses that are preserved following a run of a transformation pass.

std::string str() const

str - Get the contents as an std::string.

static CaseIteratorImpl fromSuccessorIndex(SwitchInstT *SI, unsigned SuccessorIndex)

LLVM_ABI StringRef getName() const

Return a constant reference to the value's name.

An efficient, type-erasing, non-owning reference to a callable.

A raw_ostream that writes to an std::string.

std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)

Extract a Value from Metadata, if any.

This is an optimization pass for GlobalISel generic memory operations.

decltype(auto) dyn_cast(const From &Val)

dyn_cast - Return the argument parameter cast to the specified type.

LLVM_ABI MDNode * getBranchWeightMDNode(const Instruction &I)

Get the branch weights metadata node.

auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)

std::string SimpleNodeLabelString(const BasicBlockT *Node)

Definition CFGPrinter.h:142

RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)

LLVM_ABI std::string getHeatColor(uint64_t Freq, uint64_t MaxFreq)

AnalysisManager< Function > FunctionAnalysisManager

Convenience typedef for the Function analysis manager.

SuccIterator< const Instruction, const BasicBlock > const_succ_iterator

std::string CompleteNodeLabelString(const BasicBlockT *Node, function_ref< void(raw_string_ostream &, const BasicBlockT &)> HandleBasicBlock, function_ref< void(std::string &, unsigned &, unsigned)> HandleComment)

Definition CFGPrinter.h:154

std::string getEdgeAttributes(const BasicBlock *Node, const_succ_iterator I, DOTFuncInfo *CFGInfo)

Display the raw branch weights from PGO.

Definition CFGPrinter.h:270

static LLVM_ABI std::string getCompleteNodeLabel(const BasicBlock *Node, DOTFuncInfo *, function_ref< void(raw_string_ostream &, const BasicBlock &)> HandleBasicBlock={}, function_ref< void(std::string &, unsigned &, unsigned)> HandleComment=eraseComment)

LLVM_ABI bool isNodeHidden(const BasicBlock *Node, const DOTFuncInfo *CFGInfo)

static std::string getSimpleNodeLabel(const BasicBlock *Node, DOTFuncInfo *)

Definition CFGPrinter.h:216

static std::string getGraphName(DOTFuncInfo *CFGInfo)

Definition CFGPrinter.h:212

DenseMap< const BasicBlock *, bool > isOnDeoptOrUnreachablePath

Definition CFGPrinter.h:203

LLVM_ABI void computeDeoptOrUnreachablePaths(const Function *F)

DOTGraphTraits(bool isSimple=false)

Definition CFGPrinter.h:205

std::string getNodeAttributes(const BasicBlock *Node, DOTFuncInfo *CFGInfo)

Definition CFGPrinter.h:325

static std::string getEdgeSourceLabel(const BasicBlock *Node, const_succ_iterator I)

Definition CFGPrinter.h:235

static void eraseComment(std::string &OutStr, unsigned &I, unsigned Idx)

Definition CFGPrinter.h:207

std::string getNodeLabel(const BasicBlock *Node, DOTFuncInfo *CFGInfo)

Definition CFGPrinter.h:227

static std::string getBBName(const BasicBlock *Node)

Definition CFGPrinter.h:258

DefaultDOTGraphTraits(bool simple=false)

static nodes_iterator nodes_begin(DOTFuncInfo *CFGInfo)

Definition CFGPrinter.h:128

static size_t size(DOTFuncInfo *CFGInfo)

Definition CFGPrinter.h:136

pointer_iterator< Function::const_iterator > nodes_iterator

Definition CFGPrinter.h:126

static NodeRef getEntryNode(DOTFuncInfo *CFGInfo)

Definition CFGPrinter.h:121

static nodes_iterator nodes_end(DOTFuncInfo *CFGInfo)

Definition CFGPrinter.h:132

typename DOTFuncInfo *::UnknownGraphTypeError NodeRef

A CRTP mix-in to automatically provide informational APIs needed for passes.