<rdar://problem/13779789>
authorEnrico Granata <egranata@apple.com>
Tue, 11 Jun 2013 18:47:55 +0000 (18:47 +0000)
committerEnrico Granata <egranata@apple.com>
Tue, 11 Jun 2013 18:47:55 +0000 (18:47 +0000)
Allow memory read -t to take persistent types (those defined with expression struct $....)

llvm-svn: 183766

lldb/source/Commands/CommandObjectMemory.cpp
lldb/test/expression_command/persistent_types/TestPersistentTypes.py
lldb/test/expression_command/persistent_types/main.c

index fe44ad052abdc6fffbd0c1e6086126fc167c7c57..97ab957ff733d65003c71619e78415961dd52173 100644 (file)
@@ -521,17 +521,31 @@ protected:
                                                type_list);
             }
             
-            if (type_list.GetSize() == 0)
+            if (type_list.GetSize() == 0 && lookup_type_name.GetCString() && *lookup_type_name.GetCString() == '$')
             {
-                result.AppendErrorWithFormat ("unable to find any types that match the raw type '%s' for full type '%s'\n", 
-                                              lookup_type_name.GetCString(), 
-                                              view_as_type_cstr);
-                result.SetStatus(eReturnStatusFailed);
-                return false;
+                clang::TypeDecl *tdecl = target->GetPersistentVariables().GetPersistentType(ConstString(lookup_type_name));
+                if (tdecl)
+                {
+                    clang_ast_type.SetClangType(&tdecl->getASTContext(),(lldb::clang_type_t)tdecl->getTypeForDecl());
+                }
             }
             
-            TypeSP type_sp (type_list.GetTypeAtIndex(0));
-            clang_ast_type.SetClangType (type_sp->GetClangAST(), type_sp->GetClangFullType());
+            if (clang_ast_type.IsValid() == false)
+            {
+                if (type_list.GetSize() == 0)
+                {
+                    result.AppendErrorWithFormat ("unable to find any types that match the raw type '%s' for full type '%s'\n",
+                                                  lookup_type_name.GetCString(),
+                                                  view_as_type_cstr);
+                    result.SetStatus(eReturnStatusFailed);
+                    return false;
+                }
+                else
+                {
+                    TypeSP type_sp (type_list.GetTypeAtIndex(0));
+                    clang_ast_type.SetClangType (type_sp->GetClangAST(), type_sp->GetClangFullType());
+                }
+            }
             
             while (pointer_count > 0)
             {
index 7a9681271687a8e3bceb7b56a9ccade51d7df7a4..ab45d449d358a66bfc00112c1ad9907c091d9040 100644 (file)
@@ -34,6 +34,16 @@ class PersistenttypesTestCase(TestBase):
         self.expect("expression $bar i = 5; i",
                     startstr = "($bar) $1 = 5")
 
+        self.runCmd("expression struct $foobar { char a; char b; char c; char d; };")
+        self.runCmd("next")
+
+        self.expect("memory read foo -t $foobar",
+                    substrs = ['($foobar) 0x', ' = {', "a = 'H'","b = 'e'","c = 'l'","d = 'l'"]) # persistent types are OK to use for memory read
+
+        self.expect("memory read foo -t foobar",
+                    substrs = ['($foobar) 0x', ' = {', "a = 'H'","b = 'e'","c = 'l'","d = 'l'"],matching=False,error=True) # the type name is $foobar, make sure we settle for nothing less
+
+
 if __name__ == '__main__':
     import atexit
     lldb.SBDebugger.Initialize()
index 343eac7e554a70672fec029aa906ca2cfd93118f..9e26e619bfdb6b02da202241d628aa33565c5fc5 100644 (file)
@@ -9,5 +9,6 @@
 
 int main (int argc, char const *argv[])
 {
+       const char* foo = "Hello world";
     return 0;
 }