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