1 //===-- FormatManager.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 lldb_FormatManager_h_ 11 #define lldb_FormatManager_h_ 12 13 // C Includes 14 // C++ Includes 15 16 // Other libraries and framework includes 17 // Project includes 18 #include "lldb/lldb-public.h" 19 #include "lldb/lldb-enumerations.h" 20 21 #include "lldb/DataFormatters/FormatCache.h" 22 #include "lldb/DataFormatters/FormatNavigator.h" 23 #include "lldb/DataFormatters/TypeCategory.h" 24 #include "lldb/DataFormatters/TypeCategoryMap.h" 25 26 namespace lldb_private { 27 28 // this file (and its. cpp) contain the low-level implementation of LLDB Data Visualization 29 // class DataVisualization is the high-level front-end of this feature 30 // clients should refer to that class as the entry-point into the data formatters 31 // unless they have a good reason to bypass it and prefer to use this file's objects directly 32 33 class FormatManager : public IFormatChangeListener 34 { 35 typedef FormatNavigator<ConstString, TypeFormatImpl> ValueNavigator; 36 typedef ValueNavigator::MapType ValueMap; 37 typedef FormatMap<ConstString, TypeSummaryImpl> NamedSummariesMap; 38 typedef TypeCategoryMap::MapType::iterator CategoryMapIterator; 39 public: 40 41 typedef TypeCategoryMap::CallbackType CategoryCallback; 42 43 FormatManager (); 44 45 ValueNavigator& GetValueNavigator()46 GetValueNavigator () 47 { 48 return m_value_nav; 49 } 50 51 NamedSummariesMap& GetNamedSummaryNavigator()52 GetNamedSummaryNavigator () 53 { 54 return m_named_summaries_map; 55 } 56 57 void 58 EnableCategory (const ConstString& category_name, 59 TypeCategoryMap::Position pos = TypeCategoryMap::Default) 60 { 61 m_categories_map.Enable(category_name, 62 pos); 63 } 64 65 void DisableCategory(const ConstString & category_name)66 DisableCategory (const ConstString& category_name) 67 { 68 m_categories_map.Disable(category_name); 69 } 70 71 void 72 EnableCategory (const lldb::TypeCategoryImplSP& category, 73 TypeCategoryMap::Position pos = TypeCategoryMap::Default) 74 { 75 m_categories_map.Enable(category, 76 pos); 77 } 78 79 void DisableCategory(const lldb::TypeCategoryImplSP & category)80 DisableCategory (const lldb::TypeCategoryImplSP& category) 81 { 82 m_categories_map.Disable(category); 83 } 84 85 bool DeleteCategory(const ConstString & category_name)86 DeleteCategory (const ConstString& category_name) 87 { 88 return m_categories_map.Delete(category_name); 89 } 90 91 void ClearCategories()92 ClearCategories () 93 { 94 return m_categories_map.Clear(); 95 } 96 97 uint32_t GetCategoriesCount()98 GetCategoriesCount () 99 { 100 return m_categories_map.GetCount(); 101 } 102 103 lldb::TypeCategoryImplSP GetCategoryAtIndex(size_t index)104 GetCategoryAtIndex (size_t index) 105 { 106 return m_categories_map.GetAtIndex(index); 107 } 108 109 void LoopThroughCategories(CategoryCallback callback,void * param)110 LoopThroughCategories (CategoryCallback callback, void* param) 111 { 112 m_categories_map.LoopThrough(callback, param); 113 } 114 115 lldb::TypeCategoryImplSP 116 GetCategory (const char* category_name = NULL, 117 bool can_create = true) 118 { 119 if (!category_name) 120 return GetCategory(m_default_category_name); 121 return GetCategory(ConstString(category_name)); 122 } 123 124 lldb::TypeCategoryImplSP 125 GetCategory (const ConstString& category_name, 126 bool can_create = true); 127 128 lldb::TypeSummaryImplSP 129 GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp); 130 131 lldb::TypeFilterImplSP 132 GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp); 133 134 #ifndef LLDB_DISABLE_PYTHON 135 lldb::ScriptedSyntheticChildrenSP 136 GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp); 137 #endif 138 139 #ifndef LLDB_DISABLE_PYTHON 140 lldb::SyntheticChildrenSP 141 GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp); 142 #endif 143 144 lldb::TypeSummaryImplSP 145 GetSummaryFormat (ValueObject& valobj, 146 lldb::DynamicValueType use_dynamic); 147 148 #ifndef LLDB_DISABLE_PYTHON 149 lldb::SyntheticChildrenSP 150 GetSyntheticChildren (ValueObject& valobj, 151 lldb::DynamicValueType use_dynamic); 152 #endif 153 154 bool 155 AnyMatches (ConstString type_name, 156 TypeCategoryImpl::FormatCategoryItems items = TypeCategoryImpl::ALL_ITEM_TYPES, 157 bool only_enabled = true, 158 const char** matching_category = NULL, 159 TypeCategoryImpl::FormatCategoryItems* matching_type = NULL) 160 { 161 return m_categories_map.AnyMatches(type_name, 162 items, 163 only_enabled, 164 matching_category, 165 matching_type); 166 } 167 168 static bool 169 GetFormatFromCString (const char *format_cstr, 170 bool partial_match_ok, 171 lldb::Format &format); 172 173 static char 174 GetFormatAsFormatChar (lldb::Format format); 175 176 static const char * 177 GetFormatAsCString (lldb::Format format); 178 179 // if the user tries to add formatters for, say, "struct Foo" 180 // those will not match any type because of the way we strip qualifiers from typenames 181 // this method looks for the case where the user is adding a "class","struct","enum" or "union" Foo 182 // and strips the unnecessary qualifier 183 static ConstString 184 GetValidTypeName (const ConstString& type); 185 186 // when DataExtractor dumps a vectorOfT, it uses a predefined format for each item 187 // this method returns it, or eFormatInvalid if vector_format is not a vectorOf 188 static lldb::Format 189 GetSingleItemFormat (lldb::Format vector_format); 190 191 void Changed()192 Changed () 193 { 194 __sync_add_and_fetch(&m_last_revision, +1); 195 m_format_cache.Clear (); 196 } 197 198 uint32_t GetCurrentRevision()199 GetCurrentRevision () 200 { 201 return m_last_revision; 202 } 203 ~FormatManager()204 ~FormatManager () 205 { 206 } 207 208 private: 209 FormatCache m_format_cache; 210 ValueNavigator m_value_nav; 211 NamedSummariesMap m_named_summaries_map; 212 uint32_t m_last_revision; 213 TypeCategoryMap m_categories_map; 214 215 ConstString m_default_category_name; 216 ConstString m_system_category_name; 217 ConstString m_gnu_cpp_category_name; 218 ConstString m_libcxx_category_name; 219 ConstString m_objc_category_name; 220 ConstString m_corefoundation_category_name; 221 ConstString m_coregraphics_category_name; 222 ConstString m_coreservices_category_name; 223 ConstString m_vectortypes_category_name; 224 ConstString m_appkit_category_name; 225 226 TypeCategoryMap& GetCategories()227 GetCategories () 228 { 229 return m_categories_map; 230 } 231 232 // WARNING: these are temporary functions that setup formatters 233 // while a few of these actually should be globally available and setup by LLDB itself 234 // most would actually belong to the users' lldbinit file or to some other form of configurable 235 // storage 236 void 237 LoadLibStdcppFormatters (); 238 239 void 240 LoadLibcxxFormatters (); 241 242 void 243 LoadSystemFormatters (); 244 245 void 246 LoadObjCFormatters (); 247 }; 248 249 } // namespace lldb_private 250 251 #endif // lldb_FormatManager_h_ 252