Commit 5cc158e9 by Iain Buclaw Committed by Iain Buclaw

d-demangle.c (dlang_identifier): Check encoded length of identifier to verify…

d-demangle.c (dlang_identifier): Check encoded length of identifier to verify strncmp matches entire string.

libiberty/ChangeLog:

2015-05-16  Iain Buclaw  <ibuclaw@gdcproject.org>

	* d-demangle.c (dlang_identifier): Check encoded length of identifier
	to verify strncmp matches entire string.
	* testsuite/d-demangle-expected: Fix wrong test for postblit symbol.

From-SVN: r223243
parent fa66ced4
2015-05-16 Iain Buclaw <ibuclaw@gdcproject.org> 2015-05-16 Iain Buclaw <ibuclaw@gdcproject.org>
* d-demangle.c (dlang_identifier): Check encoded length of identifier
to verify strncmp matches entire string.
* testsuite/d-demangle-expected: Fix wrong test for postblit symbol.
2015-05-16 Iain Buclaw <ibuclaw@gdcproject.org>
* d-demangle.c (dlang_type_modifiers): New function. * d-demangle.c (dlang_type_modifiers): New function.
(dlang_type_modifier_p): New function. (dlang_type_modifier_p): New function.
(dlang_call_convention_p): Ignore any kind of type modifier. (dlang_call_convention_p): Ignore any kind of type modifier.
......
...@@ -672,65 +672,82 @@ dlang_identifier (string *decl, const char *mangled) ...@@ -672,65 +672,82 @@ dlang_identifier (string *decl, const char *mangled)
return NULL; return NULL;
} }
if (strncmp (mangled, "__ctor", i) == 0) switch (i)
{ {
/* Constructor symbol for a class/struct. */ case 6:
string_append (decl, "this"); if (strncmp (mangled, "__ctor", i) == 0)
mangled += i; {
return mangled; /* Constructor symbol for a class/struct. */
} string_append (decl, "this");
else if (strncmp (mangled, "__dtor", i) == 0) mangled += i;
{ return mangled;
/* Destructor symbol for a class/struct. */ }
string_append (decl, "~this"); else if (strncmp (mangled, "__dtor", i) == 0)
mangled += i; {
return mangled; /* Destructor symbol for a class/struct. */
} string_append (decl, "~this");
else if (strncmp (mangled, "__postblit", i) == 0) mangled += i;
{ return mangled;
/* Postblit symbol for a struct. */ }
string_append (decl, "this(this)"); else if (strncmp (mangled, "__initZ", i+1) == 0)
mangled += i; {
return mangled; /* The static initialiser for a given symbol. */
} string_append (decl, "init$");
else if (strncmp (mangled, "__initZ", i+1) == 0) mangled += i;
{ return mangled;
/* The static initialiser for a given symbol. */ }
string_append (decl, "init$"); else if (strncmp (mangled, "__vtblZ", i+1) == 0)
mangled += i + 1; {
return mangled; /* The vtable symbol for a given class. */
} string_prepend (decl, "vtable for ");
else if (strncmp (mangled, "__ClassZ", i+1) == 0) string_setlength (decl, string_length (decl) - 1);
{ mangled += i;
/* The classinfo symbol for a given class. */ return mangled;
string_prepend (decl, "ClassInfo for "); }
string_setlength (decl, string_length (decl) - 1); break;
mangled += i + 1;
return mangled; case 7:
} if (strncmp (mangled, "__ClassZ", i+1) == 0)
else if (strncmp (mangled, "__vtblZ", i+1) == 0) {
{ /* The classinfo symbol for a given class. */
/* The vtable symbol for a given class. */ string_prepend (decl, "ClassInfo for ");
string_prepend (decl, "vtable for "); string_setlength (decl, string_length (decl) - 1);
string_setlength (decl, string_length (decl) - 1); mangled += i;
mangled += i + 1; return mangled;
return mangled; }
} break;
else if (strncmp (mangled, "__InterfaceZ", i+1) == 0)
{ case 10:
/* The interface symbol for a given class. */ if (strncmp (mangled, "__postblitMFZ", i+3) == 0)
string_prepend (decl, "Interface for "); {
string_setlength (decl, string_length (decl) - 1); /* Postblit symbol for a struct. */
mangled += i + 1; string_append (decl, "this(this)");
return mangled; mangled += i + 3;
} return mangled;
else if (strncmp (mangled, "__ModuleInfoZ", i+1) == 0) }
{ break;
/* The ModuleInfo symbol for a given module. */
string_prepend (decl, "ModuleInfo for "); case 11:
string_setlength (decl, string_length (decl) - 1); if (strncmp (mangled, "__InterfaceZ", i+1) == 0)
mangled += i + 1; {
return mangled; /* The interface symbol for a given class. */
string_prepend (decl, "Interface for ");
string_setlength (decl, string_length (decl) - 1);
mangled += i;
return mangled;
}
break;
case 12:
if (strncmp (mangled, "__ModuleInfoZ", i+1) == 0)
{
/* The ModuleInfo symbol for a given module. */
string_prepend (decl, "ModuleInfo for ");
string_setlength (decl, string_length (decl) - 1);
mangled += i;
return mangled;
}
break;
} }
string_appendn (decl, mangled, i); string_appendn (decl, mangled, i);
......
...@@ -502,7 +502,7 @@ _D8demangle4test6__dtorMFZv ...@@ -502,7 +502,7 @@ _D8demangle4test6__dtorMFZv
demangle.test.~this() demangle.test.~this()
# #
--format=dlang --format=dlang
_D8demangle4test6__postblitMFZv _D8demangle4test10__postblitMFZv
demangle.test.this(this) demangle.test.this(this)
# #
--format=dlang --format=dlang
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment