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