Hi Martin, Asher Gordon <[email protected]> writes:
> Martin Sebor <[email protected]> writes: > >> Unfortunately, attributes don't have locations (yet). > > Hmm, well maybe I could implement that. I'm not very familiar with the > GCC source (this is my first patch), but I'll see if I can figure it > out. It would probably be useful for other warnings/errors too. Well, I've been trying to implement source locations for IDENTIFIER_NODEs. But I ran into some very strange problems. If I add a 'location_t' for 'struct tree_identifier' like this:
diff --git a/gcc/tree-core.h b/gcc/tree-core.h
index 8c5a2e3c404..b3c46d3c0d3 100644
--- a/gcc/tree-core.h
+++ b/gcc/tree-core.h
@@ -1423,6 +1423,7 @@ struct GTY(()) tree_poly_int_cst {
struct GTY(()) tree_identifier {
struct tree_common common;
struct ht_identifier id;
+ location_t locus;
};
struct GTY(()) tree_list {
everything works fine. However, if I then try to use the 'location_t' I just added, like this:
diff --git a/gcc/c-family/c-lex.c b/gcc/c-family/c-lex.c
index b1cef2345f4..d2d86c5f78a 100644
--- a/gcc/c-family/c-lex.c
+++ b/gcc/c-family/c-lex.c
@@ -465,6 +465,7 @@ c_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags,
case CPP_NAME:
*value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node.node));
+ IDENTIFIER_SOURCE_LOCATION (*value) = *loc;
break;
case CPP_NUMBER:
diff --git a/gcc/tree.h b/gcc/tree.h
index a74872f5f3e..1e5a4fba0ed 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -1069,6 +1069,16 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
#define IDENTIFIER_HASH_VALUE(NODE) \
(IDENTIFIER_NODE_CHECK (NODE)->identifier.id.hash_value)
+/* The source location in which the identifier appears. */
+#define IDENTIFIER_SOURCE_LOCATION(NODE) \
+ (IDENTIFIER_NODE_CHECK (NODE)->identifier.locus)
+#define IDENTIFIER_SOURCE_FILE(NODE)\
+ LOCATION_FILE (IDENTIFIER_SOURCE_LOCATION (NODE))
+#define IDENTIFIER_SOURCE_LINE(NODE)\
+ LOCATION_LINE (IDENTIFIER_SOURCE_LOCATION (NODE))
+#define IDENTIFIER_SOURCE_COLUMN(NODE)\
+ LOCATION_COLUMN (IDENTIFIER_SOURCE_LOCATION (NODE))
+
/* Translate a hash table identifier pointer to a tree_identifier
pointer, and vice versa. */
then lots of ICEs occur. Or, if I don't use IDENTIFIER_SOURCE_LOCATION, but add 'locus' before 'id' instead of after it, like this:
diff --git a/gcc/tree-core.h b/gcc/tree-core.h
index 8c5a2e3c404..b3c46d3c0d3 100644
--- a/gcc/tree-core.h
+++ b/gcc/tree-core.h
@@ -1423,6 +1423,7 @@ struct GTY(()) tree_poly_int_cst {
struct GTY(()) tree_identifier {
struct tree_common common;
+ location_t locus;
struct ht_identifier id;
};
struct GTY(()) tree_list {
then, again, lots of ICEs occur. My best guess for why the ICEs occur, is that perhaps there is a 'struct' with a similar structure to 'struct tree_identifier', and pointers to these 'struct's are being casted to each other. Something like this, sort of:
/* This is analogous to the unknown structure, to and from which
'struct tree_identifier' is being casted. */
struct foo {
int i;
float f;
};
/* This is analogous to the modified 'struct tree_identifier' with the
'location_t' added at the end. */
struct end {
int i;
float f;
const char *s; /* Analogous to 'locus' in 'struct tree_identifier' */
};
/* This is analogous to the modified 'struct tree_identifier' with the
'location_t' added in the middle. */
struct middle {
int i;
const char *s; /* Analogous to 'locus' in 'struct tree_identifier' */
float f;
};
int
main (void)
{
struct foo foo, *foo_p = &foo;
struct end *end_p;
struct middle *middle_p;
/* This works, as long as 's' is not used. */
end_p = (struct end *) foo_p;
/* But as soon as 's' is used, it invokes UB. This is analogous to
the IDENTIFIER_SOURCE_LOCATION in c_lex_with_flags. */
end_p->s = "hello";
/* This works, as long as neither 'f' (analogous to 'id') nor 's' is
used. */
middle_p = (struct middle *) foo_p;
/* But, doubtless, 'f' ('id') will be used somewhere... */
middle_p->f = 42.0;
return 0; /* if we're lucky... */
}
Do you think something like that is possible? And if so, where might it
occur? Or maybe the wrong member of 'union tree_node' is being used
somewhere? But that seems unlikely, since I configured with
--enable-checking...
Thanks,
Asher
--
One picture is worth 128K words.
--------
I prefer to send and receive mail encrypted. Please send me your
public key, and if you do not have my public key, please let me
know. Thanks.
GPG fingerprint: 38F3 975C D173 4037 B397 8095 D4C9 C4FC 5460 8E68
signature.asc
Description: PGP signature
