Commit 004df8a5 authored by glider@chromium.org's avatar glider@chromium.org

Roll asan_symbolize.py r182915 from the LLVM trunk.

BUG=244668
R=timurrrr@chromium.org

Review URL: https://codereview.chromium.org/16134005

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@203130 0039d316-1c4b-4281-b951-d872f2087c98
parent df22562a
Name: asan_symbolize.py Name: asan_symbolize.py
License: University of Illinois Open Source License. License: University of Illinois Open Source License.
Version: 164695 Version: 182915
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/scripts/asan_symbolize.py?view=co&content-type=text%2Fplain URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/scripts/asan_symbolize.py?view=co&content-type=text%2Fplain
asan_symbolize.py is a verbatim copy of asan_symbolize.py in the LLVM trunk. asan_symbolize.py is a verbatim copy of asan_symbolize.py in the LLVM trunk.
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
# #
#===------------------------------------------------------------------------===# #===------------------------------------------------------------------------===#
import bisect import bisect
import getopt
import os import os
import re import re
import subprocess import subprocess
...@@ -15,9 +16,8 @@ import sys ...@@ -15,9 +16,8 @@ import sys
llvm_symbolizer = None llvm_symbolizer = None
symbolizers = {} symbolizers = {}
filetypes = {}
vmaddrs = {}
DEBUG = False DEBUG = False
demangle = False;
# FIXME: merge the code that calls fix_filename(). # FIXME: merge the code that calls fix_filename().
...@@ -60,7 +60,7 @@ class LLVMSymbolizer(Symbolizer): ...@@ -60,7 +60,7 @@ class LLVMSymbolizer(Symbolizer):
return None return None
cmd = [self.symbolizer_path, cmd = [self.symbolizer_path,
'--use-symbol-table=true', '--use-symbol-table=true',
'--demangle=false', '--demangle=%s' % demangle,
'--functions=true', '--functions=true',
'--inlining=true'] '--inlining=true']
if DEBUG: if DEBUG:
...@@ -97,13 +97,11 @@ class LLVMSymbolizer(Symbolizer): ...@@ -97,13 +97,11 @@ class LLVMSymbolizer(Symbolizer):
def LLVMSymbolizerFactory(system): def LLVMSymbolizerFactory(system):
if system == 'Linux':
symbolizer_path = os.getenv('LLVM_SYMBOLIZER_PATH') symbolizer_path = os.getenv('LLVM_SYMBOLIZER_PATH')
if not symbolizer_path: if not symbolizer_path:
# Assume llvm-symbolizer is in PATH. # Assume llvm-symbolizer is in PATH.
symbolizer_path = 'llvm-symbolizer' symbolizer_path = 'llvm-symbolizer'
return LLVMSymbolizer(symbolizer_path) return LLVMSymbolizer(symbolizer_path)
return None
class Addr2LineSymbolizer(Symbolizer): class Addr2LineSymbolizer(Symbolizer):
...@@ -113,12 +111,14 @@ class Addr2LineSymbolizer(Symbolizer): ...@@ -113,12 +111,14 @@ class Addr2LineSymbolizer(Symbolizer):
self.pipe = self.open_addr2line() self.pipe = self.open_addr2line()
def open_addr2line(self): def open_addr2line(self):
cmd = ['addr2line', '-f', '-e', self.binary] cmd = ['addr2line', '-f']
if demangle:
cmd += ['--demangle']
cmd += ['-e', self.binary]
if DEBUG: if DEBUG:
print ' '.join(cmd) print ' '.join(cmd)
return subprocess.Popen(cmd, return subprocess.Popen(cmd,
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
stderr=open(os.devnull, 'w'))
def symbolize(self, addr, binary, offset): def symbolize(self, addr, binary, offset):
"""Overrides Symbolizer.symbolize.""" """Overrides Symbolizer.symbolize."""
...@@ -144,42 +144,10 @@ class DarwinSymbolizer(Symbolizer): ...@@ -144,42 +144,10 @@ class DarwinSymbolizer(Symbolizer):
self.arch = 'x86_64' self.arch = 'x86_64'
else: else:
self.arch = 'i386' self.arch = 'i386'
self.vmaddr = None
self.pipe = None self.pipe = None
def get_binary_vmaddr(self):
"""Get the slide value to be added to the address.
We're looking for the following piece in otool -l output:
Load command 0
cmd LC_SEGMENT
cmdsize 736
segname __TEXT
vmaddr 0x00000000
"""
if self.vmaddr:
return self.vmaddr
cmdline = ['otool', '-l', self.binary]
pipe = subprocess.Popen(cmdline,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
is_text = False
vmaddr = 0
for line in pipe.stdout:
line = line.strip()
if line.startswith('segname'):
is_text = (line == 'segname __TEXT')
continue
if line.startswith('vmaddr') and is_text:
sv = line.split(' ')
vmaddr = int(sv[-1], 16)
break
self.vmaddr = vmaddr
return self.vmaddr
def write_addr_to_pipe(self, offset): def write_addr_to_pipe(self, offset):
slide = self.get_binary_vmaddr() print >> self.pipe.stdin, '0x%x' % int(offset, 16)
print >> self.pipe.stdin, '0x%x' % (int(offset, 16) + slide)
def open_atos(self): def open_atos(self):
if DEBUG: if DEBUG:
...@@ -386,5 +354,9 @@ class SymbolizationLoop(object): ...@@ -386,5 +354,9 @@ class SymbolizationLoop(object):
if __name__ == '__main__': if __name__ == '__main__':
opts, args = getopt.getopt(sys.argv[1:], "d", ["demangle"])
for o, a in opts:
if o in ("-d", "--demangle"):
demangle = True;
loop = SymbolizationLoop() loop = SymbolizationLoop()
loop.process_stdin() loop.process_stdin()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment