Warning and partial fix for gcc -freorder-blocks-and-partition related problem.

PR 994
* config/tc-ia64.c (slot_index): Revert last change.  If first_frag
is NULL, then emit a warning, and return the current index.
This commit is contained in:
Jim Wilson
2005-06-08 19:47:59 +00:00
parent 6b5d3a4d35
commit 4dddc1d199
2 changed files with 27 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2005-06-08 James E Wilson <wilson@specifixinc.com>
PR 994
* config/tc-ia64.c (slot_index): Revert last change. If first_frag
is NULL, then emit a warning, and return the current index.
2005-06-08 Tomas Hurka <tom@hukatronic.cz> 2005-06-08 Tomas Hurka <tom@hukatronic.cz>
PR991 PR991

View File

@ -2655,7 +2655,7 @@ slot_index (slot_addr, slot_frag, first_addr, first_frag, before_relax)
/* If the two addresses are in different frags, then we need to add in /* If the two addresses are in different frags, then we need to add in
the remaining size of this frag, and then the entire size of intermediate the remaining size of this frag, and then the entire size of intermediate
frags. */ frags. */
while (first_frag != NULL && slot_frag != first_frag) while (slot_frag != first_frag)
{ {
unsigned long start_addr = (unsigned long) &first_frag->fr_literal; unsigned long start_addr = (unsigned long) &first_frag->fr_literal;
@ -2708,6 +2708,26 @@ slot_index (slot_addr, slot_frag, first_addr, first_frag, before_relax)
/* Move to the beginning of the next frag. */ /* Move to the beginning of the next frag. */
first_frag = first_frag->fr_next; first_frag = first_frag->fr_next;
first_addr = (unsigned long) &first_frag->fr_literal; first_addr = (unsigned long) &first_frag->fr_literal;
/* This can happen if there is section switching in the middle of a
function, causing the frag chain for the function to be broken. */
if (first_frag == NULL)
{
/* We get six warnings for one problem, because of the loop in
fixup_unw_records, and because fixup_unw_records is called 3
times: once before creating the variant frag, once to estimate
its size, and once to relax it. This is unreasonable, so we use
a static var to make sure we only emit the warning once. */
static int warned = 0;
if (!warned)
{
as_warn ("Corrupted unwind info due to unsupported section switching");
warned = 1;
}
return index;
}
} }
/* Add in the used part of the last frag. */ /* Add in the used part of the last frag. */