* write.c (BFD_FAST_SECTION_FILL): Remove unused macro.
(TC_ADJUST_RELOC_COUNT): Tweak param name. (TC_FORCE_RELOCATION, TC_FORCE_RELOCATION_SECTION): Likewise. (TC_FIX_ADJUSTABLE, MD_PCREL_FROM_SECTION): Likewise. (RELOC_ENUM): Define. (fix_new_internal): Use RELOC_ENUM. (fix_new, fix_new_exp): Likewise. (adjust_reloc_syms): Comment. Remove unnecessary tests on sym != NULL. Replace gotos with continue. (write_relocs): Formatting. Avoid symbol loops in RELOC_EXPANSION_POSSIBLE case too. Report bfd_reloc_outofrange errors, and error number in other cases. (fixup_segment): Remove param names from prototype. Rename "this_segment_type" to "this_segment". Update linkrelax comment. Remove "size, "place" and "where" local vars. Formatting. Update "no symbol" comment. Remove #if 0 and #if 1.
This commit is contained in:
parent
c89e8944a4
commit
df44284ec4
@ -1,5 +1,22 @@
|
||||
2002-08-28 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* write.c (BFD_FAST_SECTION_FILL): Remove unused macro.
|
||||
(TC_ADJUST_RELOC_COUNT): Tweak param name.
|
||||
(TC_FORCE_RELOCATION, TC_FORCE_RELOCATION_SECTION): Likewise.
|
||||
(TC_FIX_ADJUSTABLE, MD_PCREL_FROM_SECTION): Likewise.
|
||||
(RELOC_ENUM): Define.
|
||||
(fix_new_internal): Use RELOC_ENUM.
|
||||
(fix_new, fix_new_exp): Likewise.
|
||||
(adjust_reloc_syms): Comment. Remove unnecessary tests on sym != NULL.
|
||||
Replace gotos with continue.
|
||||
(write_relocs): Formatting. Avoid symbol loops in
|
||||
RELOC_EXPANSION_POSSIBLE case too. Report bfd_reloc_outofrange
|
||||
errors, and error number in other cases.
|
||||
(fixup_segment): Remove param names from prototype. Rename
|
||||
"this_segment_type" to "this_segment". Update linkrelax comment.
|
||||
Remove "size, "place" and "where" local vars. Formatting. Update
|
||||
"no symbol" comment. Remove #if 0 and #if 1.
|
||||
|
||||
* app.c (do_scrub_chars): Don't test IGNORE_NONSTANDARD_ESCAPES. Tidy.
|
||||
|
||||
2002-08-27 Alan Modra <amodra@bigpond.net.au>
|
||||
|
177
gas/write.c
177
gas/write.c
@ -28,20 +28,16 @@
|
||||
#include "output-file.h"
|
||||
#include "dwarf2dbg.h"
|
||||
|
||||
/* This looks like a good idea. Let's try turning it on always, for now. */
|
||||
#undef BFD_FAST_SECTION_FILL
|
||||
#define BFD_FAST_SECTION_FILL
|
||||
|
||||
#ifndef TC_ADJUST_RELOC_COUNT
|
||||
#define TC_ADJUST_RELOC_COUNT(FIXP,COUNT)
|
||||
#define TC_ADJUST_RELOC_COUNT(FIX, COUNT)
|
||||
#endif
|
||||
|
||||
#ifndef TC_FORCE_RELOCATION
|
||||
#define TC_FORCE_RELOCATION(FIXP) 0
|
||||
#define TC_FORCE_RELOCATION(FIX) 0
|
||||
#endif
|
||||
|
||||
#ifndef TC_FORCE_RELOCATION_SECTION
|
||||
#define TC_FORCE_RELOCATION_SECTION(FIXP,SEG) TC_FORCE_RELOCATION(FIXP)
|
||||
#define TC_FORCE_RELOCATION_SECTION(FIX, SEG) TC_FORCE_RELOCATION (FIX)
|
||||
#endif
|
||||
|
||||
#ifndef TC_LINKRELAX_FIXUP
|
||||
@ -49,7 +45,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef TC_FIX_ADJUSTABLE
|
||||
#define TC_FIX_ADJUSTABLE(fix) 1
|
||||
#define TC_FIX_ADJUSTABLE(FIX) 1
|
||||
#endif
|
||||
|
||||
#ifndef TC_FINALIZE_SYMS_BEFORE_SIZE_SEG
|
||||
@ -57,7 +53,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef MD_PCREL_FROM_SECTION
|
||||
#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from(FIXP)
|
||||
#define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from (FIX)
|
||||
#endif
|
||||
|
||||
#ifndef WORKING_DOT_WORD
|
||||
@ -109,18 +105,17 @@ int magic_number_for_object_file = DEFAULT_MAGIC_NUMBER_FOR_OBJECT_FILE;
|
||||
static int n_fixups;
|
||||
|
||||
#ifdef BFD_ASSEMBLER
|
||||
static fixS *fix_new_internal PARAMS ((fragS *, int where, int size,
|
||||
symbolS *add, symbolS *sub,
|
||||
offsetT offset, int pcrel,
|
||||
bfd_reloc_code_real_type r_type));
|
||||
#define RELOC_ENUM enum bfd_reloc_code_real
|
||||
#else
|
||||
#define RELOC_ENUM int
|
||||
#endif
|
||||
|
||||
static fixS *fix_new_internal PARAMS ((fragS *, int where, int size,
|
||||
symbolS *add, symbolS *sub,
|
||||
offsetT offset, int pcrel,
|
||||
int r_type));
|
||||
#endif
|
||||
RELOC_ENUM r_type));
|
||||
#if defined (BFD_ASSEMBLER) || (!defined (BFD) && !defined (OBJ_VMS))
|
||||
static long fixup_segment PARAMS ((fixS * fixP, segT this_segment_type));
|
||||
static long fixup_segment PARAMS ((fixS *, segT));
|
||||
#endif
|
||||
static relax_addressT relax_align PARAMS ((relax_addressT addr, int align));
|
||||
#if defined (BFD_ASSEMBLER) || ! defined (BFD)
|
||||
@ -158,11 +153,7 @@ fix_new_internal (frag, where, size, add_symbol, sub_symbol, offset, pcrel,
|
||||
symbolS *sub_symbol; /* X_op_symbol. */
|
||||
offsetT offset; /* X_add_number. */
|
||||
int pcrel; /* TRUE if PC-relative relocation. */
|
||||
#ifdef BFD_ASSEMBLER
|
||||
bfd_reloc_code_real_type r_type; /* Relocation type. */
|
||||
#else
|
||||
int r_type; /* Relocation type. */
|
||||
#endif
|
||||
RELOC_ENUM r_type ATTRIBUTE_UNUSED; /* Relocation type. */
|
||||
{
|
||||
fixS *fixP;
|
||||
|
||||
@ -253,11 +244,7 @@ fix_new (frag, where, size, add_symbol, offset, pcrel, r_type)
|
||||
symbolS *add_symbol; /* X_add_symbol. */
|
||||
offsetT offset; /* X_add_number. */
|
||||
int pcrel; /* TRUE if PC-relative relocation. */
|
||||
#ifdef BFD_ASSEMBLER
|
||||
bfd_reloc_code_real_type r_type; /* Relocation type. */
|
||||
#else
|
||||
int r_type; /* Relocation type. */
|
||||
#endif
|
||||
RELOC_ENUM r_type; /* Relocation type. */
|
||||
{
|
||||
return fix_new_internal (frag, where, size, add_symbol,
|
||||
(symbolS *) NULL, offset, pcrel, r_type);
|
||||
@ -274,11 +261,7 @@ fix_new_exp (frag, where, size, exp, pcrel, r_type)
|
||||
int size; /* 1, 2, or 4 usually. */
|
||||
expressionS *exp; /* Expression. */
|
||||
int pcrel; /* TRUE if PC-relative relocation. */
|
||||
#ifdef BFD_ASSEMBLER
|
||||
bfd_reloc_code_real_type r_type; /* Relocation type. */
|
||||
#else
|
||||
int r_type; /* Relocation type. */
|
||||
#endif
|
||||
RELOC_ENUM r_type; /* Relocation type. */
|
||||
{
|
||||
symbolS *add = NULL;
|
||||
symbolS *sub = NULL;
|
||||
@ -735,6 +718,9 @@ dump_section_relocs (abfd, sec, stream_)
|
||||
#define EMIT_SECTION_SYMBOLS 1
|
||||
#endif
|
||||
|
||||
/* This pass over fixups decides whether symbols can be replaced with
|
||||
section symbols. */
|
||||
|
||||
static void
|
||||
adjust_reloc_syms (abfd, sec, xxx)
|
||||
bfd *abfd ATTRIBUTE_UNUSED;
|
||||
@ -769,29 +755,27 @@ adjust_reloc_syms (abfd, sec, xxx)
|
||||
point. It is possible to see unresolved expression
|
||||
symbols, though, since they are not in the regular symbol
|
||||
table. */
|
||||
if (sym != NULL)
|
||||
resolve_symbol_value (sym);
|
||||
resolve_symbol_value (sym);
|
||||
|
||||
if (fixp->fx_subsy != NULL)
|
||||
resolve_symbol_value (fixp->fx_subsy);
|
||||
|
||||
/* If this symbol is equated to an undefined symbol, convert
|
||||
the fixup to being against that symbol. */
|
||||
if (sym != NULL && symbol_equated_reloc_p (sym))
|
||||
if (symbol_equated_reloc_p (sym))
|
||||
{
|
||||
fixp->fx_offset += symbol_get_value_expression (sym)->X_add_number;
|
||||
sym = symbol_get_value_expression (sym)->X_add_symbol;
|
||||
fixp->fx_addsy = sym;
|
||||
}
|
||||
|
||||
if (sym != NULL && symbol_mri_common_p (sym))
|
||||
if (symbol_mri_common_p (sym))
|
||||
{
|
||||
/* These symbols are handled specially in fixup_segment. */
|
||||
goto done;
|
||||
continue;
|
||||
}
|
||||
|
||||
symsec = S_GET_SEGMENT (sym);
|
||||
|
||||
if (symsec == NULL)
|
||||
abort ();
|
||||
|
||||
@ -807,7 +791,7 @@ adjust_reloc_syms (abfd, sec, xxx)
|
||||
symbol_mark_used_in_reloc (fixp->fx_subsy);
|
||||
#endif
|
||||
}
|
||||
goto done;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* If it's one of these sections, assume the symbol is
|
||||
@ -826,7 +810,7 @@ adjust_reloc_syms (abfd, sec, xxx)
|
||||
if (fixp->fx_subsy)
|
||||
symbol_mark_used_in_reloc (fixp->fx_subsy);
|
||||
#endif
|
||||
goto done;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Don't try to reduce relocs which refer to non-local symbols
|
||||
@ -859,7 +843,7 @@ adjust_reloc_syms (abfd, sec, xxx)
|
||||
if (fixp->fx_subsy != NULL)
|
||||
symbol_mark_used_in_reloc (fixp->fx_subsy);
|
||||
#endif
|
||||
goto done;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
@ -868,7 +852,7 @@ adjust_reloc_syms (abfd, sec, xxx)
|
||||
if (symbol_section_p (sym))
|
||||
{
|
||||
symbol_mark_used_in_reloc (fixp->fx_addsy);
|
||||
goto done;
|
||||
continue;
|
||||
}
|
||||
|
||||
#ifdef BFD_ASSEMBLER
|
||||
@ -879,22 +863,22 @@ adjust_reloc_syms (abfd, sec, xxx)
|
||||
if (S_IS_WEAK (sym))
|
||||
{
|
||||
symbol_mark_used_in_reloc (fixp->fx_addsy);
|
||||
goto done;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Never adjust a reloc against local symbol in a merge section
|
||||
with non-zero addend. */
|
||||
if ((symsec->flags & SEC_MERGE) && fixp->fx_offset)
|
||||
if ((symsec->flags & SEC_MERGE) != 0 && fixp->fx_offset != 0)
|
||||
{
|
||||
symbol_mark_used_in_reloc (fixp->fx_addsy);
|
||||
goto done;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Never adjust a reloc against TLS local symbol. */
|
||||
if (symsec->flags & SEC_THREAD_LOCAL)
|
||||
if ((symsec->flags & SEC_THREAD_LOCAL) != 0)
|
||||
{
|
||||
symbol_mark_used_in_reloc (fixp->fx_addsy);
|
||||
goto done;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -904,7 +888,7 @@ adjust_reloc_syms (abfd, sec, xxx)
|
||||
if (! obj_fix_adjustable (fixp))
|
||||
{
|
||||
symbol_mark_used_in_reloc (fixp->fx_addsy);
|
||||
goto done;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -915,7 +899,7 @@ adjust_reloc_syms (abfd, sec, xxx)
|
||||
if (! tc_fix_adjustable (fixp))
|
||||
{
|
||||
symbol_mark_used_in_reloc (fixp->fx_addsy);
|
||||
goto done;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -933,24 +917,14 @@ adjust_reloc_syms (abfd, sec, xxx)
|
||||
fprintf (stderr, "\nadjusted fixup:\n");
|
||||
print_fixup (fixp);
|
||||
#endif
|
||||
|
||||
done:
|
||||
;
|
||||
}
|
||||
#if 1 /* def RELOC_REQUIRES_SYMBOL */
|
||||
else
|
||||
{
|
||||
/* There was no symbol required by this relocation. However,
|
||||
BFD doesn't really handle relocations without symbols well.
|
||||
(At least, the COFF support doesn't.) So for now we fake up
|
||||
a local symbol in the absolute section. */
|
||||
|
||||
So fake up a local symbol in the absolute section. */
|
||||
fixp->fx_addsy = section_symbol (absolute_section);
|
||||
#if 0
|
||||
fixp->fx_addsy->sy_used_in_reloc = 1;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
dump_section_relocs (abfd, sec, stderr);
|
||||
}
|
||||
@ -1038,10 +1012,12 @@ write_relocs (abfd, sec, xxx)
|
||||
case bfd_reloc_ok:
|
||||
break;
|
||||
case bfd_reloc_overflow:
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line, _("relocation overflow"));
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
_("relocation overflow"));
|
||||
break;
|
||||
case bfd_reloc_outofrange:
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line, _("relocation out of range"));
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
_("relocation out of range"));
|
||||
break;
|
||||
default:
|
||||
as_fatal (_("%s:%u: bad return from bfd_install_relocation: %x"),
|
||||
@ -1074,7 +1050,17 @@ write_relocs (abfd, sec, xxx)
|
||||
rather than the former. */
|
||||
sym = fixp->fx_addsy;
|
||||
while (symbol_equated_reloc_p (sym))
|
||||
sym = symbol_get_value_expression (sym)->X_add_symbol;
|
||||
{
|
||||
symbolS *n;
|
||||
|
||||
/* We must avoid looping, as that can occur with a badly
|
||||
written program. */
|
||||
n = symbol_get_value_expression (sym)->X_add_symbol;
|
||||
if (n == sym)
|
||||
break;
|
||||
fixp->fx_offset += symbol_get_value_expression (sym)->X_add_number;
|
||||
sym = n;
|
||||
}
|
||||
fixp->fx_addsy = sym;
|
||||
|
||||
reloc = tc_gen_reloc (sec, fixp);
|
||||
@ -1103,9 +1089,13 @@ write_relocs (abfd, sec, xxx)
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
_("relocation overflow"));
|
||||
break;
|
||||
case bfd_reloc_outofrange:
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
_("relocation out of range"));
|
||||
break;
|
||||
default:
|
||||
as_fatal (_("%s:%u: bad return from bfd_install_relocation"),
|
||||
fixp->fx_file, fixp->fx_line);
|
||||
as_fatal (_("%s:%u: bad return from bfd_install_relocation: %x"),
|
||||
fixp->fx_file, fixp->fx_line, s);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2581,29 +2571,25 @@ relax_segment (segment_frag_root, segment)
|
||||
These will be output later by emit_relocations(). */
|
||||
|
||||
static long
|
||||
fixup_segment (fixP, this_segment_type)
|
||||
register fixS *fixP;
|
||||
segT this_segment_type; /* N_TYPE bits for segment. */
|
||||
fixup_segment (fixP, this_segment)
|
||||
fixS *fixP;
|
||||
segT this_segment;
|
||||
{
|
||||
long seg_reloc_count = 0;
|
||||
symbolS *add_symbolP;
|
||||
symbolS *sub_symbolP;
|
||||
valueT add_number;
|
||||
int size;
|
||||
char *place;
|
||||
long where;
|
||||
int pcrel, plt;
|
||||
fragS *fragP;
|
||||
segT add_symbol_segment = absolute_section;
|
||||
|
||||
/* If the linker is doing the relaxing, we must not do any fixups.
|
||||
|
||||
Well, strictly speaking that's not true -- we could do any that are
|
||||
PC-relative and don't cross regions that could change size. And for the
|
||||
i960 (the only machine for which we've got a relaxing linker right now),
|
||||
we might be able to turn callx/callj into bal anyways in cases where we
|
||||
know the maximum displacement. */
|
||||
if (linkrelax && TC_LINKRELAX_FIXUP (this_segment_type))
|
||||
Well, strictly speaking that's not true -- we could do any that
|
||||
are PC-relative and don't cross regions that could change size.
|
||||
And for the i960 we might be able to turn callx/callj into bal
|
||||
anyways in cases where we know the maximum displacement. */
|
||||
if (linkrelax && TC_LINKRELAX_FIXUP (this_segment))
|
||||
{
|
||||
for (; fixP; fixP = fixP->fx_next)
|
||||
seg_reloc_count++;
|
||||
@ -2620,12 +2606,9 @@ fixup_segment (fixP, this_segment_type)
|
||||
|
||||
fragP = fixP->fx_frag;
|
||||
know (fragP);
|
||||
where = fixP->fx_where;
|
||||
place = fragP->fr_literal + where;
|
||||
size = fixP->fx_size;
|
||||
add_symbolP = fixP->fx_addsy;
|
||||
#ifdef TC_VALIDATE_FIX
|
||||
TC_VALIDATE_FIX (fixP, this_segment_type, skip);
|
||||
TC_VALIDATE_FIX (fixP, this_segment, skip);
|
||||
#endif
|
||||
sub_symbolP = fixP->fx_subsy;
|
||||
add_number = fixP->fx_offset;
|
||||
@ -2664,7 +2647,7 @@ fixup_segment (fixP, this_segment_type)
|
||||
fixP->fx_subsy = NULL;
|
||||
}
|
||||
else if (pcrel
|
||||
&& S_GET_SEGMENT (sub_symbolP) == this_segment_type)
|
||||
&& S_GET_SEGMENT (sub_symbolP) == this_segment)
|
||||
{
|
||||
/* Should try converting to a constant. */
|
||||
goto bad_sub_reloc;
|
||||
@ -2696,7 +2679,7 @@ fixup_segment (fixP, this_segment_type)
|
||||
&& 0
|
||||
#endif
|
||||
&& pcrel)
|
||||
add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment_type);
|
||||
add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment);
|
||||
|
||||
add_symbolP = NULL;
|
||||
pcrel = 0; /* No further pcrel processing. */
|
||||
@ -2704,7 +2687,7 @@ fixup_segment (fixP, this_segment_type)
|
||||
/* Let the target machine make the final determination
|
||||
as to whether or not a relocation will be needed to
|
||||
handle this fixup. */
|
||||
if (!TC_FORCE_RELOCATION_SECTION (fixP, this_segment_type))
|
||||
if (!TC_FORCE_RELOCATION_SECTION (fixP, this_segment))
|
||||
{
|
||||
fixP->fx_pcrel = 0;
|
||||
fixP->fx_addsy = NULL;
|
||||
@ -2721,7 +2704,7 @@ fixup_segment (fixP, this_segment_type)
|
||||
add_number -= S_GET_VALUE (sub_symbolP);
|
||||
|
||||
#ifdef DIFF_EXPR_OK
|
||||
else if (S_GET_SEGMENT (sub_symbolP) == this_segment_type)
|
||||
else if (S_GET_SEGMENT (sub_symbolP) == this_segment)
|
||||
{
|
||||
/* Make it pc-relative. */
|
||||
if (0
|
||||
@ -2735,7 +2718,7 @@ fixup_segment (fixP, this_segment_type)
|
||||
|| !pcrel)
|
||||
{
|
||||
add_number += MD_PCREL_FROM_SECTION (fixP,
|
||||
this_segment_type);
|
||||
this_segment);
|
||||
pcrel = 1;
|
||||
fixP->fx_pcrel = 1;
|
||||
}
|
||||
@ -2764,7 +2747,7 @@ fixup_segment (fixP, this_segment_type)
|
||||
else
|
||||
{
|
||||
char buf[50];
|
||||
sprint_value (buf, fragP->fr_address + where);
|
||||
sprint_value (buf, fragP->fr_address + fixP->fx_where);
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("subtraction of two symbols in different sections `%s' {%s section} - `%s' {%s section} at file address %s"),
|
||||
S_GET_NAME (add_symbolP),
|
||||
@ -2778,7 +2761,7 @@ fixup_segment (fixP, this_segment_type)
|
||||
|
||||
if (add_symbolP)
|
||||
{
|
||||
if (add_symbol_segment == this_segment_type && pcrel && !plt
|
||||
if (add_symbol_segment == this_segment && pcrel && !plt
|
||||
&& TC_RELOC_RTSYM_LOC_FIXUP (fixP))
|
||||
{
|
||||
/* This fixup was made when the symbol's segment was
|
||||
@ -2794,7 +2777,7 @@ fixup_segment (fixP, this_segment_type)
|
||||
#endif /* TC_I960 */
|
||||
|
||||
add_number += S_GET_VALUE (add_symbolP);
|
||||
add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment_type);
|
||||
add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment);
|
||||
/* Lie. Don't want further pcrel processing. */
|
||||
pcrel = 0;
|
||||
|
||||
@ -2868,7 +2851,7 @@ fixup_segment (fixP, this_segment_type)
|
||||
|
||||
if (pcrel)
|
||||
{
|
||||
add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment_type);
|
||||
add_number -= MD_PCREL_FROM_SECTION (fixP, this_segment);
|
||||
if (add_symbolP == 0)
|
||||
{
|
||||
#ifndef BFD_ASSEMBLER
|
||||
@ -2882,28 +2865,28 @@ fixup_segment (fixP, this_segment_type)
|
||||
}
|
||||
|
||||
if (!fixP->fx_done)
|
||||
md_apply_fix3 (fixP, & add_number, this_segment_type);
|
||||
md_apply_fix3 (fixP, &add_number, this_segment);
|
||||
|
||||
if (!fixP->fx_bit_fixP && !fixP->fx_no_overflow && size > 0)
|
||||
if (!fixP->fx_bit_fixP && !fixP->fx_no_overflow && fixP->fx_size != 0)
|
||||
{
|
||||
if ((size_t) size < sizeof (valueT))
|
||||
if (fixP->fx_size < sizeof (valueT))
|
||||
{
|
||||
valueT mask;
|
||||
|
||||
mask = 0;
|
||||
mask--; /* Set all bits to one. */
|
||||
mask <<= size * 8 - (fixP->fx_signed ? 1 : 0);
|
||||
mask <<= fixP->fx_size * 8 - (fixP->fx_signed ? 1 : 0);
|
||||
if ((add_number & mask) != 0 && (add_number & mask) != mask)
|
||||
{
|
||||
char buf[50], buf2[50];
|
||||
sprint_value (buf, fragP->fr_address + where);
|
||||
sprint_value (buf, fragP->fr_address + fixP->fx_where);
|
||||
if (add_number > 1000)
|
||||
sprint_value (buf2, add_number);
|
||||
else
|
||||
sprintf (buf2, "%ld", (long) add_number);
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("value of %s too large for field of %d bytes at %s"),
|
||||
buf2, size, buf);
|
||||
buf2, fixP->fx_size, buf);
|
||||
} /* Generic error checking. */
|
||||
}
|
||||
#ifdef WARN_SIGNED_OVERFLOW_WORD
|
||||
@ -2911,12 +2894,12 @@ fixup_segment (fixP, this_segment_type)
|
||||
number. We already know it is not too negative. This is to
|
||||
catch over-large switches generated by gcc on the 68k. */
|
||||
if (!flag_signed_overflow_ok
|
||||
&& size == 2
|
||||
&& fixP->fx_size == 2
|
||||
&& add_number > 0x7fff)
|
||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||
_("signed .word overflow; switch may be too large; %ld at 0x%lx"),
|
||||
(long) add_number,
|
||||
(unsigned long) (fragP->fr_address + where));
|
||||
(long) (fragP->fr_address + fixP->fx_where));
|
||||
#endif
|
||||
} /* Not a bit fix. */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user