1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <ctype.h>
6 #include "bitvector.h"
7 #include "parse_options.h"
8 #include "hash_table.h"
9
10 const char *root = "";
11 bool lump_kernel;
12 bool lump_libraries;
13 Bitvector pid_include_vector(32768);
14 Bitvector pid_exclude_vector(32768);
15 bool include_some_pids;
16 bool exclude_some_pids;
17
18 HashTable<int> excluded_procedures(2000);
19 HashTable<int> included_procedures(2000);
20 bool exclude_some_procedures;
21 bool include_some_procedures;
22
23 bool exclude_kernel_syms;
24 bool exclude_library_syms;
25 bool include_kernel_syms;
26 bool include_library_syms;
27 bool demangle = true;
28
29 static const char *OptionsUsageStr =
30 " -e :kernel exclude all kernel symbols\n"
31 " -e :libs exclude all library symbols\n"
32 " -e <func> exclude function <func>\n"
33 " -e <pid> exclude process <pid>\n"
34 " -i :kernel include all kernel symbols\n"
35 " -i :libs include all library symbols\n"
36 " -i <func> include function <func>\n"
37 " -i <pid> include process <pid>\n"
38 " -l :kernel lump all the kernel symbols together\n"
39 " -l :libs lump all the library symbols together\n"
40 " -m do not demangle C++ symbols (m for 'mangle')\n"
41 " -r <root> use <root> as the path for finding ELF executables\n"
42 ;
43
OptionsUsage()44 void OptionsUsage()
45 {
46 fprintf(stderr, "%s", OptionsUsageStr);
47 }
48
ParseOptions(int argc,char ** argv)49 void ParseOptions(int argc, char **argv)
50 {
51 bool err = false;
52 while (!err) {
53 int opt = getopt(argc, argv, "+e:i:l:mr:");
54 if (opt == -1)
55 break;
56 switch (opt) {
57 case 'e':
58 if (*optarg == ':') {
59 if (strcmp(optarg, ":kernel") == 0)
60 exclude_kernel_syms = true;
61 else if (strcmp(optarg, ":libs") == 0)
62 exclude_library_syms = true;
63 else
64 err = true;
65 excluded_procedures.Update(optarg, 1);
66 exclude_some_procedures = true;
67 } else if (isdigit(*optarg)) {
68 int bitnum = atoi(optarg);
69 pid_exclude_vector.SetBit(bitnum);
70 exclude_some_pids = true;
71 } else {
72 excluded_procedures.Update(optarg, 1);
73 exclude_some_procedures = true;
74 }
75 break;
76 case 'i':
77 if (*optarg == ':') {
78 if (strcmp(optarg, ":kernel") == 0)
79 include_kernel_syms = true;
80 else if (strcmp(optarg, ":libs") == 0)
81 include_library_syms = true;
82 else
83 err = true;
84 included_procedures.Update(optarg, 1);
85 include_some_procedures = true;
86 } else if (isdigit(*optarg)) {
87 int bitnum = atoi(optarg);
88 pid_include_vector.SetBit(bitnum);
89 include_some_pids = true;
90 } else {
91 included_procedures.Update(optarg, 1);
92 include_some_procedures = true;
93 }
94 break;
95 case 'l':
96 if (strcmp(optarg, ":kernel") == 0)
97 lump_kernel = true;
98 else if (strcmp(optarg, ":libs") == 0)
99 lump_libraries = true;
100 else
101 err = true;
102 break;
103 case 'm':
104 demangle = false;
105 break;
106 case 'r':
107 root = optarg;
108 break;
109 default:
110 err = true;
111 break;
112 }
113 }
114
115 if (err) {
116 Usage(argv[0]);
117 exit(1);
118 }
119 }
120