forked from D-Programming-GDC/gcc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
show-headers
executable file
·151 lines (124 loc) · 3.83 KB
/
show-headers
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#! /usr/bin/python2
import os.path
import sys
import shlex
import re
from headerutils import *
tabstop = 2
padding = " "
seen = { }
output = list()
summary = list()
sawcore = False
# list of headers to emphasize
highlight = list ()
bld_dir = ""
# search path for headers
incl_dirs = ["../include", "../libcpp/include", "common", "c-family", "c", "cp", "config" ]
# extra search paths to look in *after* the directory the source file is in.
# append (1) to the end of the first line which includes INC in list INC.
def append_1 (output, inc):
for n,t in enumerate (output):
idx = t.find(inc)
if idx != -1:
eos = idx + len (inc)
t = t[:eos] + " (1)" + t[eos+1:]
output[n] = t
return
# These headers show up as duplicates in rtl.h due to conditional code arund the includes
rtl_core = [ "machmode.h" , "signop.h" , "wide-int.h" , "double-int.h" , "real.h" , "fixed-value.h" , "statistics.h" , "vec.h" , "hash-table.h" , "hash-set.h" , "input.h" , "is-a.h" ]
def find_include_data (inc):
global sawcore
for x in incl_dirs:
nm = x+"/"+inc
if os.path.exists (nm):
info = find_unique_include_list (nm)
# rtl.h mimics coretypes for GENERATOR FILES, remove if coretypes.h seen.
if inc == "coretypes.h":
sawcore = True
elif inc == "rtl.h" and sawcore:
for i in rtl_core:
if i in info:
info.remove (i)
return info
return list()
def process_include (inc, indent):
if inc[-2:] != ".h":
return
bname = os.path.basename (inc)
if bname in highlight:
arrow = " <<-------"
if bname not in summary:
summary.append (bname)
else:
arrow = ""
if seen.get(inc) == None:
seen[inc] = 1
output.append (padding[:indent*tabstop] + bname + arrow)
info = find_include_data (inc)
for y in info:
process_include (y, indent+1)
else:
seen[inc] += 1
if (seen[inc] == 2):
append_1(output, inc)
output.append (padding[:indent*tabstop] + bname + " ("+str(seen[inc])+")" + arrow)
extradir = list()
usage = False
src = list()
for x in sys.argv[1:]:
if x[0:2] == "-i":
bld = x[2:]
extradir.append (bld)
elif x[0:2] == "-s":
highlight.append (os.path.basename (x[2:]))
elif x[0:2] == "-h":
usage = True
else:
src.append (x)
if len(src) != 1:
usage = True
elif not os.path.exists (src[0]):
print src[0] + ": Requested source file does not exist.\n"
usage = True
if usage:
print "show-headers [-idir] [-sfilen] file1 "
print " "
print " Show a hierarchical visual format how many times each header file"
print " is included in a source file. Should be run from the source directory"
print " files from find-include-depends"
print " -s : search for a header, and point it out."
print " -i : Specifies additonal directories to search for includes."
sys.exit(0)
if extradir:
incl_dirs = extradir + incl_dirs;
blddir = find_gcc_bld_dir ("../..")
if blddir:
print "Using build directory: " + blddir
incl_dirs.insert (0, blddir)
else:
print "Could not find a build directory, better results if you specify one with -i"
# search path is now ".", blddir, extradirs_from_-i, built_in_incl_dirs
incl_dirs.insert (0, ".")
# if source is in a subdirectory, prepend the subdirectory to the search list
x = src[0]
srcpath = os.path.dirname(x)
if srcpath:
incl_dirs.insert (0, srcpath)
output = list()
sawcore = False
data = open (x).read().splitlines()
for line in data:
d = find_pound_include (line, True, True)
if d and d[-2:] == ".h":
process_include (d, 1)
print "\n" + x
for line in output:
print line
if highlight:
print " "
for h in summary:
print h + " is included by source file."
for h in highlight:
if h not in summary:
print h + " is not included by source file."