aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2006-08-18 06:34:30 +0000
committerReid Spencer <rspencer@reidspencer.com>2006-08-18 06:34:30 +0000
commitfd90dd5d5513f9e7130bab0da334ad2ad8ef4e02 (patch)
tree39db9e9d2bfc255238fa71e44cfab0e76ab94921
parent31c8e1d6aa5ffe90b4bf23e8a7c0a602d64ab2ae (diff)
downloadexternal_llvm-fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02.zip
external_llvm-fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02.tar.gz
external_llvm-fd90dd5d5513f9e7130bab0da334ad2ad8ef4e02.tar.bz2
For PR872:
Shrinkify LLVM's footprint by removing the analyze tool and moving its functionality into the opt tool. THis eliminates one of the largest tools from LLVM and doesn't make opt much bigger because it already included most of the analysis passes. To get the old analyze functionality pass the -analyze option to opt. Note that the integeration here is dead simple. The "main" of analyze was just copied to opt and invoked if the -analyze option was given. There may be opportunities for further integration such as removing the distinction between transform passes and analysis passes. To use the analysis functionality, if you previously did this: analyze $FNAME -domset -disable-verify you would now do this: opt -analyze $FNAME -domset -disable-verify Pretty simple. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29762 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--test/Analysis/DSGraph/2003-06-29-IncompleteTDPass.ll2
-rw-r--r--test/Analysis/DSGraph/2003-06-29-NodeCollapsing2.ll2
-rw-r--r--test/Analysis/DSGraph/2003-06-30-TopDownResolve.ll2
-rw-r--r--test/Analysis/DSGraph/2003-07-01-FieldCollapse.ll2
-rw-r--r--test/Analysis/DSGraph/2003-07-16-ConstantExprCollapse.ll2
-rw-r--r--test/Analysis/DSGraph/2003-11-02-NodeCollapsing.ll2
-rw-r--r--test/Analysis/DSGraph/2004-02-13-memcpy.ll4
-rw-r--r--test/Analysis/DSGraph/2005-03-22-IncompleteGlobal.ll4
-rw-r--r--test/Analysis/DSGraph/2006-03-27-LinkedCollapsed.ll2
-rw-r--r--test/Analysis/DSGraph/2006-04-13-ZeroArrayStruct.ll2
-rw-r--r--test/Analysis/DSGraph/2006-04-25-ZeroArrayStructUse.ll2
-rw-r--r--test/Analysis/DSGraph/FunctionPointerTable-const.ll4
-rw-r--r--test/Analysis/DSGraph/GlobalsGraphFuncPtr.ll2
-rw-r--r--test/Analysis/DSGraph/HardBUCase.ll2
-rw-r--r--test/Analysis/DSGraph/PhysicalSubtyping.ll2
-rw-r--r--test/Analysis/DSGraph/SCCSimpleExample.ll2
-rw-r--r--test/Analysis/DSGraph/constant_globals.ll2
-rw-r--r--test/Analysis/DSGraph/strcpy.ll2
-rw-r--r--test/Analysis/Dominators/2003-05-12-UnreachableCode.ll2
-rw-r--r--test/Analysis/LoopInfo/2003-05-15-NestingProblem.ll2
-rw-r--r--test/Transforms/DSAnalysis/arraymerge.ll2
-rw-r--r--test/Transforms/DSAnalysis/arraytest.ll2
-rw-r--r--test/Transforms/DSAnalysis/badcases.ll2
-rw-r--r--test/Transforms/DSAnalysis/basictest.ll2
-rw-r--r--test/Transforms/DSAnalysis/fieldmerge.ll2
-rw-r--r--test/Transforms/DSAnalysis/goodcases.ll2
-rw-r--r--test/Transforms/DSAnalysis/indcalltest.ll2
-rw-r--r--test/Transforms/DSAnalysis/misctests.ll2
-rw-r--r--test/Transforms/DSAnalysis/physicalsubtype.ll2
-rw-r--r--test/Transforms/DSAnalysis/recursion.ll2
-rw-r--r--test/Transforms/DSAnalysis/simplest-test.ll2
-rw-r--r--test/Transforms/DSAnalysis/simpletest.ll2
-rw-r--r--test/Transforms/DSAnalysis/structpadding.ll2
-rw-r--r--tools/Makefile5
-rw-r--r--tools/analyze/AnalysisWrappers.cpp81
-rw-r--r--tools/analyze/GraphPrinters.cpp77
-rw-r--r--tools/analyze/Makefile17
-rw-r--r--tools/analyze/PrintSCC.cpp105
-rw-r--r--tools/analyze/analyze.cpp188
-rw-r--r--tools/opt/Makefile8
-rw-r--r--tools/opt/opt.cpp150
41 files changed, 189 insertions, 514 deletions
diff --git a/test/Analysis/DSGraph/2003-06-29-IncompleteTDPass.ll b/test/Analysis/DSGraph/2003-06-29-IncompleteTDPass.ll
index 0c462e1..4b919c1 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 99aae03..f357694 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 6622eb2..f0cd849 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 3f1893b..58ddc46 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 aec1e99..38e57b8 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 37f5038..3a58e05 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 105709f..3b06bae 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 0af1efa..1d32402 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 06af906..ce1ebb9 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 c12bb9e..0fa6ba8 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 b8238f0..aa41920 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 76c2265..4031a09 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 99ac473..ea5c04e 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 6d9aa05..318b4f2 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 d9ac454..5957548 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 3c71c34..825c579 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 f42aec9..2473d1d 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 7cb2011..ae936d3 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 e1e71cd..d781eb5 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 4feee42..96099a8 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 c4ac718..30f4583 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 521bd63..bb6c4c1 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 b841b6e..a977f23 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 615e021..a3583a1 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 4dcefb7..a754d06 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 1d545b3..f6d9ff9 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 16cb6be..1ec92d3 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 ; <int*> [#uses=1]
%H = global int* null
diff --git a/test/Transforms/DSAnalysis/misctests.ll b/test/Transforms/DSAnalysis/misctests.ll
index 29c7079..acdbabf 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 2beb3ec..26fa511 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 6acdd24..da075cd 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 b757403..b398c28 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 298aa83..80b9433 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 693c988..5b3c8b8 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 99e7396..649c655 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 b371d50..0000000
--- 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 <iostream>
-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<Instruction>(*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<Constant>(*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<ExternalFunctionsPassedConstants>
- P1("externalfnconstants", "Print external fn callsites passed constants");
-
- struct CallGraphPrinter : public ModulePass {
- virtual void getAnalysisUsage(AnalysisUsage &AU) const {
- AU.setPreservesAll();
- AU.addRequired<CallGraph>();
- }
- virtual bool runOnModule(Module &M) { return false; }
-
- virtual void print(std::ostream &OS, const Module *M) const {
- getAnalysis<CallGraph>().print(OS, M);
- }
- };
-
- RegisterAnalysis<CallGraphPrinter>
- P2("callgraph", "Print a call graph");
-}
diff --git a/tools/analyze/GraphPrinters.cpp b/tools/analyze/GraphPrinters.cpp
deleted file mode 100644
index 8826cd2..0000000
--- 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 <fstream>
-using namespace llvm;
-
-template<typename GraphType>
-static void WriteGraphToFile(std::ostream &O, const std::string &GraphName,
- const GraphType &GT) {
- 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<CallGraph*> : 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<CallGraph>());
- return false;
- }
-
- void print(std::ostream &OS) const {}
-
- virtual void getAnalysisUsage(AnalysisUsage &AU) const {
- AU.addRequired<CallGraph>();
- AU.setPreservesAll();
- }
- };
-
- RegisterAnalysis<CallGraphPrinter> P2("print-callgraph",
- "Print Call Graph to 'dot' file");
-}
diff --git a/tools/analyze/Makefile b/tools/analyze/Makefile
deleted file mode 100644
index e3885a9..0000000
--- 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 c0adf5c..0000000
--- 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 <iostream>
-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<CallGraph>();
- }
- };
-
- RegisterAnalysis<CFGSCC>
- Y("cfgscc", "Print SCCs of each function CFG");
-
- RegisterAnalysis<CallGraphSCC>
- 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<Function*> SCCI = scc_begin(&F),
- E = scc_end(&F); SCCI != E; ++SCCI) {
- std::vector<BasicBlock*> &nextSCC = *SCCI;
- std::cout << "\nSCC #" << ++sccNum << " : ";
- for (std::vector<BasicBlock*>::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<CallGraph>().getRoot();
- unsigned sccNum = 0;
- std::cout << "SCCs for the program in PostOrder:";
- for (scc_iterator<CallGraphNode*> SCCI = scc_begin(rootNode),
- E = scc_end(rootNode); SCCI != E; ++SCCI) {
- const std::vector<CallGraphNode*> &nextSCC = *SCCI;
- std::cout << "\nSCC #" << ++sccNum << " : ";
- for (std::vector<CallGraphNode*>::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 e6b2be5..0000000
--- 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 <algorithm>
-
-using namespace llvm;
-
-namespace {
- cl::opt<std::string>
- InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"),
- cl::value_desc("filename"));
-
- cl::opt<bool> Quiet("q", cl::desc("Don't print analysis pass names"));
- cl::alias QuietA("quiet", cl::desc("Alias for -q"),
- cl::aliasopt(Quiet));
-
- cl::opt<bool> 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<const PassInfo*, bool, FilteredPassNameParser<PassInfo::Analysis> >
- 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<Pass>(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<Pass>(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<Pass>(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<BasicBlockPass*>(P))
- Passes.add(new BasicBlockPassPrinter(Analysis));
- else if (FunctionPass *FP = dynamic_cast<FunctionPass*>(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 f310639..9e4cddf 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 096506f..b67892b 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 <fstream>
@@ -43,7 +46,8 @@ OptimizationList(cl::desc("Optimizations available:"));
// Other command line options...
//
static cl::opt<std::string>
-InputFilename(cl::Positional, cl::desc("<input bytecode>"), cl::init("-"));
+InputFilename(cl::Positional, cl::desc("<input bytecode file>"),
+ cl::init("-"), cl::value_desc("filename"));
static cl::opt<std::string>
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<bool>
+AnalyzeOnly("analyze", cl::desc("Only perform analysis, no optimization"));
+
+// The AnalysesList is automatically populated with registered Passes by the
+// PassNameParser.
+static
+ cl::list<const PassInfo*, bool, FilteredPassNameParser<PassInfo::Analysis> >
+ 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<Pass>(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<Pass>(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<Pass>(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<BasicBlockPass*>(P))
+ Passes.add(new BasicBlockPassPrinter(Analysis));
+ else if (FunctionPass *FP = dynamic_cast<FunctionPass*>(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<TargetMachine> 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 (...) {