diff options
| author | Enrico Granata <granata.enrico@gmail.com> | 2011-08-19 01:14:49 +0000 |
|---|---|---|
| committer | Enrico Granata <granata.enrico@gmail.com> | 2011-08-19 01:14:49 +0000 |
| commit | 02b6676d2b96bc561999b9bbaaeb678e48232872 (patch) | |
| tree | 7e9e6c33a1205ccd611a56af9aea6d135a6c628f | |
| parent | 31963cea0ac25b2449f6e3ee88f9020b203cab7c (diff) | |
| download | bcm5719-llvm-02b6676d2b96bc561999b9bbaaeb678e48232872.tar.gz bcm5719-llvm-02b6676d2b96bc561999b9bbaaeb678e48232872.zip | |
Third round of code cleanups:
- reorganizing the PTS (Partial Template Specializations) in FormatManager.h
- applied a patch by Filipe Cabecinhas to make LLDB compile with GCC
Functional changes:
- fixed an issue where command type summary add for type "struct Foo" would not match any types.
currently, "struct" will be stripped off and type "Foo" will be matched.
similar behavior occurs for class, enum and union specifiers.
llvm-svn: 138020
9 files changed, 165 insertions, 168 deletions
diff --git a/lldb/include/lldb/Core/FormatManager.h b/lldb/include/lldb/Core/FormatManager.h index 1f37c5915f8..c04cfdba756 100644 --- a/lldb/include/lldb/Core/FormatManager.h +++ b/lldb/include/lldb/Core/FormatManager.h @@ -79,6 +79,35 @@ public: }; +// if the user tries to add formatters for, say, "struct Foo" +// those will not match any type because of the way we strip qualifiers from typenames +// this method looks for the case where the user is adding a "class","struct","enum" or "union" Foo +// and strips the unnecessary qualifier +static ConstString +GetValidTypeName_Impl(const ConstString& type) +{ + int strip_len = 0; + + if (type == false) + return type; + + const char* type_cstr = type.AsCString(); + + if ( ::strstr(type_cstr, "class ") == type_cstr) + strip_len = 6; + if ( ::strstr(type_cstr, "enum ") == type_cstr) + strip_len = 5; + if ( ::strstr(type_cstr, "struct ") == type_cstr) + strip_len = 7; + if ( ::strstr(type_cstr, "union ") == type_cstr) + strip_len = 6; + + if (strip_len == 0) + return type; + + return ConstString(type_cstr + strip_len); +} + template<typename KeyType, typename ValueType> class FormatNavigator; @@ -170,7 +199,7 @@ public: return m_map.size(); } -private: +protected: MapType m_map; Mutex m_map_mutex; IFormatChangeListener* listener; @@ -195,20 +224,19 @@ private: template<typename KeyType, typename ValueType> class FormatNavigator { -private: +protected: typedef FormatMap<KeyType,ValueType> BackEndType; - BackEndType m_format_map; - - std::string m_name; - + template<typename, typename> + struct Types { }; + public: typedef typename BackEndType::MapType MapType; typedef typename MapType::iterator MapIterator; typedef typename MapType::key_type MapKeyType; typedef typename MapType::mapped_type MapValueType; typedef typename BackEndType::CallbackType CallbackType; - + typedef typename lldb::SharedPtr<FormatNavigator<KeyType, ValueType> >::Type SharedPointer; friend class FormatCategory; @@ -224,15 +252,13 @@ public: void Add (const MapKeyType &type, const MapValueType& entry) { - m_format_map.Add(type,entry); + Add_Impl(type, entry, Types<KeyType,ValueType>()); } - // using ConstString instead of MapKeyType is necessary here - // to make the partial template specializations below work bool Delete (ConstString type) { - return m_format_map.Delete(type); + return Delete_Impl(type, Types<KeyType, ValueType>()); } bool @@ -270,19 +296,88 @@ public: { return m_format_map.GetCount(); } + +protected: -private: + BackEndType m_format_map; + + std::string m_name; DISALLOW_COPY_AND_ASSIGN(FormatNavigator); ConstString m_id_cs; - - // using ConstString instead of MapKeyType is necessary here - // to make the partial template specializations below work + + template<typename K, typename V> + void + Add_Impl (const MapKeyType &type, const MapValueType& entry, Types<K,V>) + { + m_format_map.Add(type,entry); + } + + template<typename V> + void Add_Impl (const ConstString &type, const MapValueType& entry, Types<ConstString,V>) + { + m_format_map.Add(GetValidTypeName_Impl(type), entry); + } + + template<typename K, typename V> + bool + Delete_Impl (ConstString type, Types<K,V>) + { + return m_format_map.Delete(type); + } + + template<typename V> + bool + Delete_Impl (ConstString type, Types<lldb::RegularExpressionSP,V>) + { + Mutex& x_mutex = m_format_map.mutex(); + lldb_private::Mutex::Locker locker(x_mutex); + MapIterator pos, end = m_format_map.map().end(); + for (pos = m_format_map.map().begin(); pos != end; pos++) + { + lldb::RegularExpressionSP regex = pos->first; + if ( ::strcmp(type.AsCString(),regex->GetText()) == 0) + { + m_format_map.map().erase(pos); + if (m_format_map.listener) + m_format_map.listener->Changed(); + return true; + } + } + return false; + } + + template<typename K, typename V> + bool + Get_Impl (ConstString type, MapValueType& entry, Types<K,V>) + { + return m_format_map.Get(type, entry); + } + + template<typename V> + bool + Get_Impl (ConstString key, MapValueType& value, Types<lldb::RegularExpressionSP,V>) + { + Mutex& x_mutex = m_format_map.mutex(); + lldb_private::Mutex::Locker locker(x_mutex); + MapIterator pos, end = m_format_map.map().end(); + for (pos = m_format_map.map().begin(); pos != end; pos++) + { + lldb::RegularExpressionSP regex = pos->first; + if (regex->Execute(key.AsCString())) + { + value = pos->second; + return true; + } + } + return false; + } + bool Get (ConstString type, MapValueType& entry) { - return m_format_map.Get(type, entry); + return Get_Impl(type, entry, Types<KeyType,ValueType>()); } bool Get_ObjC(ValueObject& valobj, @@ -577,30 +672,6 @@ private: return false; } }; - -template<> -bool -FormatNavigator<lldb::RegularExpressionSP, SummaryFormat>::Get(ConstString key, lldb::SummaryFormatSP& value); - -template<> -bool -FormatNavigator<lldb::RegularExpressionSP, SummaryFormat>::Delete(ConstString type); - -template<> -bool -FormatNavigator<lldb::RegularExpressionSP, SyntheticFilter>::Get(ConstString key, SyntheticFilter::SharedPointer& value); - -template<> -bool -FormatNavigator<lldb::RegularExpressionSP, SyntheticFilter>::Delete(ConstString type); - -template<> -bool -FormatNavigator<lldb::RegularExpressionSP, SyntheticScriptProvider>::Get(ConstString key, SyntheticFilter::SharedPointer& value); - -template<> -bool -FormatNavigator<lldb::RegularExpressionSP, SyntheticScriptProvider>::Delete(ConstString type); class CategoryMap; @@ -633,7 +704,7 @@ public: eFilter = 0x0002, eRegexFilter = 0x1002, eSynth = 0x0004, - eRegexSynth = 0x1004, + eRegexSynth = 0x1004 }; typedef uint16_t FormatCategoryItems; @@ -1166,6 +1237,13 @@ public: static const char * GetFormatAsCString (lldb::Format format); + // if the user tries to add formatters for, say, "struct Foo" + // those will not match any type because of the way we strip qualifiers from typenames + // this method looks for the case where the user is adding a "class","struct","enum" or "union" Foo + // and strips the unnecessary qualifier + static ConstString + GetValidTypeName (const ConstString& type); + // when DataExtractor dumps a vectorOfT, it uses a predefined format for each item // this method returns it, or eFormatInvalid if vector_format is not a vectorOf static lldb::Format diff --git a/lldb/include/lldb/Core/ValueObject.h b/lldb/include/lldb/Core/ValueObject.h index cc8f2ab5c5c..25532ab456b 100644 --- a/lldb/include/lldb/Core/ValueObject.h +++ b/lldb/include/lldb/Core/ValueObject.h @@ -79,7 +79,7 @@ public: eDisplaySummary, eDisplayLanguageSpecific, eDisplayLocation, - eDisplayChildrenCount, + eDisplayChildrenCount }; enum ExpressionPathScanEndReason diff --git a/lldb/include/lldb/Interpreter/ScriptInterpreter.h b/lldb/include/lldb/Interpreter/ScriptInterpreter.h index 4d494f732c9..21becb6f297 100644 --- a/lldb/include/lldb/Interpreter/ScriptInterpreter.h +++ b/lldb/include/lldb/Interpreter/ScriptInterpreter.h @@ -66,7 +66,7 @@ public: eFloat, eDouble, eChar, - eCharStrOrNone, + eCharStrOrNone } ReturnType; diff --git a/lldb/source/Commands/CommandObjectType.cpp b/lldb/source/Commands/CommandObjectType.cpp index d3b7163b53c..abc613b511e 100644 --- a/lldb/source/Commands/CommandObjectType.cpp +++ b/lldb/source/Commands/CommandObjectType.cpp @@ -3366,7 +3366,7 @@ private: enum FilterFormatType { eRegularFilter, - eRegexFilter, + eRegexFilter }; bool diff --git a/lldb/source/Commands/CommandObjectType.h b/lldb/source/Commands/CommandObjectType.h index cb86f8e3e11..b38e0ff9d11 100644 --- a/lldb/source/Commands/CommandObjectType.h +++ b/lldb/source/Commands/CommandObjectType.h @@ -187,7 +187,7 @@ public: { eRegularSummary, eRegexSummary, - eNamedSummary, + eNamedSummary }; CommandObjectTypeSummaryAdd (CommandInterpreter &interpreter); @@ -330,7 +330,7 @@ public: enum SynthFormatType { eRegularSynth, - eRegexSynth, + eRegexSynth }; CommandObjectTypeSynthAdd (CommandInterpreter &interpreter); diff --git a/lldb/source/Core/FormatManager.cpp b/lldb/source/Core/FormatManager.cpp index 13df1bbbb8c..cc69ff1b8fd 100644 --- a/lldb/source/Core/FormatManager.cpp +++ b/lldb/source/Core/FormatManager.cpp @@ -154,120 +154,6 @@ FormatManager::GetFormatAsCString (Format format) return NULL; } -template<> -bool -FormatNavigator<lldb::RegularExpressionSP, SummaryFormat>::Get(ConstString key, lldb::SummaryFormatSP& value) -{ - Mutex::Locker(m_format_map.mutex()); - MapIterator pos, end = m_format_map.map().end(); - for (pos = m_format_map.map().begin(); pos != end; pos++) - { - lldb::RegularExpressionSP regex = pos->first; - if (regex->Execute(key.AsCString())) - { - value = pos->second; - return true; - } - } - return false; -} - -template<> -bool -FormatNavigator<lldb::RegularExpressionSP, SummaryFormat>::Delete(ConstString type) -{ - Mutex::Locker(m_format_map.mutex()); - MapIterator pos, end = m_format_map.map().end(); - for (pos = m_format_map.map().begin(); pos != end; pos++) - { - lldb::RegularExpressionSP regex = pos->first; - if ( ::strcmp(type.AsCString(),regex->GetText()) == 0) - { - m_format_map.map().erase(pos); - if (m_format_map.listener) - m_format_map.listener->Changed(); - return true; - } - } - return false; -} - -template<> -bool -FormatNavigator<lldb::RegularExpressionSP, SyntheticFilter>::Get(ConstString key, SyntheticFilter::SharedPointer& value) -{ - Mutex::Locker(m_format_map.mutex()); - MapIterator pos, end = m_format_map.map().end(); - for (pos = m_format_map.map().begin(); pos != end; pos++) - { - lldb::RegularExpressionSP regex = pos->first; - if (regex->Execute(key.AsCString())) - { - value = pos->second; - return true; - } - } - return false; -} - -template<> -bool -FormatNavigator<lldb::RegularExpressionSP, SyntheticFilter>::Delete(ConstString type) -{ - Mutex::Locker(m_format_map.mutex()); - MapIterator pos, end = m_format_map.map().end(); - for (pos = m_format_map.map().begin(); pos != end; pos++) - { - lldb::RegularExpressionSP regex = pos->first; - if ( ::strcmp(type.AsCString(),regex->GetText()) == 0) - { - m_format_map.map().erase(pos); - if (m_format_map.listener) - m_format_map.listener->Changed(); - return true; - } - } - return false; -} - -template<> -bool -FormatNavigator<lldb::RegularExpressionSP, SyntheticScriptProvider>::Get(ConstString key, SyntheticFilter::SharedPointer& value) -{ - Mutex::Locker(m_format_map.mutex()); - MapIterator pos, end = m_format_map.map().end(); - for (pos = m_format_map.map().begin(); pos != end; pos++) - { - lldb::RegularExpressionSP regex = pos->first; - if (regex->Execute(key.AsCString())) - { - value = pos->second; - return true; - } - } - return false; -} - -template<> -bool -FormatNavigator<lldb::RegularExpressionSP, SyntheticScriptProvider>::Delete(ConstString type) -{ - Mutex::Locker(m_format_map.mutex()); - MapIterator pos, end = m_format_map.map().end(); - for (pos = m_format_map.map().begin(); pos != end; pos++) - { - lldb::RegularExpressionSP regex = pos->first; - if ( ::strcmp(type.AsCString(),regex->GetText()) == 0) - { - m_format_map.map().erase(pos); - if (m_format_map.listener) - m_format_map.listener->Changed(); - return true; - } - } - return false; -} - FormatCategory::FormatCategory(IFormatChangeListener* clist, std::string name) : m_summary_nav(new SummaryNavigator("summary",clist)), @@ -486,6 +372,12 @@ FormatManager::GetSingleItemFormat(lldb::Format vector_format) } } +ConstString +FormatManager::GetValidTypeName (const ConstString& type) +{ + return ::GetValidTypeName_Impl(type); +} + FormatManager::FormatManager() : m_value_nav("format",this), m_named_summaries_map(this), @@ -574,7 +466,6 @@ FormatManager::FormatManager() : } - static FormatManager& GetFormatManager() { @@ -603,7 +494,7 @@ DataVisualization::ValueFormats::Get(ValueObject& valobj, lldb::DynamicValueType void DataVisualization::ValueFormats::Add(const ConstString &type, const lldb::ValueFormatSP &entry) { - GetFormatManager().Value().Add(type,entry); + GetFormatManager().Value().Add(FormatManager::GetValidTypeName(type),entry); } bool @@ -731,7 +622,7 @@ DataVisualization::NamedSummaryFormats::Get(const ConstString &type, lldb::Summa void DataVisualization::NamedSummaryFormats::Add(const ConstString &type, const lldb::SummaryFormatSP &entry) { - GetFormatManager().NamedSummary().Add(type,entry); + GetFormatManager().NamedSummary().Add(FormatManager::GetValidTypeName(type),entry); } bool diff --git a/lldb/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.h b/lldb/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.h index 502a59432f6..db1e02f605f 100644 --- a/lldb/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.h +++ b/lldb/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.h @@ -62,12 +62,12 @@ public: KDP_WRITEMEM64, KDP_BREAKPOINT_SET64, KDP_BREAKPOINT_REMOVE64, - KDP_KERNELVERSION, + KDP_KERNELVERSION } CommandType; enum { - KDP_FEATURE_BP = (1u << 0), + KDP_FEATURE_BP = (1u << 0) }; typedef enum diff --git a/lldb/source/Plugins/Process/Utility/RegisterContextDarwin_x86_64.cpp b/lldb/source/Plugins/Process/Utility/RegisterContextDarwin_x86_64.cpp index dcf4da37039..46a0a8fb0cc 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterContextDarwin_x86_64.cpp +++ b/lldb/source/Plugins/Process/Utility/RegisterContextDarwin_x86_64.cpp @@ -98,7 +98,7 @@ enum fpu_fiseg = fpu_cs, fpu_fioff = fpu_ip, fpu_foseg = fpu_ds, - fpu_fooff = fpu_dp, + fpu_fooff = fpu_dp }; enum gcc_dwarf_regnums @@ -143,7 +143,7 @@ enum gcc_dwarf_regnums gcc_dwarf_fpu_stmm4, gcc_dwarf_fpu_stmm5, gcc_dwarf_fpu_stmm6, - gcc_dwarf_fpu_stmm7, + gcc_dwarf_fpu_stmm7 }; @@ -205,7 +205,7 @@ enum gdb_regnums gdb_fpu_xmm13 = 53, gdb_fpu_xmm14 = 54, gdb_fpu_xmm15 = 55, - gdb_fpu_mxcsr = 56, + gdb_fpu_mxcsr = 56 }; RegisterContextDarwin_x86_64::RegisterContextDarwin_x86_64 (Thread &thread, uint32_t concrete_frame_idx) : diff --git a/lldb/test/functionalities/data-formatter/data-formatter-cpp/TestDataFormatterCpp.py b/lldb/test/functionalities/data-formatter/data-formatter-cpp/TestDataFormatterCpp.py index 97aae5c8e1c..0cc04f9ea86 100644 --- a/lldb/test/functionalities/data-formatter/data-formatter-cpp/TestDataFormatterCpp.py +++ b/lldb/test/functionalities/data-formatter/data-formatter-cpp/TestDataFormatterCpp.py @@ -202,6 +202,34 @@ class DataFormatterTestCase(TestBase): self.expect("frame variable the_coolest_guy", substrs = ['(i_am_cooler) the_coolest_guy = goofy']) + # check that unwanted type specifiers are removed + self.runCmd("type summary delete i_am_cool") + self.runCmd("type summary add -f \"goofy\" \"class i_am_cool\"") + self.expect("frame variable the_coolest_guy", + substrs = ['(i_am_cooler) the_coolest_guy = goofy']) + + self.runCmd("type summary delete i_am_cool") + self.runCmd("type summary add -f \"goofy\" \"enum i_am_cool\"") + self.expect("frame variable the_coolest_guy", + substrs = ['(i_am_cooler) the_coolest_guy = goofy']) + + self.runCmd("type summary delete i_am_cool") + self.runCmd("type summary add -f \"goofy\" \"struct i_am_cool\"") + self.expect("frame variable the_coolest_guy", + substrs = ['(i_am_cooler) the_coolest_guy = goofy']) + + self.runCmd("type summary delete i_am_cool") + self.runCmd("type summary add -f \"goofy\" \"union i_am_cool\"") + self.expect("frame variable the_coolest_guy", + substrs = ['(i_am_cooler) the_coolest_guy = goofy']) + + # but that not *every* specifier is removed + self.runCmd("type summary delete i_am_cool") + self.runCmd("type summary add -f \"goofy\" \"wrong i_am_cool\"") + self.expect("frame variable the_coolest_guy", matching=False, + substrs = ['(i_am_cooler) the_coolest_guy = goofy']) + + if __name__ == '__main__': import atexit lldb.SBDebugger.Initialize() |

