Merge pull request #3549 from lewurm/arm64-icache-big-little-fix
[mono.git] / mcs / tools / linker-analyzer / Main.cs
1 //
2 // Main.cs: Main program file of command line utility.
3 //
4 // Author:
5 //   Radek Doulik (rodo@xamarin.com)
6 //
7 // Copyright 2015 Xamarin Inc (http://www.xamarin.com).
8 //
9 using System;
10 using Mono.Options;
11 using LinkerAnalyzer.Core;
12
13 namespace LinkerAnalyzer
14 {
15         static class MainClass
16         {
17                 static void Main (string[] args)
18                 {
19                         bool showUsage = true;
20                         bool showAllDeps = false;
21                         bool showTypeDeps = false;
22                         string typeName = null;
23                         bool showRawDeps = false;
24                         string rawName = null;
25                         bool showRoots = false;
26                         bool showSpaceUsage = false;
27                         bool showStat = false;
28                         bool showTypes = false;
29                         bool reduceToTree = false;
30                         bool verbose = false;
31
32                         var optionsParser = new OptionSet () {
33                                 { "a|alldeps", "show all dependencies", v => { showAllDeps = v != null; } },
34                                 { "h|help", "show this message and exit.", v => showUsage = v != null },
35                                 { "r|rawdeps=", "show raw vertex dependencies. Raw vertex VALUE is in the raw format written by linker to the dependency XML file. VALUE can be regular expression", v => { showRawDeps = v != null; rawName = v; } },
36                                 { "roots", "show root dependencies.", v => showRoots = v != null },
37                                 { "stat", "show statistic of loaded dependencies.", v => showStat = v != null },
38                                 { "tree", "reduce the dependency graph to the tree.", v => reduceToTree = v != null },
39                                 { "types", "show all types dependencies.", v => showTypes = v != null },
40                                 { "t|typedeps=", "show type dependencies. The VALUE can be regular expression", v => { showTypeDeps = v != null; typeName = v; } },
41                                 //{ "u|spaceusage", "show space analysis.", v => showSpaceUsage = v != null },
42                                 { "v|verbose", "be more verbose. Enables stat and roots options.", v => verbose = v != null },
43                         };
44
45                         if (args.Length > 0) {
46                                 showUsage = false;
47                                 optionsParser.Parse (args);
48                         }
49
50                         if (showUsage) {
51                                 Console.WriteLine ("Usage:\n\n\tlinkeranalyzer [Options] <linker-dependency-file.xml.gz>\n\nOptions:\n");
52                                 optionsParser.WriteOptionDescriptions (Console.Out);
53                                 Console.WriteLine ();
54                                 return;
55                         }
56
57                         string dependencyFile = args [args.Length - 1];
58
59                         ConsoleDependencyGraph deps = new ConsoleDependencyGraph () { Tree = reduceToTree };
60                         deps.Load (dependencyFile);
61
62                         if (showSpaceUsage) {
63 //                              SpaceAnalyzer sa = new SpaceAnalyzer (System.IO.Path.GetDirectoryName (dependencyFile));
64 //                              sa.LoadAssemblies (verbose);
65                         }
66
67                         if (verbose) {
68                                 showStat = true;
69                                 showRoots = true;
70                         }
71
72                         if (showStat)
73                                 deps.ShowStat (verbose);
74                         if (showRoots)
75                                 deps.ShowRoots ();
76                         if (showRawDeps)
77                                 deps.ShowRawDependencies (rawName);
78                         if (showTypeDeps)
79                                 deps.ShowTypeDependencies (typeName);
80                         if (showAllDeps)
81                                 deps.ShowAllDependencies ();
82                         else if (showTypes)
83                                 deps.ShowTypesDependencies ();
84                 }
85         }
86 }