Hi clayborg, zturner, jingham, k8stone,

This patch includes following changes:
  - Add Language member to Mangled class with corresponding constructor. Minor 
refactoring in places where Mangled instances used.
  - Function name demangling depending on its compile unit actual language.
  - Enable demangling for case if function/sym language still unknown at moment 
when demangling requested.
  - Flag indicating known language was set added. Demangler now is able to 
re-demangle given sym name if it language was re-set since Mangled object 
creation. Demangling against unknown language is allowed because in lldb 
unknown language means C++/ObjC in most cases implicitly.

REPOSITORY
  rL LLVM

http://reviews.llvm.org/D7302

Files:
  include/lldb/Core/Mangled.h
  source/Core/Mangled.cpp
  source/Expression/ClangExpressionDeclMap.cpp
  source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
  source/Symbol/Function.cpp
  source/Symbol/Symbol.cpp
  source/Symbol/Variable.cpp

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
Index: include/lldb/Core/Mangled.h
===================================================================
--- include/lldb/Core/Mangled.h
+++ include/lldb/Core/Mangled.h
@@ -14,6 +14,7 @@
 
 #include "lldb/lldb-private.h"
 #include "lldb/Core/ConstString.h"
+#include "lldb/Core/Language.h"
 #include <vector>
 
 namespace lldb_private {
@@ -77,6 +78,22 @@
     Mangled (const ConstString &name);
 
     //----------------------------------------------------------------------
+    /// Construct with name and language.
+    ///
+    /// Constructor with an optional string, a boolean indicating if it is the
+    /// mangled version, and the preferred language.
+    ///
+    /// @param[in] name
+    ///     The already const name to copy into this object.
+    ///
+    /// @param[in] is_mangled
+    ///     If \b true then \a name is a mangled name, if \b false then
+    ///     \a name is demangled.
+    //----------------------------------------------------------------------
+    explicit
+    Mangled (const ConstString &name, bool is_mangled, lldb::LanguageType language);
+
+    //----------------------------------------------------------------------
     /// Destructor
     ///
     /// Releases its ref counts on the mangled and demangled strings that
@@ -292,7 +309,7 @@
 
     //----------------------------------------------------------------------
     /// Get the language only if it is definitive what the language is from
-    /// the mangling.
+    /// the mangling (or unless set via SetLanguage).
     ///
     /// For a mangled name to have a language it must have both a mangled
     /// and a demangled name and it must be definitive from the mangling
@@ -307,14 +324,27 @@
     ///     if there is no mangled or demangled counterpart.
     //----------------------------------------------------------------------
     lldb::LanguageType
-    GetLanguage ();
+    GetLanguage () const;
 
+    //----------------------------------------------------------------------
+    /// Set accessor for the language object, associated with Mangled
+    /// instance.
+    ///
+    /// @param[in] language
+    ///     The new enumeration value that describes the programming
+    ///     language that a Mangled is associated with.
+    //------------------------------------------------------------------
+    void
+    SetLanguage (lldb::LanguageType language);
+
 private:
     //----------------------------------------------------------------------
     /// Mangled member variables.
     //----------------------------------------------------------------------
             ConstString m_mangled;      ///< The mangled version of the name
     mutable ConstString m_demangled;    ///< Mutable so we can get it on demand with a const version of this object
+            Language m_language;        ///< Language, used for taking into account language differences in demangling
+    mutable bool m_bLanguage_was_set;   ///< Flag, means known language was set explicitly
 };
 
 
Index: source/Core/Mangled.cpp
===================================================================
--- source/Core/Mangled.cpp
+++ source/Core/Mangled.cpp
@@ -5089,6 +5089,20 @@
 }
 
 //----------------------------------------------------------------------
+// Constructor with an optional string, a boolean indicating if it is the
+// mangled version, and the preferred language.
+//----------------------------------------------------------------------
+Mangled::Mangled (const ConstString &s, bool mangled, lldb::LanguageType language) :
+    m_mangled(),
+    m_demangled(),
+    m_language(language),
+    m_bLanguage_was_set(false)
+{
+    if (s)
+        SetValue(s, mangled);
+}
+
+//----------------------------------------------------------------------
 // Destructor
 //----------------------------------------------------------------------
 Mangled::~Mangled ()
@@ -5130,6 +5144,7 @@
 {
     m_mangled.Clear();
     m_demangled.Clear();
+    m_bLanguage_was_set = false;
 }
 
 
@@ -5206,8 +5221,9 @@
 Mangled::GetDemangledName () const
 {
     // Check to make sure we have a valid mangled name and that we
-    // haven't already decoded our mangled name.
-    if (m_mangled && !m_demangled)
+    // haven't already decoded our mangled name or language was re-set since object created.
+    if ((m_mangled && !m_demangled)
+        || m_bLanguage_was_set)
     {
         // We need to generate and cache the demangled name.
         Timer scoped_timer (__PRETTY_FUNCTION__,
@@ -5218,7 +5234,8 @@
         const char *mangled_cstr = m_mangled.GetCString();
         if (cstring_is_mangled(mangled_cstr))
         {
-            if (!m_mangled.GetMangledCounterpart(m_demangled))
+            if (!m_mangled.GetMangledCounterpart(m_demangled)
+                || m_bLanguage_was_set)
             {
                 // We didn't already mangle this name, demangle it and if all goes well
                 // add it to our map.
@@ -5251,7 +5268,25 @@
 
                 if (demangled_name)
                 {
-                    m_demangled.SetCStringWithMangledCounterpart(demangled_name, m_mangled);
+                    std::string temp_demangled_name(demangled_name);
+                    std::string cplusplus_sep("::");
+                    std::string pascaljava_sep(".");
+
+                    switch(m_language.GetLanguage())
+                    {
+                        case lldb::eLanguageTypePascal83:
+                        case lldb::eLanguageTypeJava:
+                            {
+                                size_t start_pos = temp_demangled_name.find(cplusplus_sep, 0);
+                                while(start_pos != std::string::npos)
+                                {
+                                    temp_demangled_name.replace(start_pos, cplusplus_sep.length(), pascaljava_sep);
+                                    start_pos = temp_demangled_name.find(cplusplus_sep, start_pos);
+                                }
+                            }
+                        default :
+                            m_demangled.SetCStringWithMangledCounterpart(temp_demangled_name.c_str(), m_mangled);
+                    }
                     free (demangled_name);
                 }
             }
@@ -5263,7 +5298,7 @@
             m_demangled.SetCString("");
         }
     }
-
+    m_bLanguage_was_set = false;
     return m_demangled;
 }
 
@@ -5310,6 +5345,26 @@
 }
 
 //----------------------------------------------------------------------
+// Get current language.
+//----------------------------------------------------------------------
+lldb::LanguageType
+Mangled::GetLanguage () const
+{
+    return m_language.GetLanguage();
+}
+
+//----------------------------------------------------------------------
+// Set current language.
+//----------------------------------------------------------------------
+void
+Mangled::SetLanguage (lldb::LanguageType language)
+{
+    m_language.SetLanguage(language);
+    if (m_language.GetLanguage() != lldb::eLanguageTypeUnknown)
+        m_bLanguage_was_set = true;
+}
+
+//----------------------------------------------------------------------
 // Dump a Mangled object to stream "s". We don't force our
 // demangled name to be computed currently (we don't use the accessor).
 //----------------------------------------------------------------------
@@ -5352,21 +5407,6 @@
     return m_mangled.MemorySize() + m_demangled.MemorySize();
 }
 
-lldb::LanguageType
-Mangled::GetLanguage ()
-{
-    ConstString mangled = GetMangledName();
-    if (mangled)
-    {
-        if (GetDemangledName())
-        {
-            if (cstring_is_mangled(mangled.GetCString()))
-                return lldb::eLanguageTypeC_plus_plus;
-        }
-    }
-    return  lldb::eLanguageTypeUnknown;
-}
-
 //----------------------------------------------------------------------
 // Dump OBJ to the supplied stream S.
 //----------------------------------------------------------------------
Index: source/Expression/ClangExpressionDeclMap.cpp
===================================================================
--- source/Expression/ClangExpressionDeclMap.cpp
+++ source/Expression/ClangExpressionDeclMap.cpp
@@ -569,9 +569,11 @@
     {
         // Sometimes we get a mangled name for a global function that actually should be "extern C."
         // This is a hack to compensate.
-        
+
         const bool is_mangled = true;
-        Mangled mangled(name, is_mangled);
+        LanguageType language = m_parser_vars->m_sym_ctx.comp_unit ? m_parser_vars->m_sym_ctx.comp_unit->GetLanguage() : eLanguageTypeUnknown;
+
+        Mangled mangled(name, is_mangled, language);
                 
         CPPLanguageRuntime::MethodName method_name(mangled.GetDemangledName());
         
Index: source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
===================================================================
--- source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
+++ source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
@@ -853,7 +853,8 @@
                     // with duplicate entries
                     if (name != mangled_cstr && ((mangled_cstr[0] == '_') || (name && ::strcmp(name, mangled_cstr) != 0)))
                     {
-                        Mangled mangled (ConstString(mangled_cstr), true);
+                        LanguageType cu_language = (LanguageType)die.GetAttributeValueAsUnsigned(m_dwarf2Data, this, DW_AT_language, 0);
+                        Mangled mangled (ConstString(mangled_cstr), true, cu_language);
                         func_fullnames.Insert (mangled.GetMangledName(), die.GetOffset());
                         if (mangled.GetDemangledName())
                             func_fullnames.Insert (mangled.GetDemangledName(), die.GetOffset());
@@ -875,7 +876,8 @@
                     // with duplicate entries
                     if (name != mangled_cstr && ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0)))
                     {
-                        Mangled mangled (ConstString(mangled_cstr), true);
+                        LanguageType cu_language = (LanguageType)die.GetAttributeValueAsUnsigned(m_dwarf2Data, this, DW_AT_language, 0);
+                        Mangled mangled (ConstString(mangled_cstr), true, cu_language);
                         func_fullnames.Insert (mangled.GetMangledName(), die.GetOffset());
                         if (mangled.GetDemangledName())
                             func_fullnames.Insert (mangled.GetDemangledName(), die.GetOffset());
@@ -922,7 +924,8 @@
                 // with duplicate entries
                 if (mangled_cstr && name != mangled_cstr && ((mangled_cstr[0] == '_') || (::strcmp(name, mangled_cstr) != 0)))
                 {
-                    Mangled mangled (ConstString(mangled_cstr), true);
+                    LanguageType cu_language = (LanguageType)die.GetAttributeValueAsUnsigned(m_dwarf2Data, this, DW_AT_language, 0);
+                    Mangled mangled (ConstString(mangled_cstr), true, cu_language);
                     globals.Insert (mangled.GetMangledName(), die.GetOffset());
                     if (mangled.GetDemangledName())
                         globals.Insert (mangled.GetDemangledName(), die.GetOffset());
Index: source/Symbol/Function.cpp
===================================================================
--- source/Symbol/Function.cpp
+++ source/Symbol/Function.cpp
@@ -216,6 +216,7 @@
 {
     m_block.SetParentScope(this);
     assert(comp_unit != nullptr);
+    m_mangled.SetLanguage(comp_unit->GetLanguage());
 }
 
 Function::Function
@@ -231,7 +232,7 @@
     m_comp_unit (comp_unit),
     m_type_uid (type_uid),
     m_type (type),
-    m_mangled (ConstString(mangled), true),
+    m_mangled (ConstString(mangled), true, eLanguageTypeUnknown),
     m_block (func_uid),
     m_range (range),
     m_frame_base (),
@@ -240,6 +241,7 @@
 {
     m_block.SetParentScope(this);
     assert(comp_unit != nullptr);
+    m_mangled.SetLanguage(comp_unit->GetLanguage());
 }
 
 
Index: source/Symbol/Symbol.cpp
===================================================================
--- source/Symbol/Symbol.cpp
+++ source/Symbol/Symbol.cpp
@@ -71,7 +71,8 @@
     m_size_is_valid (size_is_valid || size > 0),
     m_demangled_is_synthesized (false),
     m_type (type),
-    m_mangled (ConstString(name), name_is_mangled),
+    // TODO: use context language
+    m_mangled(ConstString(name), name_is_mangled, eLanguageTypeUnknown),
     m_addr_range (section_sp, offset, size),
     m_flags (flags)
 {
@@ -103,7 +104,8 @@
     m_size_is_valid (size_is_valid || range.GetByteSize() > 0),
     m_demangled_is_synthesized (false),
     m_type (type),
-    m_mangled (ConstString(name), name_is_mangled),
+    // TODO: use context language
+    m_mangled(ConstString(name), name_is_mangled, eLanguageTypeUnknown),
     m_addr_range (range),
     m_flags (flags)
 {
Index: source/Symbol/Variable.cpp
===================================================================
--- source/Symbol/Variable.cpp
+++ source/Symbol/Variable.cpp
@@ -47,7 +47,8 @@
 ) :
     UserID(uid),
     m_name(name),
-    m_mangled (ConstString(mangled), true),
+    // TODO: language
+    m_mangled(ConstString(mangled), true, eLanguageTypeUnknown),
     m_symfile_type_sp(symfile_type_sp),
     m_scope(scope),
     m_owner_scope(context),
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to