* dwarf2read.c (struct dwarf2_cu) <checked_producer,

producer_is_gxx_lt_4_6>: New fields.
	(producer_is_gxx_lt_4_6): Use and update producer cache fields.
This commit is contained in:
Tom Tromey
2012-03-09 20:17:32 +00:00
parent a48e046c37
commit ba919b5861
2 changed files with 31 additions and 10 deletions

View File

@ -1,3 +1,9 @@
2012-03-09 Tom Tromey <tromey@redhat.com>
* dwarf2read.c (struct dwarf2_cu) <checked_producer,
producer_is_gxx_lt_4_6>: New fields.
(producer_is_gxx_lt_4_6): Use and update producer cache fields.
2012-03-09 Tom Tromey <tromey@redhat.com> 2012-03-09 Tom Tromey <tromey@redhat.com>
* dwarf2read.c (dwarf2_attr): Avoid tail-recursive call. * dwarf2read.c (dwarf2_attr): Avoid tail-recursive call.

View File

@ -383,6 +383,13 @@ struct dwarf2_cu
any location list and still facing inlining issues if handled as any location list and still facing inlining issues if handled as
unoptimized code. For a future better test see GCC PR other/32998. */ unoptimized code. For a future better test see GCC PR other/32998. */
unsigned int has_loclist : 1; unsigned int has_loclist : 1;
/* These cache the results of producer_is_gxx_lt_4_6.
CHECKED_PRODUCER is set if PRODUCER_IS_GXX_LT_4_6 is valid. This
information is cached because profiling CU expansion showed
excessive time spent in producer_is_gxx_lt_4_6. */
unsigned int checked_producer : 1;
unsigned int producer_is_gxx_lt_4_6 : 1;
}; };
/* Persistent data held for a compilation unit, even when not /* Persistent data held for a compilation unit, even when not
@ -6826,6 +6833,7 @@ producer_is_gxx_lt_4_6 (struct dwarf2_cu *cu)
{ {
const char *cs; const char *cs;
int major, minor, release; int major, minor, release;
int result = 0;
if (cu->producer == NULL) if (cu->producer == NULL)
{ {
@ -6841,26 +6849,33 @@ producer_is_gxx_lt_4_6 (struct dwarf2_cu *cu)
return 0; return 0;
} }
if (cu->checked_producer)
return cu->producer_is_gxx_lt_4_6;
/* Skip any identifier after "GNU " - such as "C++" or "Java". */ /* Skip any identifier after "GNU " - such as "C++" or "Java". */
if (strncmp (cu->producer, "GNU ", strlen ("GNU ")) != 0) if (strncmp (cu->producer, "GNU ", strlen ("GNU ")) != 0)
{ {
/* For non-GCC compilers expect their behavior is DWARF version /* For non-GCC compilers expect their behavior is DWARF version
compliant. */ compliant. */
return 0;
} }
cs = &cu->producer[strlen ("GNU ")]; else
while (*cs && !isdigit (*cs))
cs++;
if (sscanf (cs, "%d.%d.%d", &major, &minor, &release) != 3)
{ {
/* Not recognized as GCC. */ cs = &cu->producer[strlen ("GNU ")];
while (*cs && !isdigit (*cs))
return 0; cs++;
if (sscanf (cs, "%d.%d.%d", &major, &minor, &release) != 3)
{
/* Not recognized as GCC. */
}
else
result = major < 4 || (major == 4 && minor < 6);
} }
return major < 4 || (major == 4 && minor < 6); cu->checked_producer = 1;
cu->producer_is_gxx_lt_4_6 = result;
return result;
} }
/* Return the default accessibility type if it is not overriden by /* Return the default accessibility type if it is not overriden by