| #! /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." | |