|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
2007-10-03 Andrew Haley <aph@redhat.com>
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
PR java/33639
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
* class.c (mangled_classname): Detect and replace illegal
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
characters in assembly language symbols.
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
(gen_indirect_dispatch_tables): Call mangled_classname() on
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
the type.
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
--- gcc/java/class.c (revision 128980)
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+++ gcc/java/class.c (revision 128981)
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
@@ -314,10 +314,63 @@ identifier_subst (const tree old_id,
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
tree
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
mangled_classname (const char *prefix, tree type)
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
{
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ tree result;
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
tree ident = TYPE_NAME (type);
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
if (TREE_CODE (ident) != IDENTIFIER_NODE)
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
ident = DECL_NAME (ident);
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
- return identifier_subst (ident, prefix, '.', '_', "");
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ result = identifier_subst (ident, prefix, '.', '_', "");
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ /* Replace any characters that aren't in the set [0-9a-zA-Z_$] with
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ "_0xXX". Class names containing such chracters are uncommon, but
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ they do sometimes occur in class files. Without this check,
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ these names cause assembly errors.
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ There is a possibility that a real class name could conflict with
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ the identifier we generate, but it is unlikely and will
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ immediately be detected as an assembler error. At some point we
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ should do something more elaborate (perhaps using the full
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ unicode mangling scheme) in order to prevent such a conflict. */
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ {
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ int i;
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ const int len = IDENTIFIER_LENGTH (result);
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ const char *p = IDENTIFIER_POINTER (result);
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ int illegal_chars = 0;
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ /* Make two passes over the identifier. The first pass is merely
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ to count illegal characters; we need to do this in order to
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ allocate a buffer. */
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ for (i = 0; i < len; i++)
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ {
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ char c = p[i];
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ illegal_chars += (! ISALNUM (c) && c != '_' && c != '$');
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ /* And the second pass, which is rarely executed, does the
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ rewriting. */
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ if (illegal_chars != 0)
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ {
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ char *buffer = alloca (illegal_chars * 4 + len + 1);
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ int j;
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ for (i = 0, j = 0; i < len; i++)
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ {
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ char c = p[i];
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ if (! ISALNUM (c) && c != '_' && c != '$')
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ {
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ buffer[j++] = '_';
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ sprintf (&buffer[j], "0x%02x", c);
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ j += 4;
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ else
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ buffer[j++] = c;
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ buffer[j] = 0;
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ result = get_identifier (buffer);
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ }
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ return result;
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
}
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
tree
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
@@ -389,7 +442,7 @@ while (0)
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
void
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
gen_indirect_dispatch_tables (tree type)
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
{
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
- const char *typename = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
+ const char *typename = IDENTIFIER_POINTER (mangled_classname ("", type));
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
{
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
tree field = NULL;
|
|
![](https://seccdn.libravatar.org/avatar/134c60e534a993fcaf7da4634f4199430a0cdb8c7235fa894d5ee95eb7cc444d?s=16&d=retro) |
70a3a1d |
char *buf = alloca (strlen (typename) + strlen ("_catch_classes_") + 1);
|