<rdar://problem/13779789>

Allow memory read -t to take persistent types (those defined with expression struct $....)



git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@183766 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Commands/CommandObjectMemory.cpp b/source/Commands/CommandObjectMemory.cpp
index fe44ad0..97ab957 100644
--- a/source/Commands/CommandObjectMemory.cpp
+++ b/source/Commands/CommandObjectMemory.cpp
@@ -521,17 +521,31 @@
                                                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)
             {
diff --git a/test/expression_command/persistent_types/TestPersistentTypes.py b/test/expression_command/persistent_types/TestPersistentTypes.py
index 7a96812..ab45d44 100644
--- a/test/expression_command/persistent_types/TestPersistentTypes.py
+++ b/test/expression_command/persistent_types/TestPersistentTypes.py
@@ -34,6 +34,16 @@
         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()
diff --git a/test/expression_command/persistent_types/main.c b/test/expression_command/persistent_types/main.c
index 343eac7..9e26e61 100644
--- a/test/expression_command/persistent_types/main.c
+++ b/test/expression_command/persistent_types/main.c
@@ -9,5 +9,6 @@
 
 int main (int argc, char const *argv[])
 {
+	const char* foo = "Hello world";
     return 0;
 }