mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			152 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| #! /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."
 | |
| 
 |