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