Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(398)

Unified Diff: tools/win/linker_verbose_tracking.py

Issue 2863843003: Improve linker_verbose_tracking.py (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/win/linker_verbose_tracking.py
diff --git a/tools/win/linker_verbose_tracking.py b/tools/win/linker_verbose_tracking.py
index 506a86a4443e3e571e2d22b78700466d349574f5..1b5736ad3e734379fa34d7a455ce5496a8c5a54a 100644
--- a/tools/win/linker_verbose_tracking.py
+++ b/tools/win/linker_verbose_tracking.py
@@ -50,6 +50,7 @@ stream_encoder.obj pulled in for symbol "_FLAC__stream_encoder_new" by
Command-line obj file: audio_encoder.obj
"""
+import io
import pdb
import re
import sys
@@ -67,44 +68,55 @@ def ParseVerbose(input_file):
cross_refed_symbols = {}
references = None
- for line in open(input_file):
- if line.startswith(found_prefix):
- references = []
- # Grab the symbol name
- symbol = line[len(found_prefix):].strip()
- if symbol[0] == '"':
- # Strip off leading and trailing quotes if present.
- symbol = symbol[1:-1]
- continue
- if type(references) == type([]):
- sub_line = line.strip()
- match = obj_match.match(sub_line)
- # See if the line is part of the list of places where this symbol was
- # referenced
- if sub_line.count('Referenced ') > 0:
- if match:
- # This indicates a match that is xxx.lib(yyy.obj), so a referencing
- # .obj file that was itself inside of a library. We discard the
- # library name.
- reference = match.groups()[0]
- else:
- # This indicates a match that is just a pure .obj file name
- # I think this means that the .obj file was specified on the linker
- # command line.
- reference = ('Command-line obj file: ' +
- sub_line[len('Referenced in '): -len('.obj')])
- references.append(reference)
- elif sub_line.count('Loaded ') > 0:
- if match:
- loaded = match.groups()[0]
- cross_refs[loaded] = references
- cross_refed_symbols[loaded] = symbol
- references = None
- if line.startswith('Finished pass 1'):
- # Stop now because the remaining 90% of the verbose output is
- # not of interest. Could probably use /VERBOSE:REF to trim out
- # boring information.
- break
+ # When you redirect the linker output to a file from a command prompt the
+ # result will be a utf-8 (or ASCII?) output file. However if you do the same
+ # thing from PowerShell you get a utf-16 file. So, we need to handle both
+ # options. Only the first BOM option (\xff\xfe) has been tested, but it seems
+ # appropriate to handle the other as well.
+ file_encoding = 'utf-8'
+ with open(input_file) as file_handle:
+ header = file_handle.read(2)
+ if header == '\xff\xfe' or header == '\xfe\xff':
+ file_encoding = 'utf-16'
+ with io.open(input_file, encoding=file_encoding) as file_handle:
+ for line in file_handle:
+ if line.startswith(found_prefix):
+ references = []
+ # Grab the symbol name
+ symbol = line[len(found_prefix):].strip()
+ if symbol[0] == '"':
+ # Strip off leading and trailing quotes if present.
+ symbol = symbol[1:-1]
+ continue
+ if type(references) == type([]):
+ sub_line = line.strip()
+ match = obj_match.match(sub_line)
+ # See if the line is part of the list of places where this symbol was
+ # referenced
+ if sub_line.count('Referenced ') > 0:
+ if match:
+ # This indicates a match that is xxx.lib(yyy.obj), so a referencing
+ # .obj file that was itself inside of a library. We discard the
+ # library name.
+ reference = match.groups()[0]
+ else:
+ # This indicates a match that is just a pure .obj file name
+ # I think this means that the .obj file was specified on the linker
+ # command line.
+ reference = ('Command-line obj file: ' +
+ sub_line[len('Referenced in '): -len('.obj')])
+ references.append(reference)
+ elif sub_line.count('Loaded ') > 0:
+ if match:
+ loaded = match.groups()[0]
+ cross_refs[loaded] = references
+ cross_refed_symbols[loaded] = symbol
+ references = None
+ if line.startswith('Finished pass 1'):
+ # Stop now because the remaining 90% of the verbose output is
+ # not of interest. Could probably use /VERBOSE:REF to trim out
+ # boring information.
+ break
return cross_refs, cross_refed_symbols
@@ -135,7 +147,8 @@ def TrackObj(cross_refs, cross_refed_symbols, obj_name):
print
targets = new_targets.keys()
if not printed:
- print 'No references to %s.obj found.' % obj_name
+ print ('No references to %s.obj found. Directly specified in sources or a '
+ 'source_set?' % obj_name)
def main():
@@ -145,6 +158,9 @@ def main():
return 0
cross_refs, cross_refed_symbols = ParseVerbose(sys.argv[1])
print 'Database loaded - %d xrefs found' % len(cross_refs)
+ if not len(cross_refs):
+ print 'No data found to analyze. Exiting'
+ return 0
TrackObj(cross_refs, cross_refed_symbols, sys.argv[2])
if __name__ == '__main__':
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698