GraphWriter.cpp revision 65a392ebeae214ccb25f4d5ec856688e4e690e0d
19d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer//===-- GraphWriter.cpp - Implements GraphWriter support routines ---------===//
29d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer//
39d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer//                     The LLVM Compiler Infrastructure
49d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer//
59d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer// This file was developed by the LLVM research group and is distributed under
69d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer// the University of Illinois Open Source License. See LICENSE.TXT for details.
79d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer//
89d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer//===----------------------------------------------------------------------===//
99d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer//
109d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer// This file implements misc. GraphWriter support routines.
119d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer//
129d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer//===----------------------------------------------------------------------===//
139d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
1465a392ebeae214ccb25f4d5ec856688e4e690e0dChris Lattner#include "llvm/Support/GraphWriter.h"
159d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#include "llvm/System/Path.h"
169d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#include "llvm/System/Program.h"
179d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#include "llvm/Config/config.h"
189d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#include <iostream>
199d5b532de9bdca37810a59a93a69128441b02c55Reid Spencerusing namespace llvm;
209d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
2165a392ebeae214ccb25f4d5ec856688e4e690e0dChris Lattnervoid llvm::DisplayGraph(const sys::Path &Filename) {
229d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#if HAVE_GRAPHVIZ
239d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  sys::Path Graphviz(LLVM_PATH_GRAPHVIZ);
249d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
259d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  std::vector<const char*> args;
269d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(Graphviz.c_str());
279d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(Filename.c_str());
289d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(0);
299d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
309d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  std::cerr << "Running 'Graphviz' program... " << std::flush;
319d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  if (sys::Program::ExecuteAndWait(Graphviz, &args[0])) {
329d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    std::cerr << "Error viewing graph: 'Graphviz' not in path?\n";
339d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  }
349d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#elif (HAVE_GV && HAVE_DOT)
359d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  sys::Path PSFilename = Filename;
369d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  PSFilename.appendSuffix("ps");
379d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
389d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  sys::Path dot(LLVM_PATH_DOT);
399d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
409d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  std::vector<const char*> args;
419d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(dot.c_str());
429d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back("-Tps");
439d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back("-Nfontname=Courier");
449d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back("-Gsize=7.5,10");
459d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(Filename.c_str());
469d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back("-o");
479d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(PSFilename.c_str());
489d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(0);
499d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
509d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  std::cerr << "Running 'dot' program... " << std::flush;
519d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  if (sys::Program::ExecuteAndWait(dot, &args[0])) {
529d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    std::cerr << "Error viewing graph: 'dot' not in path?\n";
539d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  } else {
549d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    std::cerr << " done. \n";
559d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
569d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    sys::Path gv(LLVM_PATH_GV);
579d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    args.clear();
589d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    args.push_back(gv.c_str());
599d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    args.push_back(PSFilename.c_str());
609d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    args.push_back(0);
619d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
629d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    sys::Program::ExecuteAndWait(gv, &args[0]);
639d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  }
649d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  PSFilename.eraseFromDisk();
659d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#elif HAVE_DOTTY
669d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  sys::Path dotty(LLVM_PATH_DOTTY);
679d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
689d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  std::vector<const char*> args;
699d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(Filename.c_str());
709d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(0);
719d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
729d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  std::cerr << "Running 'dotty' program... " << std::flush;
739d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  if (sys::Program::ExecuteAndWait(dotty, &args[0])) {
749d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    std::cerr << "Error viewing graph: 'dotty' not in path?\n";
759d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  } else {
769d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#ifdef __MINGW32__ // Dotty spawns another app and doesn't wait until it returns.
779d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    return;
789d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#endif
799d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  }
809d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#endif
819d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
829d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  Filename.eraseFromDisk();
839d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer}
84