Commit 70e06f23 by Mike Stump

libgcc2.c (find_exception_table): Fix to logic to deal with functions that are…

libgcc2.c (find_exception_table): Fix to logic to deal with functions that are in their own section...

	* libgcc2.c (find_exception_table): Fix to logic to deal with
 	functions that are in their own section, such as template
 	instantiations, that cause overlapping EH tables.

From-SVN: r13830
parent ebf0d025
......@@ -3117,18 +3117,6 @@ struct exception_table_node {
static struct exception_table_node *exception_table_list;
static exception_table *
find_exception_table (void *pc)
{
register struct exception_table_node *table = exception_table_list;
for ( ; table != 0; table = table->next)
{
if (table->start <= pc && table->end > pc)
return table->table;
}
return 0;
}
/* this routine takes a pc, and the address of the exception handler associated
with the closest exception table handler entry associated with that PC,
or 0 if there are no table entries the PC fits in. The algorithm works
......@@ -3156,15 +3144,24 @@ find_exception_table (void *pc)
void *
__find_first_exception_table_match (void *pc)
{
exception_table *table = find_exception_table (pc);
int pos = 0;
int best = 0;
if (table == 0)
return (void *) 0;
register struct exception_table_node *tnp;
register exception_table *table;
int pos;
int best;
#if 0
printf ("find_first_exception_table_match (): pc = %x!\n", pc);
#endif
for (tnp = exception_table_list; tnp != 0; tnp = tnp->next)
{
if (tnp->start > pc || tnp->end <= pc)
continue;
table = tnp->table;
pos = 0;
best = 0;
#if 0
/* We can't do this yet, as we don't know that the table is sorted. */
do {
......@@ -3187,8 +3184,8 @@ __find_first_exception_table_match (void *pc)
while (table[++pos].exception_handler != (void *) -1) {
if (table[pos].start <= pc && table[pos].end > pc)
{
/* This can apply. Make sure it is better or as good as the previous
best. */
/* This can apply. Make sure it is better or as good as
the previous best. */
/* The best one ends first. */
if (best == 0 || (table[pos].end <= table[best].end
/* The best one starts last. */
......@@ -3199,6 +3196,7 @@ __find_first_exception_table_match (void *pc)
if (best != 0)
return table[best].exception_handler;
#endif
}
#if 0
printf ("find_first_eh_table_match (): else: returning NULL!\n");
......
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