GraphWriter.cpp revision 4ee451de366474b9c228b4e5fa573795a715216d
19d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer//===-- GraphWriter.cpp - Implements GraphWriter support routines ---------===//
29d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer//
39d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer//                     The LLVM Compiler Infrastructure
49d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// 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"
15fe6b146dcd09f488b12c7ff888ead9cedc92c2a6Bill Wendling#include "llvm/Support/Streams.h"
169d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#include "llvm/System/Path.h"
179d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#include "llvm/System/Program.h"
189d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#include "llvm/Config/config.h"
199d5b532de9bdca37810a59a93a69128441b02c55Reid Spencerusing namespace llvm;
209d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
2165a392ebeae214ccb25f4d5ec856688e4e690e0dChris Lattnervoid llvm::DisplayGraph(const sys::Path &Filename) {
228ea5ecb0564b8822c70ad84202471f03e2690da7Reid Spencer  std::string ErrMsg;
239d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#if HAVE_GRAPHVIZ
249d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  sys::Path Graphviz(LLVM_PATH_GRAPHVIZ);
259d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
269d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  std::vector<const char*> args;
279d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(Graphviz.c_str());
289d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(Filename.c_str());
299d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(0);
309d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
31e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling  cerr << "Running 'Graphviz' program... " << std::flush;
329ba8a76f8baaa1092d60ccfbc04e7efdc207c98fAnton Korobeynikov  if (sys::Program::ExecuteAndWait(Graphviz, &args[0],0,0,0,0,&ErrMsg)) {
33e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling    cerr << "Error viewing graph: " << ErrMsg << "\n";
349d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  }
359d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#elif (HAVE_GV && HAVE_DOT)
369d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  sys::Path PSFilename = Filename;
379d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  PSFilename.appendSuffix("ps");
389d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
399d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  sys::Path dot(LLVM_PATH_DOT);
409d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
419d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  std::vector<const char*> args;
429d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(dot.c_str());
439d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back("-Tps");
449d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back("-Nfontname=Courier");
459d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back("-Gsize=7.5,10");
469d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(Filename.c_str());
479d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back("-o");
489d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(PSFilename.c_str());
499d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(0);
509d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
51e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling  cerr << "Running 'dot' program... " << std::flush;
529ba8a76f8baaa1092d60ccfbc04e7efdc207c98fAnton Korobeynikov  if (sys::Program::ExecuteAndWait(dot, &args[0],0,0,0,0,&ErrMsg)) {
53e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling    cerr << "Error viewing graph: '" << ErrMsg << "\n";
549d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  } else {
55e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling    cerr << " done. \n";
569d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
579d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    sys::Path gv(LLVM_PATH_GV);
589d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    args.clear();
599d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    args.push_back(gv.c_str());
609d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    args.push_back(PSFilename.c_str());
619d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    args.push_back(0);
629d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
638ea5ecb0564b8822c70ad84202471f03e2690da7Reid Spencer    ErrMsg.clear();
649ba8a76f8baaa1092d60ccfbc04e7efdc207c98fAnton Korobeynikov    if (sys::Program::ExecuteAndWait(gv, &args[0],0,0,0,0,&ErrMsg)) {
65e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling      cerr << "Error viewing graph: " << ErrMsg << "\n";
66023fcf977660e686e04f5bef0e2a7321db47df7eReid Spencer    }
679d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  }
689d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  PSFilename.eraseFromDisk();
699d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#elif HAVE_DOTTY
709d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  sys::Path dotty(LLVM_PATH_DOTTY);
719d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
729d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  std::vector<const char*> args;
7382493289e0234e0172313e845fb87306cf3687acChris Lattner  args.push_back(dotty.c_str());
749d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(Filename.c_str());
759d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  args.push_back(0);
769d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
77e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling  cerr << "Running 'dotty' program... " << std::flush;
789ba8a76f8baaa1092d60ccfbc04e7efdc207c98fAnton Korobeynikov  if (sys::Program::ExecuteAndWait(dotty, &args[0],0,0,0,0,&ErrMsg)) {
79e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling    cerr << "Error viewing graph: " << ErrMsg << "\n";
809d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  } else {
817b7a1be8561c0cfda11b5ff287aa115cb1e68df5Reid Spencer#ifdef __MINGW32__ // Dotty spawns another app and doesn't wait until it returns
829d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer    return;
839d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#endif
849d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  }
859d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer#endif
869d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer
879d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer  Filename.eraseFromDisk();
889d5b532de9bdca37810a59a93a69128441b02c55Reid Spencer}
89