[Lldb-commits] [lldb] r220881 - Fix the NSPathStore2 data formatter to actually handle the explicit length stored inside the object. The meat of this commit, however, is a nice little API for easily adding new __lldb_autogen_ helper types to an AST context

Enrico Granata egranata at apple.com
Wed Oct 29 16:08:02 PDT 2014


Author: enrico
Date: Wed Oct 29 18:08:02 2014
New Revision: 220881

URL: http://llvm.org/viewvc/llvm-project?rev=220881&view=rev
Log:
Fix the NSPathStore2 data formatter to actually handle the explicit length stored inside the object. The meat of this commit, however, is a nice little API for easily adding new __lldb_autogen_ helper types to an AST context

Modified:
    lldb/trunk/include/lldb/Symbol/ClangASTContext.h
    lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp
    lldb/trunk/source/Symbol/ClangASTContext.cpp

Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTContext.h?rev=220881&r1=220880&r2=220881&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/ClangASTContext.h (original)
+++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h Wed Oct 29 18:08:02 2014
@@ -14,8 +14,10 @@
 #include <stdint.h>
 
 // C++ Includes
+#include <initializer_list>
 #include <string>
 #include <vector>
+#include <utility>
 
 // Other libraries and framework includes
 #include "llvm/ADT/SmallVector.h"
@@ -243,6 +245,10 @@ public:
         
         return clang_type;
     }
+    
+    ClangASTType
+    GetOrCreateStructForIdentifier (const ConstString &type_name,
+                                    const std::initializer_list< std::pair < const char *, ClangASTType > >& type_fields);
 
     //------------------------------------------------------------------
     // Structure, Unions, Classes

Modified: lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp?rev=220881&r1=220880&r2=220881&view=diff
==============================================================================
--- lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp (original)
+++ lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp Wed Oct 29 18:08:02 2014
@@ -23,6 +23,8 @@
 #include "lldb/Target/Target.h"
 #include "lldb/Target/Thread.h"
 
+#include "lldb/Utility/ProcessStructReader.h"
+
 #include <algorithm>
 
 using namespace lldb;
@@ -1037,6 +1039,26 @@ lldb_private::formatters::NSTaggedString
     return true;
 }
 
+static ClangASTType
+GetNSPathStore2Type (Target &target)
+{
+    static ConstString g_type_name("__lldb_autogen_nspathstore2");
+
+    ClangASTContext *ast_ctx = target.GetScratchClangASTContext();
+    
+    if (!ast_ctx)
+        return ClangASTType();
+    
+    ClangASTType voidstar = ast_ctx->GetBasicType(lldb::eBasicTypeVoid).GetPointerType();
+    ClangASTType uint32 = ast_ctx->GetIntTypeFromBitSize(32, false);
+    
+    return ast_ctx->GetOrCreateStructForIdentifier(g_type_name, {
+        {"isa",voidstar},
+        {"lengthAndRef",uint32},
+        {"buffer",voidstar}
+    });
+}
+
 bool
 lldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& stream)
 {
@@ -1182,7 +1204,10 @@ lldb_private::formatters::NSStringSummar
     }
     else if (is_special)
     {
-        uint64_t location = valobj_addr + (ptr_size == 8 ? 12 : 8);
+        ProcessStructReader reader(valobj.GetProcessSP().get(), valobj.GetValueAsUnsigned(0), GetNSPathStore2Type(*valobj.GetTargetSP()));
+        explicit_length = reader.GetField<uint32_t>(ConstString("lengthAndRef")) >> 20;
+        lldb::addr_t location = valobj.GetValueAsUnsigned(0) + ptr_size + 4;
+        
         ReadUTFBufferAndDumpToStreamOptions<UTF16> options;
         options.SetConversionFunction(ConvertUTF16toUTF8);
         options.SetLocation(location);

Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=220881&r1=220880&r2=220881&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/ClangASTContext.cpp (original)
+++ lldb/trunk/source/Symbol/ClangASTContext.cpp Wed Oct 29 18:08:02 2014
@@ -1855,7 +1855,20 @@ ClangASTContext::CreateArrayType (const
     return ClangASTType();
 }
 
-
+ClangASTType
+ClangASTContext::GetOrCreateStructForIdentifier (const ConstString &type_name,
+                                                 const std::initializer_list< std::pair < const char *, ClangASTType > >& type_fields)
+{
+    ClangASTType type;
+    if ((type = GetTypeForIdentifier<clang::CXXRecordDecl>(type_name)).IsValid())
+        return type;
+    type = CreateRecordType(nullptr, lldb::eAccessPublic, type_name.GetCString(), clang::TTK_Struct, lldb::eLanguageTypeC);
+    type.StartTagDeclarationDefinition();
+    for (const auto& field : type_fields)
+        type.AddFieldToRecordType(field.first, field.second, lldb::eAccessPublic, 0);
+    type.CompleteTagDeclarationDefinition();
+    return type;
+}
 
 #pragma mark Enumeration Types
 





More information about the lldb-commits mailing list