diff --git a/test/Analysis/DSGraph/2003-06-29-IncompleteTDPass.ll b/test/Analysis/DSGraph/2003-06-29-IncompleteTDPass.ll index 0c462e1e6ea..4b919c1a57b 100644 --- a/test/Analysis/DSGraph/2003-06-29-IncompleteTDPass.ll +++ b/test/Analysis/DSGraph/2003-06-29-IncompleteTDPass.ll @@ -1,4 +1,4 @@ -; RUN: analyze %s -datastructure-gc -dsgc-dspass=td -dsgc-check-flags=Ptr:HR +; RUN: opt -analyze %s -datastructure-gc -dsgc-dspass=td -dsgc-check-flags=Ptr:HR diff --git a/test/Analysis/DSGraph/2003-06-29-NodeCollapsing2.ll b/test/Analysis/DSGraph/2003-06-29-NodeCollapsing2.ll index 99aae03adf6..f357694d7a2 100644 --- a/test/Analysis/DSGraph/2003-06-29-NodeCollapsing2.ll +++ b/test/Analysis/DSGraph/2003-06-29-NodeCollapsing2.ll @@ -1,7 +1,7 @@ ; This is the same testcase as 2003-06-29-NodeCollapsing2.ll, but it uses the ; graph checker. ; -; RUN: analyze %s -datastructure-gc -dsgc-abort-if-any-collapsed +; RUN: opt -analyze %s -datastructure-gc -dsgc-abort-if-any-collapsed ; %T = type { int} diff --git a/test/Analysis/DSGraph/2003-06-30-TopDownResolve.ll b/test/Analysis/DSGraph/2003-06-30-TopDownResolve.ll index 6622eb2ea3e..f0cd849a4a1 100644 --- a/test/Analysis/DSGraph/2003-06-30-TopDownResolve.ll +++ b/test/Analysis/DSGraph/2003-06-30-TopDownResolve.ll @@ -1,4 +1,4 @@ -; RUN: analyze %s -datastructure-gc -dsgc-dspass=td -dsgc-check-flags=X:GM +; RUN: opt -analyze %s -datastructure-gc -dsgc-dspass=td -dsgc-check-flags=X:GM %G = internal global int 5 diff --git a/test/Analysis/DSGraph/2003-07-01-FieldCollapse.ll b/test/Analysis/DSGraph/2003-07-01-FieldCollapse.ll index 3f1893ba03b..58ddc46d49d 100644 --- a/test/Analysis/DSGraph/2003-07-01-FieldCollapse.ll +++ b/test/Analysis/DSGraph/2003-07-01-FieldCollapse.ll @@ -1,4 +1,4 @@ -; RUN: analyze %s -datastructure-gc -dsgc-abort-if-any-collapsed +; RUN: opt -analyze %s -datastructure-gc -dsgc-abort-if-any-collapsed %X = internal global { int, short, short } { int 1, short 2, short 3 } diff --git a/test/Analysis/DSGraph/2003-07-16-ConstantExprCollapse.ll b/test/Analysis/DSGraph/2003-07-16-ConstantExprCollapse.ll index aec1e99fd8b..38e57b888c6 100644 --- a/test/Analysis/DSGraph/2003-07-16-ConstantExprCollapse.ll +++ b/test/Analysis/DSGraph/2003-07-16-ConstantExprCollapse.ll @@ -1,6 +1,6 @@ ; This should cause the global node to collapse!! ; XFAIL: * -; RUN: analyze %s -datastructure-gc --dsgc-check-flags=test:GAU +; RUN: opt -analyze %s -datastructure-gc --dsgc-check-flags=test:GAU %Tree = type { int, %Tree*, %Tree* } %T5 = external global %Tree diff --git a/test/Analysis/DSGraph/2003-11-02-NodeCollapsing.ll b/test/Analysis/DSGraph/2003-11-02-NodeCollapsing.ll index 37f5038cd44..3a58e057a7f 100644 --- a/test/Analysis/DSGraph/2003-11-02-NodeCollapsing.ll +++ b/test/Analysis/DSGraph/2003-11-02-NodeCollapsing.ll @@ -1,7 +1,7 @@ ; This is the same testcase as 2003-06-29-NodeCollapsing2.ll, but it uses the ; graph checker. ; -; RUN: analyze %s -datastructure-gc -dsgc-abort-if-any-collapsed +; RUN: opt -analyze %s -datastructure-gc -dsgc-abort-if-any-collapsed ; %S = type { double, int } diff --git a/test/Analysis/DSGraph/2004-02-13-memcpy.ll b/test/Analysis/DSGraph/2004-02-13-memcpy.ll index 105709f12ec..3b06bae73c6 100644 --- a/test/Analysis/DSGraph/2004-02-13-memcpy.ll +++ b/test/Analysis/DSGraph/2004-02-13-memcpy.ll @@ -1,5 +1,5 @@ -; RUN: analyze %s -datastructure-gc -dsgc-check-flags=Xn:SMR -; RUN: analyze %s -datastructure-gc -dsgc-check-flags=X:SMR +; RUN: opt -analyze %s -datastructure-gc -dsgc-check-flags=Xn:SMR +; RUN: opt -analyze %s -datastructure-gc -dsgc-check-flags=X:SMR declare void %llvm.memcpy.i32(sbyte*, sbyte*, uint, uint) declare void %llvm.memmove.i32(sbyte*, sbyte*, uint, uint) diff --git a/test/Analysis/DSGraph/2005-03-22-IncompleteGlobal.ll b/test/Analysis/DSGraph/2005-03-22-IncompleteGlobal.ll index 0af1efab27f..1d3240217af 100644 --- a/test/Analysis/DSGraph/2005-03-22-IncompleteGlobal.ll +++ b/test/Analysis/DSGraph/2005-03-22-IncompleteGlobal.ll @@ -1,5 +1,5 @@ -; RUN: analyze %s -datastructure-gc -dsgc-check-flags=G:GIM -dsgc-dspass=bu &&\ -; RUN: analyze %s -datastructure-gc -dsgc-check-flags=G:GIM -dsgc-dspass=td +; RUN: opt -analyze %s -datastructure-gc -dsgc-check-flags=G:GIM -dsgc-dspass=bu &&\ +; RUN: opt -analyze %s -datastructure-gc -dsgc-check-flags=G:GIM -dsgc-dspass=td %S = type { double, int } diff --git a/test/Analysis/DSGraph/2006-03-27-LinkedCollapsed.ll b/test/Analysis/DSGraph/2006-03-27-LinkedCollapsed.ll index 06af9063233..ce1ebb92027 100644 --- a/test/Analysis/DSGraph/2006-03-27-LinkedCollapsed.ll +++ b/test/Analysis/DSGraph/2006-03-27-LinkedCollapsed.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | analyze -datastructure +; RUN: llvm-as < %s | opt -analyze -datastructure target endian = little target pointersize = 32 diff --git a/test/Analysis/DSGraph/2006-04-13-ZeroArrayStruct.ll b/test/Analysis/DSGraph/2006-04-13-ZeroArrayStruct.ll index c12bb9e8379..0fa6ba8d8f3 100644 --- a/test/Analysis/DSGraph/2006-04-13-ZeroArrayStruct.ll +++ b/test/Analysis/DSGraph/2006-04-13-ZeroArrayStruct.ll @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | analyze -datastructure +; RUN: llvm-as < %s | opt -analyze -datastructure ; ModuleID = 'bug3.bc' target endian = little diff --git a/test/Analysis/DSGraph/2006-04-25-ZeroArrayStructUse.ll b/test/Analysis/DSGraph/2006-04-25-ZeroArrayStructUse.ll index b8238f06dd3..aa41920252f 100644 --- a/test/Analysis/DSGraph/2006-04-25-ZeroArrayStructUse.ll +++ b/test/Analysis/DSGraph/2006-04-25-ZeroArrayStructUse.ll @@ -1,4 +1,4 @@ -; RUN: analyze %s -datastructure-gc -dsgc-check-flags=x:IA +; RUN: opt -analyze %s -datastructure-gc -dsgc-check-flags=x:IA ; ModuleID = 'bug3.bc' target endian = little diff --git a/test/Analysis/DSGraph/FunctionPointerTable-const.ll b/test/Analysis/DSGraph/FunctionPointerTable-const.ll index 76c226570f5..4031a09fb23 100644 --- a/test/Analysis/DSGraph/FunctionPointerTable-const.ll +++ b/test/Analysis/DSGraph/FunctionPointerTable-const.ll @@ -1,7 +1,7 @@ ; FIXME: this should be SHM for bu, but change it for now since besides incompleteness ; this is working -; RUN: analyze %s -datastructure-gc -dsgc-dspass=bu -dsgc-check-flags=Y:SHIM && \ -; RUN: analyze %s -datastructure-gc -dsgc-dspass=td -dsgc-check-flags=P1:SHM,P2:SHM +; RUN: opt -analyze %s -datastructure-gc -dsgc-dspass=bu -dsgc-check-flags=Y:SHIM && \ +; RUN: opt -analyze %s -datastructure-gc -dsgc-dspass=td -dsgc-check-flags=P1:SHM,P2:SHM %G = internal constant [2 x int*(int*)*] [ int*(int*)* %callee1, int*(int*)* %callee2 diff --git a/test/Analysis/DSGraph/GlobalsGraphFuncPtr.ll b/test/Analysis/DSGraph/GlobalsGraphFuncPtr.ll index 99ac4734d42..ea5c04e4c03 100644 --- a/test/Analysis/DSGraph/GlobalsGraphFuncPtr.ll +++ b/test/Analysis/DSGraph/GlobalsGraphFuncPtr.ll @@ -5,7 +5,7 @@ ; -- globals in GG pointed to by latter should be marked I, but not other nodes ; ; FIXME: KnownPtr should be just S. -; RUN: analyze %s -datastructure-gc -dsgc-check-flags=KnownPtr:SI,UnknownPtr:SI -dsgc-dspass=bu +; RUN: opt -analyze %s -datastructure-gc -dsgc-check-flags=KnownPtr:SI,UnknownPtr:SI -dsgc-dspass=bu %Z = internal global int 0 %X = internal global int 0 diff --git a/test/Analysis/DSGraph/HardBUCase.ll b/test/Analysis/DSGraph/HardBUCase.ll index 6d9aa055a92..318b4f28b9e 100644 --- a/test/Analysis/DSGraph/HardBUCase.ll +++ b/test/Analysis/DSGraph/HardBUCase.ll @@ -1,4 +1,4 @@ -; RUN: analyze %s -budatastructure -dont-print-ds +; RUN: opt -analyze %s -budatastructure -dont-print-ds %MidFnTy = type void (\2*) diff --git a/test/Analysis/DSGraph/PhysicalSubtyping.ll b/test/Analysis/DSGraph/PhysicalSubtyping.ll index d9ac454522f..59575484a43 100644 --- a/test/Analysis/DSGraph/PhysicalSubtyping.ll +++ b/test/Analysis/DSGraph/PhysicalSubtyping.ll @@ -1,6 +1,6 @@ ; Test to check for support for "physical subtyping" ; -; RUN: analyze %s -datastructure-gc -dsgc-abort-if-any-collapsed +; RUN: opt -analyze %s -datastructure-gc -dsgc-abort-if-any-collapsed ; %S = type { int } %T = type { int, float, double } diff --git a/test/Analysis/DSGraph/SCCSimpleExample.ll b/test/Analysis/DSGraph/SCCSimpleExample.ll index 3c71c3461c3..825c5797455 100644 --- a/test/Analysis/DSGraph/SCCSimpleExample.ll +++ b/test/Analysis/DSGraph/SCCSimpleExample.ll @@ -1,5 +1,5 @@ -; RUN: analyze %s -datastructure-gc --dsgc-abort-if-merged=Y,BVal +; RUN: opt -analyze %s -datastructure-gc --dsgc-abort-if-merged=Y,BVal implementation diff --git a/test/Analysis/DSGraph/constant_globals.ll b/test/Analysis/DSGraph/constant_globals.ll index f42aec91e5d..2473d1dd831 100644 --- a/test/Analysis/DSGraph/constant_globals.ll +++ b/test/Analysis/DSGraph/constant_globals.ll @@ -1,5 +1,5 @@ ; FIXME: A should just be SM -; RUN: analyze %s -datastructure-gc -dsgc-dspass=bu -dsgc-check-flags=A:SIM +; RUN: opt -analyze %s -datastructure-gc -dsgc-dspass=bu -dsgc-check-flags=A:SIM ; Constant globals should not mark stuff incomplete. This should allow the ; bu pass to resolve the indirect call immediately in "test", allowing %A to ; be marked complete and the store to happen. diff --git a/test/Analysis/DSGraph/strcpy.ll b/test/Analysis/DSGraph/strcpy.ll index 7cb20119879..ae936d32a7d 100644 --- a/test/Analysis/DSGraph/strcpy.ll +++ b/test/Analysis/DSGraph/strcpy.ll @@ -3,7 +3,7 @@ ; has no defined way to check for this, so DSA can know that strcpy doesn't ; require merging the input arguments. -; RUN: analyze %s -datastructure-gc --dsgc-abort-if-merged=A,B --dsgc-check-flags=A:ASM,B:ASR --dsgc-dspass=bu +; RUN: opt -analyze %s -datastructure-gc --dsgc-abort-if-merged=A,B --dsgc-check-flags=A:ASM,B:ASR --dsgc-dspass=bu implementation diff --git a/test/Analysis/Dominators/2003-05-12-UnreachableCode.ll b/test/Analysis/Dominators/2003-05-12-UnreachableCode.ll index e1e71cdc94b..d781eb53742 100644 --- a/test/Analysis/Dominators/2003-05-12-UnreachableCode.ll +++ b/test/Analysis/Dominators/2003-05-12-UnreachableCode.ll @@ -1,4 +1,4 @@ -; RUN: analyze %s -domset -disable-verify +; RUN: opt -analyze %s -domset -disable-verify ; int %re_match_2() { ENTRY: diff --git a/test/Analysis/LoopInfo/2003-05-15-NestingProblem.ll b/test/Analysis/LoopInfo/2003-05-15-NestingProblem.ll index 4feee420dd5..96099a8da97 100644 --- a/test/Analysis/LoopInfo/2003-05-15-NestingProblem.ll +++ b/test/Analysis/LoopInfo/2003-05-15-NestingProblem.ll @@ -1,7 +1,7 @@ ; This testcase was incorrectly computing that the loopentry.7 loop was ; not a child of the loopentry.6 loop. ; -; RUN: analyze %s -loops | grep "^ Loop Containing: %loopentry.7" +; RUN: opt -analyze %s -loops | grep "^ Loop Containing: %loopentry.7" void %getAndMoveToFrontDecode() { ; No predecessors! br label %endif.2 diff --git a/test/Transforms/DSAnalysis/arraymerge.ll b/test/Transforms/DSAnalysis/arraymerge.ll index c4ac718c1c2..30f458308e7 100644 --- a/test/Transforms/DSAnalysis/arraymerge.ll +++ b/test/Transforms/DSAnalysis/arraymerge.ll @@ -2,7 +2,7 @@ ; folded completely away if possible. This is a very common case, so it should ; be efficient. ; -; RUN: analyze %s -tddatastructure +; RUN: opt -analyze %s -tddatastructure ; implementation diff --git a/test/Transforms/DSAnalysis/arraytest.ll b/test/Transforms/DSAnalysis/arraytest.ll index 521bd630e35..bb6c4c148e0 100644 --- a/test/Transforms/DSAnalysis/arraytest.ll +++ b/test/Transforms/DSAnalysis/arraytest.ll @@ -1,5 +1,5 @@ ; -; RUN: analyze %s -tddatastructure +; RUN: opt -analyze %s -tddatastructure %crazy = type [2 x { [2 x sbyte], short } ] implementation diff --git a/test/Transforms/DSAnalysis/badcases.ll b/test/Transforms/DSAnalysis/badcases.ll index b841b6e8d85..a977f23bb57 100644 --- a/test/Transforms/DSAnalysis/badcases.ll +++ b/test/Transforms/DSAnalysis/badcases.ll @@ -1,6 +1,6 @@ ; This file contains a list of situations where node folding should happen... ; -; RUN: analyze %s -tddatastructure +; RUN: opt -analyze %s -tddatastructure implementation diff --git a/test/Transforms/DSAnalysis/basictest.ll b/test/Transforms/DSAnalysis/basictest.ll index 615e0219cf1..a3583a1475c 100644 --- a/test/Transforms/DSAnalysis/basictest.ll +++ b/test/Transforms/DSAnalysis/basictest.ll @@ -1,6 +1,6 @@ ; very simple test ; -; RUN: analyze %s -tddatastructure +; RUN: opt -analyze %s -tddatastructure implementation diff --git a/test/Transforms/DSAnalysis/fieldmerge.ll b/test/Transforms/DSAnalysis/fieldmerge.ll index 4dcefb7f3b4..a754d066436 100644 --- a/test/Transforms/DSAnalysis/fieldmerge.ll +++ b/test/Transforms/DSAnalysis/fieldmerge.ll @@ -1,5 +1,5 @@ ; -; RUN: analyze %s -tddatastructure +; RUN: opt -analyze %s -tddatastructure %str = type { int*, int* } diff --git a/test/Transforms/DSAnalysis/goodcases.ll b/test/Transforms/DSAnalysis/goodcases.ll index 1d545b3965e..f6d9ff9fa28 100644 --- a/test/Transforms/DSAnalysis/goodcases.ll +++ b/test/Transforms/DSAnalysis/goodcases.ll @@ -1,6 +1,6 @@ ; This file contains a list of cases where node folding should NOT happen ; -; RUN: analyze %s -tddatastructure +; RUN: opt -analyze %s -tddatastructure ; implementation diff --git a/test/Transforms/DSAnalysis/indcalltest.ll b/test/Transforms/DSAnalysis/indcalltest.ll index 16cb6bea18f..1ec92d30d74 100644 --- a/test/Transforms/DSAnalysis/indcalltest.ll +++ b/test/Transforms/DSAnalysis/indcalltest.ll @@ -1,5 +1,5 @@ ; -; RUN: analyze %s -tddatastructure +; RUN: opt -analyze %s -tddatastructure %G = global int 2 ; [#uses=1] %H = global int* null diff --git a/test/Transforms/DSAnalysis/misctests.ll b/test/Transforms/DSAnalysis/misctests.ll index 29c7079ac53..acdbabf8362 100644 --- a/test/Transforms/DSAnalysis/misctests.ll +++ b/test/Transforms/DSAnalysis/misctests.ll @@ -1,5 +1,5 @@ ; -; RUN: analyze %s -tddatastructure +; RUN: opt -analyze %s -tddatastructure int* %test1(int *%A) { %R = getelementptr int* %A, long 1 diff --git a/test/Transforms/DSAnalysis/physicalsubtype.ll b/test/Transforms/DSAnalysis/physicalsubtype.ll index 2beb3eca6bc..26fa511f40d 100644 --- a/test/Transforms/DSAnalysis/physicalsubtype.ll +++ b/test/Transforms/DSAnalysis/physicalsubtype.ll @@ -1,6 +1,6 @@ ; A test for "physical subtyping" used in some C programs... ; -; RUN: analyze %s -tddatastructure +; RUN: opt -analyze %s -tddatastructure ; %ST = type { int, int* } ; "Subtype" %DT = type { int, int*, int } ; "derived type" diff --git a/test/Transforms/DSAnalysis/recursion.ll b/test/Transforms/DSAnalysis/recursion.ll index 6acdd24853a..da075cd9c37 100644 --- a/test/Transforms/DSAnalysis/recursion.ll +++ b/test/Transforms/DSAnalysis/recursion.ll @@ -1,4 +1,4 @@ -; RUN: analyze %s -tddatastructure +; RUN: opt -analyze %s -tddatastructure implementation ; Functions: diff --git a/test/Transforms/DSAnalysis/simplest-test.ll b/test/Transforms/DSAnalysis/simplest-test.ll index b7574039664..b398c285467 100644 --- a/test/Transforms/DSAnalysis/simplest-test.ll +++ b/test/Transforms/DSAnalysis/simplest-test.ll @@ -1,4 +1,4 @@ -; RUN: analyze %s -tddatastructure +; RUN: opt -analyze %s -tddatastructure void %foo(int* %X) { store int 4, int* %X diff --git a/test/Transforms/DSAnalysis/simpletest.ll b/test/Transforms/DSAnalysis/simpletest.ll index 298aa836710..80b94335d3d 100644 --- a/test/Transforms/DSAnalysis/simpletest.ll +++ b/test/Transforms/DSAnalysis/simpletest.ll @@ -1,4 +1,4 @@ -; RUN: analyze %s -tddatastructure +; RUN: opt -analyze %s -tddatastructure implementation diff --git a/test/Transforms/DSAnalysis/structpadding.ll b/test/Transforms/DSAnalysis/structpadding.ll index 693c9888b98..5b3c8b86a4d 100644 --- a/test/Transforms/DSAnalysis/structpadding.ll +++ b/test/Transforms/DSAnalysis/structpadding.ll @@ -1,4 +1,4 @@ -; RUN: analyze %s -tddatastructure +; RUN: opt -analyze %s -tddatastructure %str = type { int, int* } diff --git a/tools/Makefile b/tools/Makefile index 99e73960ac3..649c655be9f 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -9,8 +9,7 @@ LEVEL := .. PARALLEL_DIRS := llvm-config llvm-as llvm-dis opt gccas llc llvm-link lli gccld\ - llvm-stub analyze llvm-extract llvm-nm llvm-prof llvm-ar \ - llvm-ranlib llvm-bcanalyzer llvmc llvm-ld llvm-db bugpoint \ - llvm2cpp + llvm-stub llvm-extract llvm-nm llvm-prof llvm-ar llvm-ranlib \ + llvm-bcanalyzer llvmc llvm-ld llvm-db bugpoint llvm2cpp include $(LEVEL)/Makefile.common diff --git a/tools/analyze/AnalysisWrappers.cpp b/tools/analyze/AnalysisWrappers.cpp deleted file mode 100644 index b371d50ef33..00000000000 --- a/tools/analyze/AnalysisWrappers.cpp +++ /dev/null @@ -1,81 +0,0 @@ -//===- AnalysisWrappers.cpp - Wrappers around non-pass analyses -----------===// -// -// The LLVM Compiler Infrastructure -// -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines pass wrappers around LLVM analyses that don't make sense to -// be passes. It provides a nice standard pass interface to these classes so -// that they can be printed out by analyze. -// -// These classes are separated out of analyze.cpp so that it is more clear which -// code is the integral part of the analyze tool, and which part of the code is -// just making it so more passes are available. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Module.h" -#include "llvm/Pass.h" -#include "llvm/Support/CallSite.h" -#include "llvm/Analysis/CallGraph.h" -#include -using namespace llvm; - -namespace { - /// ExternalFunctionsPassedConstants - This pass prints out call sites to - /// external functions that are called with constant arguments. This can be - /// useful when looking for standard library functions we should constant fold - /// or handle in alias analyses. - struct ExternalFunctionsPassedConstants : public ModulePass { - virtual bool runOnModule(Module &M) { - for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) - if (I->isExternal()) { - bool PrintedFn = false; - for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); - UI != E; ++UI) - if (Instruction *User = dyn_cast(*UI)) { - CallSite CS = CallSite::get(User); - if (CS.getInstruction()) { - for (CallSite::arg_iterator AI = CS.arg_begin(), - E = CS.arg_end(); AI != E; ++AI) - if (isa(*AI)) { - if (!PrintedFn) { - std::cerr << "Function '" << I->getName() << "':\n"; - PrintedFn = true; - } - std::cerr << *User; - break; - } - } - } - } - - return false; - } - - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - } - }; - - RegisterAnalysis - P1("externalfnconstants", "Print external fn callsites passed constants"); - - struct CallGraphPrinter : public ModulePass { - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - AU.addRequired(); - } - virtual bool runOnModule(Module &M) { return false; } - - virtual void print(std::ostream &OS, const Module *M) const { - getAnalysis().print(OS, M); - } - }; - - RegisterAnalysis - P2("callgraph", "Print a call graph"); -} diff --git a/tools/analyze/GraphPrinters.cpp b/tools/analyze/GraphPrinters.cpp deleted file mode 100644 index 8826cd2a777..00000000000 --- a/tools/analyze/GraphPrinters.cpp +++ /dev/null @@ -1,77 +0,0 @@ -//===- GraphPrinters.cpp - DOT printers for various graph types -----------===// -// -// The LLVM Compiler Infrastructure -// -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines several printers for various different types of graphs used -// by the LLVM infrastructure. It uses the generic graph interface to convert -// the graph into a .dot graph. These graphs can then be processed with the -// "dot" tool to convert them to postscript or some other suitable format. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Support/GraphWriter.h" -#include "llvm/Pass.h" -#include "llvm/Value.h" -#include "llvm/Analysis/CallGraph.h" -#include -using namespace llvm; - -template -static void WriteGraphToFile(std::ostream &O, const std::string &GraphName, - const GraphType >) { - std::string Filename = GraphName + ".dot"; - O << "Writing '" << Filename << "'..."; - std::ofstream F(Filename.c_str()); - - if (F.good()) - WriteGraph(F, GT); - else - O << " error opening file for writing!"; - O << "\n"; -} - - -//===----------------------------------------------------------------------===// -// Call Graph Printer -//===----------------------------------------------------------------------===// - -namespace llvm { - template<> - struct DOTGraphTraits : public DefaultDOTGraphTraits { - static std::string getGraphName(CallGraph *F) { - return "Call Graph"; - } - - static std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) { - if (Node->getFunction()) - return ((Value*)Node->getFunction())->getName(); - else - return "Indirect call node"; - } - }; -} - - -namespace { - struct CallGraphPrinter : public ModulePass { - virtual bool runOnModule(Module &M) { - WriteGraphToFile(std::cerr, "callgraph", &getAnalysis()); - return false; - } - - void print(std::ostream &OS) const {} - - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.addRequired(); - AU.setPreservesAll(); - } - }; - - RegisterAnalysis P2("print-callgraph", - "Print Call Graph to 'dot' file"); -} diff --git a/tools/analyze/Makefile b/tools/analyze/Makefile deleted file mode 100644 index e3885a93581..00000000000 --- a/tools/analyze/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -##===- tools/analyze/Makefile ------------------------------*- Makefile -*-===## -# -# The LLVM Compiler Infrastructure -# -# This file was developed by the LLVM research group and is distributed under -# the University of Illinois Open Source License. See LICENSE.TXT for details. -# -##===----------------------------------------------------------------------===## -LEVEL = ../.. -TOOLNAME = analyze -USEDLIBS = LLVMAsmParser.a LLVMBCReader.a LLVMAnalysis.a LLVMipa.a \ - LLVMDataStructure \ - LLVMScalarOpts.a LLVMTransforms.a LLVMTarget.a LLVMScalarOpts.a \ - LLVMTransformUtils.a LLVMCore.a LLVMSupport.a LLVMbzip2.a LLVMSystem.a -REQUIRES_EH := 1 - -include $(LEVEL)/Makefile.common diff --git a/tools/analyze/PrintSCC.cpp b/tools/analyze/PrintSCC.cpp deleted file mode 100644 index c0adf5ca034..00000000000 --- a/tools/analyze/PrintSCC.cpp +++ /dev/null @@ -1,105 +0,0 @@ -//===- PrintSCC.cpp - Enumerate SCCs in some key graphs -------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file provides passes to print out SCCs in a CFG or a CallGraph. -// Normally, you would not use these passes; instead, you would use the -// scc_iterator directly to enumerate SCCs and process them in some way. These -// passes serve three purposes: -// -// (1) As a reference for how to use the scc_iterator. -// (2) To print out the SCCs for a CFG or a CallGraph: -// analyze -cfgscc to print the SCCs in each CFG of a module. -// analyze -cfgscc -stats to print the #SCCs and the maximum SCC size. -// analyze -cfgscc -debug > /dev/null to watch the algorithm in action. -// -// and similarly: -// analyze -callscc [-stats] [-debug] to print SCCs in the CallGraph -// -// (3) To test the scc_iterator. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Pass.h" -#include "llvm/Module.h" -#include "llvm/Analysis/CallGraph.h" -#include "llvm/Support/CFG.h" -#include "llvm/ADT/SCCIterator.h" -#include -using namespace llvm; - -namespace { - struct CFGSCC : public FunctionPass { - bool runOnFunction(Function& func); - - void print(std::ostream &O, const Module* = 0) const { } - - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - } - }; - - struct CallGraphSCC : public ModulePass { - // run - Print out SCCs in the call graph for the specified module. - bool runOnModule(Module &M); - - void print(std::ostream &O, const Module* = 0) const { } - - // getAnalysisUsage - This pass requires the CallGraph. - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - AU.addRequired(); - } - }; - - RegisterAnalysis - Y("cfgscc", "Print SCCs of each function CFG"); - - RegisterAnalysis - Z("callscc", "Print SCCs of the Call Graph"); -} - -bool CFGSCC::runOnFunction(Function &F) { - unsigned sccNum = 0; - std::cout << "SCCs for Function " << F.getName() << " in PostOrder:"; - for (scc_iterator SCCI = scc_begin(&F), - E = scc_end(&F); SCCI != E; ++SCCI) { - std::vector &nextSCC = *SCCI; - std::cout << "\nSCC #" << ++sccNum << " : "; - for (std::vector::const_iterator I = nextSCC.begin(), - E = nextSCC.end(); I != E; ++I) - std::cout << (*I)->getName() << ", "; - if (nextSCC.size() == 1 && SCCI.hasLoop()) - std::cout << " (Has self-loop)."; - } - std::cout << "\n"; - - return true; -} - - -// run - Print out SCCs in the call graph for the specified module. -bool CallGraphSCC::runOnModule(Module &M) { - CallGraphNode* rootNode = getAnalysis().getRoot(); - unsigned sccNum = 0; - std::cout << "SCCs for the program in PostOrder:"; - for (scc_iterator SCCI = scc_begin(rootNode), - E = scc_end(rootNode); SCCI != E; ++SCCI) { - const std::vector &nextSCC = *SCCI; - std::cout << "\nSCC #" << ++sccNum << " : "; - for (std::vector::const_iterator I = nextSCC.begin(), - E = nextSCC.end(); I != E; ++I) - std::cout << ((*I)->getFunction() ? (*I)->getFunction()->getName() - : std::string("Indirect CallGraph node")) << ", "; - if (nextSCC.size() == 1 && SCCI.hasLoop()) - std::cout << " (Has self-loop)."; - } - std::cout << "\n"; - - return true; -} diff --git a/tools/analyze/analyze.cpp b/tools/analyze/analyze.cpp deleted file mode 100644 index e6b2be5adab..00000000000 --- a/tools/analyze/analyze.cpp +++ /dev/null @@ -1,188 +0,0 @@ -//===- analyze.cpp - The LLVM analyze utility -----------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This utility is designed to print out the results of running various analysis -// passes on a program. This is useful for understanding a program, or for -// debugging an analysis pass. -// -// analyze --help - Output information about command line switches -// analyze --quiet - Do not print analysis name before output -// -//===----------------------------------------------------------------------===// - -#include "llvm/Module.h" -#include "llvm/PassManager.h" -#include "llvm/Bytecode/Reader.h" -#include "llvm/Assembly/Parser.h" -#include "llvm/Analysis/Verifier.h" -#include "llvm/Analysis/LinkAllAnalyses.h" -#include "llvm/Target/TargetData.h" -#include "llvm/Support/PassNameParser.h" -#include "llvm/System/Signals.h" -#include "llvm/Support/PluginLoader.h" -#include "llvm/Support/Timer.h" -#include "llvm/LinkAllVMCore.h" -#include - -using namespace llvm; - -namespace { - cl::opt - InputFilename(cl::Positional, cl::desc(""), cl::init("-"), - cl::value_desc("filename")); - - cl::opt Quiet("q", cl::desc("Don't print analysis pass names")); - cl::alias QuietA("quiet", cl::desc("Alias for -q"), - cl::aliasopt(Quiet)); - - cl::opt NoVerify("disable-verify", cl::Hidden, - cl::desc("Do not verify input module")); - - // The AnalysesList is automatically populated with registered Passes by the - // PassNameParser. - // - cl::list > - AnalysesList(cl::desc("Analyses available:")); - - Timer BytecodeLoadTimer("Bytecode Loader"); -} - -struct ModulePassPrinter : public ModulePass { - const PassInfo *PassToPrint; - ModulePassPrinter(const PassInfo *PI) : PassToPrint(PI) {} - - virtual bool runOnModule(Module &M) { - if (!Quiet) { - std::cout << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; - getAnalysisID(PassToPrint).print(std::cout, &M); - } - - // Get and print pass... - return false; - } - - virtual const char *getPassName() const { return "'Pass' Printer"; } - - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.addRequiredID(PassToPrint); - AU.setPreservesAll(); - } -}; - -struct FunctionPassPrinter : public FunctionPass { - const PassInfo *PassToPrint; - FunctionPassPrinter(const PassInfo *PI) : PassToPrint(PI) {} - - virtual bool runOnFunction(Function &F) { - if (!Quiet) { - std::cout << "Printing analysis '" << PassToPrint->getPassName() - << "' for function '" << F.getName() << "':\n"; - } - // Get and print pass... - getAnalysisID(PassToPrint).print(std::cout, F.getParent()); - return false; - } - - virtual const char *getPassName() const { return "FunctionPass Printer"; } - - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.addRequiredID(PassToPrint); - AU.setPreservesAll(); - } -}; - -struct BasicBlockPassPrinter : public BasicBlockPass { - const PassInfo *PassToPrint; - BasicBlockPassPrinter(const PassInfo *PI) : PassToPrint(PI) {} - - virtual bool runOnBasicBlock(BasicBlock &BB) { - if (!Quiet) { - std::cout << "Printing Analysis info for BasicBlock '" << BB.getName() - << "': Pass " << PassToPrint->getPassName() << ":\n"; - } - - // Get and print pass... - getAnalysisID(PassToPrint).print(std::cout, BB.getParent()->getParent()); - return false; - } - - virtual const char *getPassName() const { return "BasicBlockPass Printer"; } - - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.addRequiredID(PassToPrint); - AU.setPreservesAll(); - } -}; - - - -int main(int argc, char **argv) { - try { - cl::ParseCommandLineOptions(argc, argv, " llvm analysis printer tool\n"); - sys::PrintStackTraceOnErrorSignal(); - - Module *CurMod = 0; - try { -#if 0 - TimeRegion RegionTimer(BytecodeLoadTimer); -#endif - CurMod = ParseBytecodeFile(InputFilename); - if (!CurMod && !(CurMod = ParseAssemblyFile(InputFilename))){ - std::cerr << argv[0] << ": input file didn't read correctly.\n"; - return 1; - } - } catch (const ParseException &E) { - std::cerr << argv[0] << ": " << E.getMessage() << "\n"; - return 1; - } - - // Create a PassManager to hold and optimize the collection of passes we are - // about to build... - // - PassManager Passes; - - // Add an appropriate TargetData instance for this module... - Passes.add(new TargetData(CurMod)); - - // Make sure the input LLVM is well formed. - if (!NoVerify) - Passes.add(createVerifierPass()); - - // Create a new optimization pass for each one specified on the command line - for (unsigned i = 0; i < AnalysesList.size(); ++i) { - const PassInfo *Analysis = AnalysesList[i]; - - if (Analysis->getNormalCtor()) { - Pass *P = Analysis->getNormalCtor()(); - Passes.add(P); - - if (BasicBlockPass *BBP = dynamic_cast(P)) - Passes.add(new BasicBlockPassPrinter(Analysis)); - else if (FunctionPass *FP = dynamic_cast(P)) - Passes.add(new FunctionPassPrinter(Analysis)); - else - Passes.add(new ModulePassPrinter(Analysis)); - - } else - std::cerr << argv[0] << ": cannot create pass: " - << Analysis->getPassName() << "\n"; - } - - Passes.run(*CurMod); - - delete CurMod; - return 0; - - } catch (const std::string& msg) { - std::cerr << argv[0] << ": " << msg << "\n"; - } catch (...) { - std::cerr << argv[0] << ": Unexpected unknown exception occurred.\n"; - } - return 1; -} diff --git a/tools/opt/Makefile b/tools/opt/Makefile index f310639c08b..9e4cddfa976 100644 --- a/tools/opt/Makefile +++ b/tools/opt/Makefile @@ -10,9 +10,9 @@ LEVEL = ../.. TOOLNAME = opt REQUIRES_EH := 1 -USEDLIBS = LLVMBCReader.a LLVMBCWriter.a LLVMInstrumentation.a \ - LLVMScalarOpts.a LLVMipo.a LLVMipa.a LLVMDataStructure LLVMTransforms.a \ - LLVMTarget.a LLVMTransformUtils.a LLVMAnalysis.a LLVMCore.a LLVMSupport.a \ - LLVMbzip2.a LLVMSystem.a +USEDLIBS = LLVMAsmParser.a LLVMBCReader.a LLVMBCWriter.a LLVMInstrumentation.a \ + LLVMScalarOpts.a LLVMipo.a LLVMipa.a LLVMDataStructure \ + LLVMTransforms.a LLVMTarget.a LLVMTransformUtils.a LLVMAnalysis.a \ + LLVMCore.a LLVMSupport.a LLVMbzip2.a LLVMSystem.a include $(LEVEL)/Makefile.common diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index 096506ff392..b67892bb34a 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -8,11 +8,12 @@ //===----------------------------------------------------------------------===// // // Optimizations may be specified an arbitrary number of times on the command -// line, they are run in the order specified. +// line, They are run in the order specified. // //===----------------------------------------------------------------------===// #include "llvm/Module.h" +#include "llvm/Assembly/Parser.h" #include "llvm/PassManager.h" #include "llvm/Bytecode/Reader.h" #include "llvm/Bytecode/WriteBytecodePass.h" @@ -24,6 +25,8 @@ #include "llvm/System/Signals.h" #include "llvm/Support/PluginLoader.h" #include "llvm/Support/SystemUtils.h" +#include "llvm/Support/Timer.h" +#include "llvm/Analysis/LinkAllAnalyses.h" #include "llvm/Transforms/LinkAllPasses.h" #include "llvm/LinkAllVMCore.h" #include @@ -43,7 +46,8 @@ OptimizationList(cl::desc("Optimizations available:")); // Other command line options... // static cl::opt -InputFilename(cl::Positional, cl::desc(""), cl::init("-")); +InputFilename(cl::Positional, cl::desc(""), + cl::init("-"), cl::value_desc("filename")); static cl::opt OutputFilename("o", cl::desc("Override output filename"), @@ -68,6 +72,91 @@ Quiet("q", cl::desc("Obsolete option"), cl::Hidden); static cl::alias QuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet)); +static cl::opt +AnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization")); + +// The AnalysesList is automatically populated with registered Passes by the +// PassNameParser. +static + cl::list > + AnalysesList(cl::desc("Analyses available:")); + +static Timer BytecodeLoadTimer("Bytecode Loader"); + +// ---------- Define Printers for module and function passes ------------ +namespace { + +struct ModulePassPrinter : public ModulePass { + const PassInfo *PassToPrint; + ModulePassPrinter(const PassInfo *PI) : PassToPrint(PI) {} + + virtual bool runOnModule(Module &M) { + if (!Quiet) { + std::cout << "Printing analysis '" << PassToPrint->getPassName() + << "':\n"; + getAnalysisID(PassToPrint).print(std::cout, &M); + } + + // Get and print pass... + return false; + } + + virtual const char *getPassName() const { return "'Pass' Printer"; } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequiredID(PassToPrint); + AU.setPreservesAll(); + } +}; + +struct FunctionPassPrinter : public FunctionPass { + const PassInfo *PassToPrint; + FunctionPassPrinter(const PassInfo *PI) : PassToPrint(PI) {} + + virtual bool runOnFunction(Function &F) { + if (!Quiet) { + std::cout << "Printing analysis '" << PassToPrint->getPassName() + << "' for function '" << F.getName() << "':\n"; + } + // Get and print pass... + getAnalysisID(PassToPrint).print(std::cout, F.getParent()); + return false; + } + + virtual const char *getPassName() const { return "FunctionPass Printer"; } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequiredID(PassToPrint); + AU.setPreservesAll(); + } +}; + +struct BasicBlockPassPrinter : public BasicBlockPass { + const PassInfo *PassToPrint; + BasicBlockPassPrinter(const PassInfo *PI) : PassToPrint(PI) {} + + virtual bool runOnBasicBlock(BasicBlock &BB) { + if (!Quiet) { + std::cout << "Printing Analysis info for BasicBlock '" << BB.getName() + << "': Pass " << PassToPrint->getPassName() << ":\n"; + } + + // Get and print pass... + getAnalysisID(PassToPrint).print( + std::cout, BB.getParent()->getParent()); + return false; + } + + virtual const char *getPassName() const { return "BasicBlockPass Printer"; } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequiredID(PassToPrint); + AU.setPreservesAll(); + } +}; + +} // anonymous namespace + //===----------------------------------------------------------------------===// // main for opt @@ -75,9 +164,63 @@ QuietA("quiet", cl::desc("Alias for -q"), cl::aliasopt(Quiet)); int main(int argc, char **argv) { try { cl::ParseCommandLineOptions(argc, argv, - " llvm .bc -> .bc modular optimizer\n"); + " llvm .bc -> .bc modular optimizer and analysis printer \n"); sys::PrintStackTraceOnErrorSignal(); + if (AnalyzeOnly) { + Module *CurMod = 0; + try { +#if 0 + TimeRegion RegionTimer(BytecodeLoadTimer); +#endif + CurMod = ParseBytecodeFile(InputFilename); + if (!CurMod && !(CurMod = ParseAssemblyFile(InputFilename))){ + std::cerr << argv[0] << ": input file didn't read correctly.\n"; + return 1; + } + } catch (const ParseException &E) { + std::cerr << argv[0] << ": " << E.getMessage() << "\n"; + return 1; + } + + // Create a PassManager to hold and optimize the collection of passes we + // are about to build... + PassManager Passes; + + // Add an appropriate TargetData instance for this module... + Passes.add(new TargetData(CurMod)); + + // Make sure the input LLVM is well formed. + if (!NoVerify) + Passes.add(createVerifierPass()); + + // Create a new optimization pass for each one specified on the + // command line + for (unsigned i = 0; i < AnalysesList.size(); ++i) { + const PassInfo *Analysis = AnalysesList[i]; + + if (Analysis->getNormalCtor()) { + Pass *P = Analysis->getNormalCtor()(); + Passes.add(P); + + if (BasicBlockPass *BBP = dynamic_cast(P)) + Passes.add(new BasicBlockPassPrinter(Analysis)); + else if (FunctionPass *FP = dynamic_cast(P)) + Passes.add(new FunctionPassPrinter(Analysis)); + else + Passes.add(new ModulePassPrinter(Analysis)); + + } else + std::cerr << argv[0] << ": cannot create pass: " + << Analysis->getPassName() << "\n"; + } + + Passes.run(*CurMod); + + delete CurMod; + return 0; + } + // Allocate a full target machine description only if necessary... // FIXME: The choice of target should be controllable on the command line. std::auto_ptr target; @@ -169,6 +312,7 @@ int main(int argc, char **argv) { Passes.run(*M.get()); return 0; + } catch (const std::string& msg) { std::cerr << argv[0] << ": " << msg << "\n"; } catch (...) {