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