"lldb/git@repo.hca.bsc.es:rferrer/llvm-epi-0.8.git" did not exist on "fb90931b60c66f6cbaec24fb1be374146c008807"
Newer
Older
"""
LLDB AppKit formatters
part of The LLVM Compiler Infrastructure
This file is distributed under the University of Illinois Open Source
License. See LICENSE.TXT for details.
"""
Enrico Granata
committed
# summary provider for NSURL
import lldb
import ctypes
Enrico Granata
committed
import lldb.runtime.objc.objc_runtime
import lldb.formatters.metrics
Enrico Granata
committed
import CFString
Enrico Granata
committed
import lldb.formatters.Logger
Enrico Granata
committed
Enrico Granata
committed
statistics = lldb.formatters.metrics.Metrics()
Enrico Granata
committed
statistics.add_metric('invalid_isa')
statistics.add_metric('invalid_pointer')
statistics.add_metric('unknown_class')
statistics.add_metric('code_notrun')
# despite the similary to synthetic children providers, these classes are not
# trying to provide anything but a summary for an NSURL, so they need not
# obey the interface specification for synthetic children providers
class NSURLKnown_SummaryProvider:
def adjust_for_architecture(self):
pass
Enrico Granata
committed
def __init__(self, valobj, params):
Enrico Granata
committed
logger = lldb.formatters.Logger.Logger()
Enrico Granata
committed
self.valobj = valobj;
self.sys_params = params
if not(self.sys_params.types_cache.NSString):
self.sys_params.types_cache.NSString = self.valobj.GetTarget().FindFirstType('NSString').GetPointerType()
if not(self.sys_params.types_cache.NSURL):
self.sys_params.types_cache.NSURL = self.valobj.GetTarget().FindFirstType('NSURL').GetPointerType()
Enrico Granata
committed
self.update();
def update(self):
Enrico Granata
committed
logger = lldb.formatters.Logger.Logger()
Enrico Granata
committed
self.adjust_for_architecture();
# one pointer is the ISA
# then there is one more pointer and 8 bytes of plain data
# (which are also present on a 32-bit system)
# plus another pointer, and then the real data
def offset_text(self):
Enrico Granata
committed
logger = lldb.formatters.Logger.Logger()
return 24 if self.sys_params.is_64_bit else 16
def offset_base(self):
Enrico Granata
committed
logger = lldb.formatters.Logger.Logger()
return self.offset_text()+self.sys_params.pointer_size
Enrico Granata
committed
def url_text(self):
Enrico Granata
committed
logger = lldb.formatters.Logger.Logger()
Enrico Granata
committed
text = self.valobj.CreateChildAtOffset("text",
self.offset_text(),
self.sys_params.types_cache.NSString)
Enrico Granata
committed
base = self.valobj.CreateChildAtOffset("base",
self.offset_base(),
self.sys_params.types_cache.NSURL)
Enrico Granata
committed
my_string = CFString.CFString_SummaryProvider(text,None)
Enrico Granata
committed
if len(my_string) > 0 and base.GetValueAsUnsigned(0) != 0:
# remove final " from myself
my_string = my_string[0:len(my_string)-1]
my_string = my_string + ' -- '
my_base_string = NSURL_SummaryProvider(base,None)
if len(my_base_string) > 2:
# remove @" marker from base URL string
my_base_string = my_base_string[2:]
my_string = my_string + my_base_string
Enrico Granata
committed
return my_string
class NSURLUnknown_SummaryProvider:
def adjust_for_architecture(self):
pass
Enrico Granata
committed
def __init__(self, valobj, params):
Enrico Granata
committed
logger = lldb.formatters.Logger.Logger()
Enrico Granata
committed
self.valobj = valobj;
self.sys_params = params
Enrico Granata
committed
self.update()
def update(self):
Enrico Granata
committed
logger = lldb.formatters.Logger.Logger()
Enrico Granata
committed
self.adjust_for_architecture();
def url_text(self):
Enrico Granata
committed
logger = lldb.formatters.Logger.Logger()
Enrico Granata
committed
stream = lldb.SBStream()
self.valobj.GetExpressionPath(stream)
url_text_vo = self.valobj.CreateValueFromExpression("url","(NSString*)[" + stream.GetData() + " description]")
if url_text_vo.IsValid():
return CFString.CFString_SummaryProvider(url_text_vo,None)
return '<variable is not NSURL>'
Enrico Granata
committed
def GetSummary_Impl(valobj):
Enrico Granata
committed
logger = lldb.formatters.Logger.Logger()
Enrico Granata
committed
global statistics
Enrico Granata
committed
class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics)
if wrapper:
return wrapper
Enrico Granata
committed
name_string = class_data.class_name()
logger >> "class name is: " + str(name_string)
Enrico Granata
committed
if name_string == 'NSURL':
wrapper = NSURLKnown_SummaryProvider(valobj, class_data.sys_params)
Enrico Granata
committed
statistics.metric_hit('code_notrun',valobj)
else:
wrapper = NSURLUnknown_SummaryProvider(valobj, class_data.sys_params)
statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string)
Enrico Granata
committed
return wrapper;
def NSURL_SummaryProvider (valobj,dict):
Enrico Granata
committed
logger = lldb.formatters.Logger.Logger()
Enrico Granata
committed
provider = GetSummary_Impl(valobj);
if provider != None:
Enrico Granata
committed
if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description):
return provider.message()
try:
summary = provider.url_text();
except:
summary = None
if summary == None or summary == '':
summary = '<variable is not NSURL>'
return summary
return 'Summary Unavailable'
Enrico Granata
committed
def __lldb_init_module(debugger,dict):
debugger.HandleCommand("type summary add -F NSURL.NSURL_SummaryProvider NSURL CFURLRef")