CXXFormatterFunctions.h revision f509c5ec066599a3399fced39ea36996184939e8
1//===-- CXXFormatterFunctions.h------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef liblldb_CXXFormatterFunctions_h_ 11#define liblldb_CXXFormatterFunctions_h_ 12 13#include <stdint.h> 14#include "lldb/lldb-forward.h" 15 16#include "lldb/Core/ConstString.h" 17#include "lldb/DataFormatters/FormatClasses.h" 18 19#include "clang/AST/ASTContext.h" 20 21namespace lldb_private { 22 namespace formatters 23 { 24 bool 25 ExtractValueFromObjCExpression (ValueObject &valobj, 26 const char* target_type, 27 const char* selector, 28 uint64_t &value); 29 30 lldb::ValueObjectSP 31 CallSelectorOnObject (ValueObject &valobj, 32 const char* return_type, 33 const char* selector, 34 uint64_t index); 35 36 lldb::ValueObjectSP 37 CallSelectorOnObject (ValueObject &valobj, 38 const char* return_type, 39 const char* selector, 40 const char* key); 41 42 bool 43 Char16StringSummaryProvider (ValueObject& valobj, Stream& stream); // char16_t* and unichar* 44 45 bool 46 Char32StringSummaryProvider (ValueObject& valobj, Stream& stream); // char32_t* 47 48 bool 49 WCharStringSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t* 50 51 bool 52 Char16SummaryProvider (ValueObject& valobj, Stream& stream); // char16_t and unichar 53 54 bool 55 Char32SummaryProvider (ValueObject& valobj, Stream& stream); // char32_t 56 57 bool 58 WCharSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t 59 60 bool 61 LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::string 62 63 bool 64 LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::wstring 65 66 template<bool name_entries> 67 bool 68 NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream); 69 70 bool 71 NSArraySummaryProvider (ValueObject& valobj, Stream& stream); 72 73 template<bool needs_at> 74 bool 75 NSDataSummaryProvider (ValueObject& valobj, Stream& stream); 76 77 bool 78 NSNumberSummaryProvider (ValueObject& valobj, Stream& stream); 79 80 bool 81 NSStringSummaryProvider (ValueObject& valobj, Stream& stream); 82 83 bool 84 ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream); 85 86 template <bool is_sel_ptr> 87 bool 88 ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream); 89 90 bool 91 RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream); 92 93 extern template bool 94 NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ; 95 96 extern template bool 97 NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ; 98 99 extern template bool 100 NSDataSummaryProvider<true> (ValueObject&, Stream&) ; 101 102 extern template bool 103 NSDataSummaryProvider<false> (ValueObject&, Stream&) ; 104 105 extern template bool 106 ObjCSELSummaryProvider<true> (ValueObject&, Stream&); 107 108 extern template bool 109 ObjCSELSummaryProvider<false> (ValueObject&, Stream&); 110 111 class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd 112 { 113 private: 114 struct DataDescriptor_32 115 { 116 uint32_t _used; 117 uint32_t _priv1 : 2 ; 118 uint32_t _size : 30; 119 uint32_t _priv2 : 2; 120 uint32_t offset : 30; 121 uint32_t _priv3; 122 uint32_t _data; 123 }; 124 struct DataDescriptor_64 125 { 126 uint64_t _used; 127 uint64_t _priv1 : 2 ; 128 uint64_t _size : 62; 129 uint64_t _priv2 : 2; 130 uint64_t offset : 62; 131 uint32_t _priv3; 132 uint64_t _data; 133 }; 134 public: 135 NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 136 137 virtual size_t 138 CalculateNumChildren (); 139 140 virtual lldb::ValueObjectSP 141 GetChildAtIndex (size_t idx); 142 143 virtual bool 144 Update(); 145 146 virtual bool 147 MightHaveChildren (); 148 149 virtual size_t 150 GetIndexOfChildWithName (const ConstString &name); 151 152 virtual 153 ~NSArrayMSyntheticFrontEnd (); 154 private: 155 ExecutionContextRef m_exe_ctx_ref; 156 uint8_t m_ptr_size; 157 DataDescriptor_32 *m_data_32; 158 DataDescriptor_64 *m_data_64; 159 ClangASTType m_id_type; 160 std::vector<lldb::ValueObjectSP> m_children; 161 }; 162 163 class NSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd 164 { 165 public: 166 NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 167 168 virtual size_t 169 CalculateNumChildren (); 170 171 virtual lldb::ValueObjectSP 172 GetChildAtIndex (size_t idx); 173 174 virtual bool 175 Update(); 176 177 virtual bool 178 MightHaveChildren (); 179 180 virtual size_t 181 GetIndexOfChildWithName (const ConstString &name); 182 183 virtual 184 ~NSArrayISyntheticFrontEnd (); 185 private: 186 ExecutionContextRef m_exe_ctx_ref; 187 uint8_t m_ptr_size; 188 uint64_t m_items; 189 lldb::addr_t m_data_ptr; 190 ClangASTType m_id_type; 191 std::vector<lldb::ValueObjectSP> m_children; 192 }; 193 194 class NSArrayCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd 195 { 196 public: 197 NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 198 199 virtual size_t 200 CalculateNumChildren (); 201 202 virtual lldb::ValueObjectSP 203 GetChildAtIndex (size_t idx); 204 205 virtual bool 206 Update(); 207 208 virtual bool 209 MightHaveChildren (); 210 211 virtual size_t 212 GetIndexOfChildWithName (const ConstString &name); 213 214 virtual 215 ~NSArrayCodeRunningSyntheticFrontEnd (); 216 }; 217 218 SyntheticChildrenFrontEnd* NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 219 220 class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd 221 { 222 private: 223 struct DataDescriptor_32 224 { 225 uint32_t _used : 26; 226 uint32_t _szidx : 6; 227 }; 228 struct DataDescriptor_64 229 { 230 uint64_t _used : 58; 231 uint32_t _szidx : 6; 232 }; 233 234 struct DictionaryItemDescriptor 235 { 236 lldb::addr_t key_ptr; 237 lldb::addr_t val_ptr; 238 lldb::ValueObjectSP valobj_sp; 239 }; 240 241 public: 242 NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 243 244 virtual size_t 245 CalculateNumChildren (); 246 247 virtual lldb::ValueObjectSP 248 GetChildAtIndex (size_t idx); 249 250 virtual bool 251 Update(); 252 253 virtual bool 254 MightHaveChildren (); 255 256 virtual size_t 257 GetIndexOfChildWithName (const ConstString &name); 258 259 virtual 260 ~NSDictionaryISyntheticFrontEnd (); 261 private: 262 ExecutionContextRef m_exe_ctx_ref; 263 uint8_t m_ptr_size; 264 DataDescriptor_32 *m_data_32; 265 DataDescriptor_64 *m_data_64; 266 lldb::addr_t m_data_ptr; 267 std::vector<DictionaryItemDescriptor> m_children; 268 }; 269 270 class NSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd 271 { 272 private: 273 struct DataDescriptor_32 274 { 275 uint32_t _used : 26; 276 uint32_t _kvo : 1; 277 uint32_t _size; 278 uint32_t _mutations; 279 uint32_t _objs_addr; 280 uint32_t _keys_addr; 281 }; 282 struct DataDescriptor_64 283 { 284 uint64_t _used : 58; 285 uint32_t _kvo : 1; 286 uint64_t _size; 287 uint64_t _mutations; 288 uint64_t _objs_addr; 289 uint64_t _keys_addr; 290 }; 291 struct DictionaryItemDescriptor 292 { 293 lldb::addr_t key_ptr; 294 lldb::addr_t val_ptr; 295 lldb::ValueObjectSP valobj_sp; 296 }; 297 public: 298 NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 299 300 virtual size_t 301 CalculateNumChildren (); 302 303 virtual lldb::ValueObjectSP 304 GetChildAtIndex (size_t idx); 305 306 virtual bool 307 Update(); 308 309 virtual bool 310 MightHaveChildren (); 311 312 virtual size_t 313 GetIndexOfChildWithName (const ConstString &name); 314 315 virtual 316 ~NSDictionaryMSyntheticFrontEnd (); 317 private: 318 ExecutionContextRef m_exe_ctx_ref; 319 uint8_t m_ptr_size; 320 DataDescriptor_32 *m_data_32; 321 DataDescriptor_64 *m_data_64; 322 std::vector<DictionaryItemDescriptor> m_children; 323 }; 324 325 class NSDictionaryCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd 326 { 327 public: 328 NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); 329 330 virtual size_t 331 CalculateNumChildren (); 332 333 virtual lldb::ValueObjectSP 334 GetChildAtIndex (size_t idx); 335 336 virtual bool 337 Update(); 338 339 virtual bool 340 MightHaveChildren (); 341 342 virtual size_t 343 GetIndexOfChildWithName (const ConstString &name); 344 345 virtual 346 ~NSDictionaryCodeRunningSyntheticFrontEnd (); 347 }; 348 349 SyntheticChildrenFrontEnd* NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); 350 351 } 352} 353 354#endif 355