123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- //===-- CFGPrinter.h - CFG printer external interface -----------*- C++ -*-===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- //
- // This file defines external functions that can be called to explicitly
- // instantiate the CFG printer.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_ANALYSIS_CFGPRINTER_H
- #define LLVM_ANALYSIS_CFGPRINTER_H
- #include "llvm/IR/CFG.h"
- #include "llvm/IR/Constants.h"
- #include "llvm/IR/Function.h"
- #include "llvm/IR/Instructions.h"
- #include "llvm/Support/GraphWriter.h"
- namespace llvm {
- template<>
- struct DOTGraphTraits<const Function*> : public DefaultDOTGraphTraits {
- DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {}
- static std::string getGraphName(const Function *F) {
- return "CFG for '" + F->getName().str() + "' function";
- }
- static std::string getSimpleNodeLabel(const BasicBlock *Node,
- const Function *) {
- if (!Node->getName().empty())
- return Node->getName().str();
- std::string Str;
- raw_string_ostream OS(Str);
- Node->printAsOperand(OS, false);
- return OS.str();
- }
- static std::string getCompleteNodeLabel(const BasicBlock *Node,
- const Function *) {
- enum { MaxColumns = 80 };
- std::string Str;
- raw_string_ostream OS(Str);
- if (Node->getName().empty()) {
- Node->printAsOperand(OS, false);
- OS << ":";
- }
- OS << *Node;
- std::string OutStr = OS.str();
- if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
- // Process string output to make it nicer...
- unsigned ColNum = 0;
- unsigned LastSpace = 0;
- for (unsigned i = 0; i != OutStr.length(); ++i) {
- if (OutStr[i] == '\n') { // Left justify
- OutStr[i] = '\\';
- OutStr.insert(OutStr.begin()+i+1, 'l');
- ColNum = 0;
- LastSpace = 0;
- } else if (OutStr[i] == ';') { // Delete comments!
- unsigned Idx = OutStr.find('\n', i+1); // Find end of line
- OutStr.erase(OutStr.begin()+i, OutStr.begin()+Idx);
- --i;
- } else if (ColNum == MaxColumns) { // Wrap lines.
- // Wrap very long names even though we can't find a space.
- if (!LastSpace)
- LastSpace = i;
- OutStr.insert(LastSpace, "\\l...");
- ColNum = i - LastSpace;
- LastSpace = 0;
- i += 3; // The loop will advance 'i' again.
- }
- else
- ++ColNum;
- if (OutStr[i] == ' ')
- LastSpace = i;
- }
- return OutStr;
- }
- std::string getNodeLabel(const BasicBlock *Node,
- const Function *Graph) {
- if (isSimple())
- return getSimpleNodeLabel(Node, Graph);
- else
- return getCompleteNodeLabel(Node, Graph);
- }
- static std::string getEdgeSourceLabel(const BasicBlock *Node,
- succ_const_iterator I) {
- // Label source of conditional branches with "T" or "F"
- if (const BranchInst *BI = dyn_cast<BranchInst>(Node->getTerminator()))
- if (BI->isConditional())
- return (I == succ_begin(Node)) ? "T" : "F";
- // Label source of switch edges with the associated value.
- if (const SwitchInst *SI = dyn_cast<SwitchInst>(Node->getTerminator())) {
- unsigned SuccNo = I.getSuccessorIndex();
- if (SuccNo == 0) return "def";
- std::string Str;
- raw_string_ostream OS(Str);
- SwitchInst::ConstCaseIt Case =
- SwitchInst::ConstCaseIt::fromSuccessorIndex(SI, SuccNo);
- OS << Case.getCaseValue()->getValue();
- return OS.str();
- }
- return "";
- }
- };
- } // End llvm namespace
- namespace llvm {
- class PassRegistry; // HLSL Change
- class FunctionPass;
- FunctionPass *createCFGPrinterPass ();
- FunctionPass *createCFGOnlyPrinterPass ();
- void initializeCFGPrinterPasses(PassRegistry &Registry); // HLSL Change
- } // End llvm namespace
- #endif
|