spyffe created this revision.
spyffe added a project: LLDB.
Herald added subscribers: arichardson, aprantl, sdardis.

The IR dynamic checks are self-contained functions whose job is to

- verify that pointers referenced in an expression are valid at runtime; and
- verify that selectors sent to Objective-C objects by an expression are 
actually supported by that object.

These dynamic checks forward-declare all the functions they use and should not 
require any external debug information.  The way they ensure this is by marking 
all the names they use with a dollar sign (`$`).  The expression parser 
recognizes such symbols and perform no lookups for them.

This patch fixes three issues surrounding the use of the dollar sign:

- to fix a MIPS issue, the name of the pointer checker was changed from 
starting with `$` to starting with `_$`, but this was not properly ignored; and
- the Objective-C object checker used a temporary variable that did not start 
with `$`.
- the Objective-C object checker used an externally-defined struct (`struct 
objc_selector`) but didn't need to.

The patch also reformats the string containing the Objective-C object checker, 
which was mangled horribly when the code was transformed to a uniform width of 
80 columns.


Repository:
  rL LLVM

https://reviews.llvm.org/D38153

Files:
  source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
  source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
  source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp

Index: source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
===================================================================
--- source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
+++ source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
@@ -812,84 +812,44 @@
   int len = 0;
   if (m_has_object_getClass) {
     len = ::snprintf(check_function_code, sizeof(check_function_code),
-                     "extern \"C\" void *gdb_object_getClass(void *);          "
-                     "                                \n"
-                     "extern \"C\"  int printf(const char *format, ...);       "
-                     "                                \n"
-                     "extern \"C\" void                                        "
-                     "                                \n"
-                     "%s(void *$__lldb_arg_obj, void *$__lldb_arg_selector)    "
-                     "                                \n"
-                     "{                                                        "
-                     "                                \n"
-                     "   if ($__lldb_arg_obj == (void *)0)                     "
-                     "                                \n"
-                     "       return; // nil is ok                              "
-                     "                                \n"
-                     "   if (!gdb_object_getClass($__lldb_arg_obj))            "
-                     "                                \n"
-                     "       *((volatile int *)0) = 'ocgc';                    "
-                     "                                \n"
-                     "   else if ($__lldb_arg_selector != (void *)0)           "
-                     "                                \n"
-                     "   {                                                     "
-                     "                                \n"
-                     "        signed char responds = (signed char) [(id) "
-                     "$__lldb_arg_obj                       \n"
-                     "                                                "
-                     "respondsToSelector:                      \n"
-                     "                                       (struct "
-                     "objc_selector *) $__lldb_arg_selector];   \n"
-                     "       if (responds == (signed char) 0)                  "
-                     "                                \n"
-                     "           *((volatile int *)0) = 'ocgc';                "
-                     "                                \n"
-                     "   }                                                     "
-                     "                                \n"
-                     "}                                                        "
-                     "                                \n",
-                     name);
+                     "extern \"C\" void *gdb_object_getClass(void *);        \n"
+                     "extern \"C\"  int printf(const char *format, ...);     \n"
+                     "extern \"C\" void                                      \n"
+                     "%s(void *$__lldb_arg_obj, void *$__lldb_arg_selector) {\n"
+                     "  if ($__lldb_arg_obj == (void *)0)                    \n"
+                     "    return; // nil is ok                               \n"
+                     "  if (!gdb_object_getClass($__lldb_arg_obj)) {         \n"
+                     "    *((volatile int *)0) = 'ocgc';                     \n"
+                     "  } else if ($__lldb_arg_selector != (void *)0) {      \n"
+                     "    signed char $responds = (signed char)              \n"
+                     "        [(id)$__lldb_arg_obj respondsToSelector:       \n"
+                     "            (void *) $__lldb_arg_selector];            \n"
+                     "    if ($responds == (signed char) 0)                  \n"
+                     "      *((volatile int *)0) = 'ocgc';                   \n"
+                     "  }                                                    \n"
+                     "}                                                      \n"
+                     , name);
   } else {
     len = ::snprintf(check_function_code, sizeof(check_function_code),
-                     "extern \"C\" void *gdb_class_getClass(void *);           "
-                     "                                \n"
-                     "extern \"C\"  int printf(const char *format, ...);       "
-                     "                                \n"
-                     "extern \"C\"  void                                       "
-                     "                                \n"
-                     "%s(void *$__lldb_arg_obj, void *$__lldb_arg_selector)    "
-                     "                                \n"
-                     "{                                                        "
-                     "                                \n"
-                     "   if ($__lldb_arg_obj == (void *)0)                     "
-                     "                                \n"
-                     "       return; // nil is ok                              "
-                     "                                \n"
-                     "    void **$isa_ptr = (void **)$__lldb_arg_obj;          "
-                     "                                \n"
-                     "    if (*$isa_ptr == (void *)0 || "
-                     "!gdb_class_getClass(*$isa_ptr))                        \n"
-                     "       *((volatile int *)0) = 'ocgc';                    "
-                     "                                \n"
-                     "   else if ($__lldb_arg_selector != (void *)0)           "
-                     "                                \n"
-                     "   {                                                     "
-                     "                                \n"
-                     "        signed char responds = (signed char) [(id) "
-                     "$__lldb_arg_obj                       \n"
-                     "                                                "
-                     "respondsToSelector:                      \n"
-                     "                                        (struct "
-                     "objc_selector *) $__lldb_arg_selector];  \n"
-                     "       if (responds == (signed char) 0)                  "
-                     "                                \n"
-                     "           *((volatile int *)0) = 'ocgc';                "
-                     "                                \n"
-                     "   }                                                     "
-                     "                                \n"
-                     "}                                                        "
-                     "                                \n",
-                     name);
+                     "extern \"C\" void *gdb_class_getClass(void *);         \n"
+                     "extern \"C\"  int printf(const char *format, ...);     \n"
+                     "extern \"C\"  void                                     \n"
+                     "%s(void *$__lldb_arg_obj, void *$__lldb_arg_selector) {\n"
+                     "  if ($__lldb_arg_obj == (void *)0)                    \n"
+                     "    return; // nil is ok                               \n"
+                     "  void **$isa_ptr = (void **)$__lldb_arg_obj;          \n"
+                     "  if (*$isa_ptr == (void *)0 ||                        \n"
+                     "      !gdb_class_getClass(*$isa_ptr))                  \n"
+                     "    *((volatile int *)0) = 'ocgc';                     \n"
+                     "  else if ($__lldb_arg_selector != (void *)0) {        \n"
+                     "    signed char $responds = (signed char)              \n"
+                     "        [(id)$__lldb_arg_obj respondsToSelector:       \n"
+                     "            (void *) $__lldb_arg_selector];            \n"
+                     "    if ($responds == (signed char) 0)                  \n"
+                     "      *((volatile int *)0) = 'ocgc';                   \n"
+                     "  }                                                    \n"
+                     "}                                                      \n"
+                     , name);
   }
 
   assert(len < (int)sizeof(check_function_code));
Index: source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
===================================================================
--- source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
+++ source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
@@ -809,6 +809,9 @@
     } while (0);
   }
 
+  if (name_unique_cstr[0] == '_' && name_unique_cstr[1] == '$')
+    return;
+
   if (name_unique_cstr[0] == '$' && !namespace_decl) {
     static ConstString g_lldb_class_name("$__lldb_class");
 
Index: source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
===================================================================
--- source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
+++ source/Plugins/ExpressionParser/Clang/ClangASTSource.cpp
@@ -648,6 +648,8 @@
   // The ClangASTSource is not responsible for finding $-names.
   if (name_unique_cstr[0] == '$')
     return;
+  if (name_unique_cstr[0] == '_' && name_unique_cstr[1] == '$')
+    return;
 
   if (module_sp && namespace_decl) {
     CompilerDeclContext found_namespace_decl;
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to