1579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata""" 2579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico GranataLLDB AppKit formatters 3579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata 4579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granatapart of The LLVM Compiler Infrastructure 5579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico GranataThis file is distributed under the University of Illinois Open Source 6579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico GranataLicense. See LICENSE.TXT for details. 7579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata""" 8dc1df6b2fd7d359753b2bcfcf2decb114f465a1dEnrico Granata# example summary provider for NSMachPort 9dc1df6b2fd7d359753b2bcfcf2decb114f465a1dEnrico Granata# the real summary is now C++ code built into LLDB 10b370df27c76fd875f3312be487868528121a4838Enrico Granataimport lldb 11b370df27c76fd875f3312be487868528121a4838Enrico Granataimport ctypes 120d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.runtime.objc.objc_runtime 130d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.metrics 140d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granataimport lldb.formatters.Logger 15b370df27c76fd875f3312be487868528121a4838Enrico Granata 160d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granatastatistics = lldb.formatters.metrics.Metrics() 17b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_isa') 18b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('invalid_pointer') 19b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('unknown_class') 20b370df27c76fd875f3312be487868528121a4838Enrico Granatastatistics.add_metric('code_notrun') 21b370df27c76fd875f3312be487868528121a4838Enrico Granata 22b370df27c76fd875f3312be487868528121a4838Enrico Granata# despite the similary to synthetic children providers, these classes are not 23b370df27c76fd875f3312be487868528121a4838Enrico Granata# trying to provide anything but the port number of an NSMachPort, so they need not 24b370df27c76fd875f3312be487868528121a4838Enrico Granata# obey the interface specification for synthetic children providers 25b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSMachPortKnown_SummaryProvider: 26b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 27f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 28b370df27c76fd875f3312be487868528121a4838Enrico Granata 29f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 300d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 31b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 32f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 33f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if not(self.sys_params.types_cache.NSUInteger): 34f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if self.sys_params.is_64_bit: 35f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedLong) 36f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata else: 37f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.NSUInteger = self.valobj.GetType().GetBasicType(lldb.eBasicTypeUnsignedInt) 38b370df27c76fd875f3312be487868528121a4838Enrico Granata self.update(); 39b370df27c76fd875f3312be487868528121a4838Enrico Granata 40b370df27c76fd875f3312be487868528121a4838Enrico Granata def update(self): 410d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 42b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 43b370df27c76fd875f3312be487868528121a4838Enrico Granata 44b370df27c76fd875f3312be487868528121a4838Enrico Granata # one pointer is the ISA 45b370df27c76fd875f3312be487868528121a4838Enrico Granata # then we have one other internal pointer, plus 46b370df27c76fd875f3312be487868528121a4838Enrico Granata # 4 bytes worth of flags. hence, these values 47b370df27c76fd875f3312be487868528121a4838Enrico Granata def offset(self): 480d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 49f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata if self.sys_params.is_64_bit: 50b370df27c76fd875f3312be487868528121a4838Enrico Granata return 20 51b370df27c76fd875f3312be487868528121a4838Enrico Granata else: 52b370df27c76fd875f3312be487868528121a4838Enrico Granata return 12 53b370df27c76fd875f3312be487868528121a4838Enrico Granata 54b370df27c76fd875f3312be487868528121a4838Enrico Granata def port(self): 550d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 56b370df27c76fd875f3312be487868528121a4838Enrico Granata vport = self.valobj.CreateChildAtOffset("port", 57b370df27c76fd875f3312be487868528121a4838Enrico Granata self.offset(), 58f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params.types_cache.NSUInteger) 59b370df27c76fd875f3312be487868528121a4838Enrico Granata return vport.GetValueAsUnsigned(0) 60b370df27c76fd875f3312be487868528121a4838Enrico Granata 61b370df27c76fd875f3312be487868528121a4838Enrico Granata 62b370df27c76fd875f3312be487868528121a4838Enrico Granataclass NSMachPortUnknown_SummaryProvider: 63b370df27c76fd875f3312be487868528121a4838Enrico Granata def adjust_for_architecture(self): 64f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata pass 65b370df27c76fd875f3312be487868528121a4838Enrico Granata 66f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata def __init__(self, valobj, params): 670d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 68b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj = valobj; 69f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.sys_params = params 70f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata self.update(); 71b370df27c76fd875f3312be487868528121a4838Enrico Granata 72b370df27c76fd875f3312be487868528121a4838Enrico Granata def update(self): 730d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 74b370df27c76fd875f3312be487868528121a4838Enrico Granata self.adjust_for_architecture(); 75b370df27c76fd875f3312be487868528121a4838Enrico Granata 76b370df27c76fd875f3312be487868528121a4838Enrico Granata def port(self): 770d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 78b370df27c76fd875f3312be487868528121a4838Enrico Granata stream = lldb.SBStream() 79b370df27c76fd875f3312be487868528121a4838Enrico Granata self.valobj.GetExpressionPath(stream) 80579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata num_children_vo = self.valobj.CreateValueFromExpression("port","(int)[" + stream.GetData() + " machPort]") 81579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if num_children_vo.IsValid(): 82579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return num_children_vo.GetValueAsUnsigned(0) 83579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return '<variable is not NSMachPort>' 84b370df27c76fd875f3312be487868528121a4838Enrico Granata 85b370df27c76fd875f3312be487868528121a4838Enrico Granata 86b370df27c76fd875f3312be487868528121a4838Enrico Granatadef GetSummary_Impl(valobj): 870d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 88b370df27c76fd875f3312be487868528121a4838Enrico Granata global statistics 89a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata class_data,wrapper =lldb.runtime.objc.objc_runtime.Utilities.prepare_class_detection(valobj,statistics) 90579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if wrapper: 91579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return wrapper 92b370df27c76fd875f3312be487868528121a4838Enrico Granata 93b370df27c76fd875f3312be487868528121a4838Enrico Granata name_string = class_data.class_name() 948f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "class name is: " + str(name_string) 958f18240a09893310c43673901d863892ae7b0611Enrico Granata 96b370df27c76fd875f3312be487868528121a4838Enrico Granata if name_string == 'NSMachPort': 97f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSMachPortKnown_SummaryProvider(valobj, class_data.sys_params) 98b370df27c76fd875f3312be487868528121a4838Enrico Granata statistics.metric_hit('code_notrun',valobj) 99b370df27c76fd875f3312be487868528121a4838Enrico Granata else: 100f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata wrapper = NSMachPortUnknown_SummaryProvider(valobj, class_data.sys_params) 101805f79b15edd61887c26a3f0ea80457790ba5807Enrico Granata statistics.metric_hit('unknown_class',valobj.GetName() + " seen as " + name_string) 102b370df27c76fd875f3312be487868528121a4838Enrico Granata return wrapper; 103b370df27c76fd875f3312be487868528121a4838Enrico Granata 104b370df27c76fd875f3312be487868528121a4838Enrico Granatadef NSMachPort_SummaryProvider (valobj,dict): 1050d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata logger = lldb.formatters.Logger.Logger() 106b370df27c76fd875f3312be487868528121a4838Enrico Granata provider = GetSummary_Impl(valobj); 107b370df27c76fd875f3312be487868528121a4838Enrico Granata if provider != None: 108a5c2ce05705f784fd4ada97823af6ff7006fea58Enrico Granata if isinstance(provider,lldb.runtime.objc.objc_runtime.SpecialSituation_Description): 109579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return provider.message() 110579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata try: 111579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = provider.port(); 112579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata except: 113579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = None 1148f18240a09893310c43673901d863892ae7b0611Enrico Granata logger >> "got summary " + str(summary) 115579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if summary == None: 116579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata summary = '<variable is not NSMachPort>' 117579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata if isinstance(summary, basestring): 118579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return summay 119579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return 'mach port: ' + str(summary) 120579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata return 'Summary Unavailable' 121b370df27c76fd875f3312be487868528121a4838Enrico Granata 122b370df27c76fd875f3312be487868528121a4838Enrico Granatadef __lldb_init_module(debugger,dict): 123b370df27c76fd875f3312be487868528121a4838Enrico Granata debugger.HandleCommand("type summary add -F NSMachPort.NSMachPort_SummaryProvider NSMachPort") 124