aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog12
-rw-r--r--gdb/objc-lang.c139
-rw-r--r--gdb/objc-lang.h2
3 files changed, 80 insertions, 73 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 8f7537e..f3e7f3f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,15 @@
+2021-03-22 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * objc-lang.c (objc_demangle): Renamed to
+ objc_language::demangle_symbol, and moved later in the file.
+ (objc_language::sniff_from_mangled_name): Call demangle_symbol
+ member function.
+ (objc_language::demangle_symbol): Defined outside of class
+ declaration. The definition is the old objc_demangle with NULL
+ changed to nullptr, and if conditions relating to nullptr pointers
+ or null character checks made explicit.
+ * objc-lang.h (objc_demangle): Delete declaration.
+
2021-03-22 Martin Liska <mliska@suse.cz>
* arm-tdep.c (show_disassembly_style_sfunc): Replace usage of CONST_STRNEQ with startswith.
diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
index 8e8cc05..1d44012 100644
--- a/gdb/objc-lang.c
+++ b/gdb/objc-lang.c
@@ -216,72 +216,6 @@ value_nsstring (struct gdbarch *gdbarch, const char *ptr, int len)
return nsstringValue;
}
-/* Objective-C name demangling. */
-
-char *
-objc_demangle (const char *mangled, int options)
-{
- char *demangled, *cp;
-
- if (mangled[0] == '_' &&
- (mangled[1] == 'i' || mangled[1] == 'c') &&
- mangled[2] == '_')
- {
- cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
-
- if (mangled[1] == 'i')
- *cp++ = '-'; /* for instance method */
- else
- *cp++ = '+'; /* for class method */
-
- *cp++ = '['; /* opening left brace */
- strcpy(cp, mangled+3); /* Tack on the rest of the mangled name. */
-
- while (*cp && *cp == '_')
- cp++; /* Skip any initial underbars in class
- name. */
-
- cp = strchr(cp, '_');
- if (!cp) /* Find first non-initial underbar. */
- {
- xfree(demangled); /* not mangled name */
- return NULL;
- }
- if (cp[1] == '_') /* Easy case: no category name. */
- {
- *cp++ = ' '; /* Replace two '_' with one ' '. */
- strcpy(cp, mangled + (cp - demangled) + 2);
- }
- else
- {
- *cp++ = '('; /* Less easy case: category name. */
- cp = strchr(cp, '_');
- if (!cp)
- {
- xfree(demangled); /* not mangled name */
- return NULL;
- }
- *cp++ = ')';
- *cp++ = ' '; /* Overwriting 1st char of method name... */
- strcpy(cp, mangled + (cp - demangled)); /* Get it back. */
- }
-
- while (*cp && *cp == '_')
- cp++; /* Skip any initial underbars in
- method name. */
-
- for (; *cp; cp++)
- if (*cp == '_')
- *cp = ':'; /* Replace remaining '_' with ':'. */
-
- *cp++ = ']'; /* closing right brace */
- *cp++ = 0; /* string terminator */
- return demangled;
- }
- else
- return NULL; /* Not an objc mangled name. */
-}
-
/* Class representing the Objective-C language. */
class objc_language : public language_defn
@@ -320,16 +254,13 @@ public:
bool sniff_from_mangled_name (const char *mangled,
char **demangled) const override
{
- *demangled = objc_demangle (mangled, 0);
+ *demangled = demangle_symbol (mangled, 0);
return *demangled != NULL;
}
/* See language.h. */
- char *demangle_symbol (const char *mangled, int options) const override
- {
- return objc_demangle (mangled, options);
- }
+ char *demangle_symbol (const char *mangled, int options) const override;
/* See language.h. */
@@ -385,6 +316,72 @@ public:
{ return macro_expansion_c; }
};
+/* See declaration of objc_language::demangle_symbol above. */
+
+char *
+objc_language::demangle_symbol (const char *mangled, int options) const
+{
+ char *demangled, *cp;
+
+ if (mangled[0] == '_'
+ && (mangled[1] == 'i' || mangled[1] == 'c')
+ && mangled[2] == '_')
+ {
+ cp = demangled = (char *) xmalloc (strlen (mangled) + 2);
+
+ if (mangled[1] == 'i')
+ *cp++ = '-'; /* for instance method */
+ else
+ *cp++ = '+'; /* for class method */
+
+ *cp++ = '['; /* opening left brace */
+ strcpy(cp, mangled+3); /* Tack on the rest of the mangled name. */
+
+ while (*cp != '\0' && *cp == '_')
+ cp++; /* Skip any initial underbars in class
+ name. */
+
+ cp = strchr(cp, '_');
+ if (cp == nullptr) /* Find first non-initial underbar. */
+ {
+ xfree(demangled); /* not mangled name */
+ return nullptr;
+ }
+ if (cp[1] == '_') /* Easy case: no category name. */
+ {
+ *cp++ = ' '; /* Replace two '_' with one ' '. */
+ strcpy(cp, mangled + (cp - demangled) + 2);
+ }
+ else
+ {
+ *cp++ = '('; /* Less easy case: category name. */
+ cp = strchr(cp, '_');
+ if (cp == nullptr)
+ {
+ xfree(demangled); /* not mangled name */
+ return nullptr;
+ }
+ *cp++ = ')';
+ *cp++ = ' '; /* Overwriting 1st char of method name... */
+ strcpy(cp, mangled + (cp - demangled)); /* Get it back. */
+ }
+
+ while (*cp != '\0' && *cp == '_')
+ cp++; /* Skip any initial underbars in
+ method name. */
+
+ for (; *cp != '\0'; cp++)
+ if (*cp == '_')
+ *cp = ':'; /* Replace remaining '_' with ':'. */
+
+ *cp++ = ']'; /* closing right brace */
+ *cp++ = 0; /* string terminator */
+ return demangled;
+ }
+ else
+ return nullptr; /* Not an objc mangled name. */
+}
+
/* Single instance of the class representing the Objective-C language. */
static objc_language objc_language_defn;
diff --git a/gdb/objc-lang.h b/gdb/objc-lang.h
index f58335e..9d3e26d 100644
--- a/gdb/objc-lang.h
+++ b/gdb/objc-lang.h
@@ -31,8 +31,6 @@ extern CORE_ADDR lookup_objc_class (struct gdbarch *gdbarch,
extern CORE_ADDR lookup_child_selector (struct gdbarch *gdbarch,
const char *methodname);
-extern char *objc_demangle (const char *mangled, int options);
-
extern int find_objc_msgcall (CORE_ADDR pc, CORE_ADDR *new_pc);
extern const char *find_imps (const char *method,