diff options
author | Alexander Potapenko <glider@google.com> | 2012-08-02 14:58:04 +0000 |
---|---|---|
committer | Alexander Potapenko <glider@google.com> | 2012-08-02 14:58:04 +0000 |
commit | 879b1ffca722d953176d3e5a95fb50db4260e3a4 (patch) | |
tree | 2509827fb7eb2e1a20330e1978b86576b5fe83be /compiler-rt | |
parent | 232ae7cc209662ef972356972c8e8158f602b735 (diff) | |
download | bcm5719-llvm-879b1ffca722d953176d3e5a95fb50db4260e3a4.tar.gz bcm5719-llvm-879b1ffca722d953176d3e5a95fb50db4260e3a4.zip |
Implement LinuxSymbolizer instead of symbolize_addr2line.
llvm-svn: 161181
Diffstat (limited to 'compiler-rt')
-rwxr-xr-x | compiler-rt/lib/asan/scripts/asan_symbolize.py | 76 |
1 files changed, 37 insertions, 39 deletions
diff --git a/compiler-rt/lib/asan/scripts/asan_symbolize.py b/compiler-rt/lib/asan/scripts/asan_symbolize.py index b54d5ad8ae3..e89fcd4fb37 100755 --- a/compiler-rt/lib/asan/scripts/asan_symbolize.py +++ b/compiler-rt/lib/asan/scripts/asan_symbolize.py @@ -13,7 +13,7 @@ import re import sys import subprocess -pipes = {} +symbolizers = {} filetypes = {} vmaddrs = {} DEBUG = False @@ -27,35 +27,29 @@ def fix_filename(file_name): return file_name -# TODO(glider): need some refactoring here -def symbolize_addr2line(line): - #0 0x7f6e35cf2e45 (/blah/foo.so+0x11fe45) - match = re.match('^( *#([0-9]+) *0x[0-9a-f]+) *\((.*)\+(0x[0-9a-f]+)\)', line) - if match: - # frameno = match.group(2) - binary = match.group(3) - addr = match.group(4) - if not pipes.has_key(binary): - pipes[binary] = subprocess.Popen(["addr2line", "-f", "-e", binary], - stdin=subprocess.PIPE, stdout=subprocess.PIPE) - p = pipes[binary] +class Symbolizer(object): + def __init__(self): + pass + + +class LinuxSymbolizer(Symbolizer): + def __init__(self, binary): + super(LinuxSymbolizer, self).__init__() + self.binary = binary + self.pipe = self.open_addr2line() + def open_addr2line(self): + return subprocess.Popen(["addr2line", "-f", "-e", self.binary], + stdin=subprocess.PIPE, stdout=subprocess.PIPE) + def symbolize(self, prefix, addr, _): try: - print >> p.stdin, addr - function_name = p.stdout.readline().rstrip() - file_name = p.stdout.readline().rstrip() + print >> self.pipe.stdin, addr + function_name = self.pipe.stdout.readline().rstrip() + file_name = self.pipe.stdout.readline().rstrip() except Exception: function_name = "" file_name = "" file_name = fix_filename(file_name) - - print match.group(1), "in", function_name, file_name - else: - print line.rstrip() - - -class Symbolizer(object): - def __init__(self): - pass + return "%s%s in %s %s" % (prefix, addr, function_name, file_name) class DarwinSymbolizer(Symbolizer): @@ -150,6 +144,13 @@ def BreakpadSymbolizerFactory(addr, binary): return None +def SystemSymbolizerFactory(system, addr, binary): + if system == 'Darwin': + return DarwinSymbolizer(addr, binary) + elif system == 'Linux': + return LinuxSymbolizer(binary) + + class BreakpadSymbolizer(Symbolizer): def __init__(self, filename): super(BreakpadSymbolizer, self).__init__() @@ -215,7 +216,7 @@ class BreakpadSymbolizer(Symbolizer): return None -def symbolize_line(line): +def symbolize_line(system, line): #0 0x7f6e35cf2e45 (/blah/foo.so+0x11fe45) match = re.match('^( *#([0-9]+) *)(0x[0-9a-f]+) *\((.*)\+(0x[0-9a-f]+)\)', line) @@ -227,30 +228,27 @@ def symbolize_line(line): addr = match.group(3) binary = match.group(4) offset = match.group(5) - if not pipes.has_key(binary): + if not symbolizers.has_key(binary): p = BreakpadSymbolizerFactory(addr, binary) if p: - pipes[binary] = p + symbolizers[binary] = p else: - pipes[binary] = DarwinSymbolizer(addr, binary) - result = pipes[binary].symbolize(prefix, addr, offset) + symbolizers[binary] = SystemSymbolizerFactory(system, addr, binary) + result = symbolizers[binary].symbolize(prefix, addr, offset) if result is None: - pipes[binary] = ChainSymbolizer(pipes[binary], - DarwinSymbolizer(addr, binary)) - return pipes[binary].symbolize(prefix, addr, offset) + symbolizers[binary] = ChainSymbolizer(symbolizers[binary], + SystemSymbolizerFactory(system, addr, binary)) + return symbolizers[binary].symbolize(prefix, addr, offset) else: return line - + def main(): system = os.uname()[0] if system in ['Linux', 'Darwin']: for line in sys.stdin: - if system == 'Linux': - symbolize_addr2line(line) - elif system == 'Darwin': - line = symbolize_line(line) - print line.rstrip() + line = symbolize_line(system, line) + print line.rstrip() else: print 'Unknown system: ', system |