Tue Jul 14 12:33:44 1998 Chris Torek <torek@bsdi.com>

* config/tc-sparc.c (log2): New static function.
	(s_reserve): Use log2 to convert alignment before calling
	record_alignment.
	(s_common): Use log2 to convert alignment before calling
	record_alignment and frag_align.
	(sparc_cons_align): Use log2.
This commit is contained in:
Ian Lance Taylor 1998-07-14 16:44:28 +00:00
parent 04a92367bc
commit 4a07363fae
2 changed files with 75 additions and 30 deletions

View file

@ -1,3 +1,12 @@
Tue Jul 14 12:33:44 1998 Chris Torek <torek@bsdi.com>
* config/tc-sparc.c (log2): New static function.
(s_reserve): Use log2 to convert alignment before calling
record_alignment.
(s_common): Use log2 to convert alignment before calling
record_alignment and frag_align.
(sparc_cons_align): Use log2.
Tue Jul 14 11:58:40 1998 Ian Lance Taylor <ian@cygnus.com>
* config/tc-sparc.c (sparc_handle_align): Reindent a bit. Correct

View file

@ -107,6 +107,7 @@ static int target_little_endian_data;
/* handle of the OPCODE hash table */
static struct hash_control *op_hash;
static int log2 PARAMS ((int));
static void s_data1 PARAMS ((void));
static void s_seg PARAMS ((int));
static void s_proc PARAMS ((int));
@ -2937,6 +2938,24 @@ md_pcrel_from (fixP)
return ret;
}
/* Return log2 (VALUE), or -1 if VALUE is not an exact positive power
of two. */
static int
log2 (value)
int value;
{
int shift;
if (value <= 0)
return -1;
for (shift = 0; (value & 1) == 0; value >>= 1)
++shift;
return (value == 1) ? shift : -1;
}
/*
* sort of like s_lcomm
*/
@ -3003,38 +3022,43 @@ s_reserve (ignore)
SKIP_WHITESPACE ();
if (*input_line_pointer == '\n')
{
as_bad (_("Missing alignment"));
as_bad (_("missing alignment"));
ignore_rest_of_line ();
return;
}
align = get_absolute_expression ();
align = (int) get_absolute_expression ();
#ifndef OBJ_ELF
if (align > max_alignment)
{
align = max_alignment;
as_warn (_("Alignment too large: %d. assumed."), align);
as_warn (_("alignment too large; assuming %d"), align);
}
#endif
if (align < 0)
{
align = 0;
as_warn (_("Alignment negative. 0 assumed."));
as_bad (_("negative alignment"));
ignore_rest_of_line ();
return;
}
if (align != 0)
{
temp = log2 (align);
if (temp < 0)
{
as_bad (_("alignment not a power of 2"));
ignore_rest_of_line ();
return;
}
align = temp;
}
record_alignment (bss_section, align);
/* convert to a power of 2 alignment */
for (temp = 0; (align & 1) == 0; align >>= 1, ++temp);;
if (align != 1)
{
as_bad (_("Alignment not a power of 2"));
ignore_rest_of_line ();
return;
} /* not a power of two */
align = temp;
} /* if has optional alignment */
}
else
align = 0;
@ -3145,18 +3169,22 @@ s_common (ignore)
if (*input_line_pointer != '"')
{
temp = get_absolute_expression ();
#ifndef OBJ_ELF
if (temp > max_alignment)
{
temp = max_alignment;
as_warn (_("Common alignment too large: %d. assumed"), temp);
as_warn (_("alignment too large; assuming %d"), temp);
}
#endif
if (temp < 0)
{
temp = 0;
as_warn (_("Common alignment negative; 0 assumed"));
as_bad (_("negative alignment"));
ignore_rest_of_line ();
return;
}
#ifdef OBJ_ELF
if (symbolP->local)
{
@ -3167,7 +3195,19 @@ s_common (ignore)
old_sec = now_seg;
old_subsec = now_subseg;
align = temp;
if (temp == 0)
align = 0;
else
align = log2 (temp);
if (align < 0)
{
as_bad (_("alignment not a power of 2"));
ignore_rest_of_line ();
return;
}
record_alignment (bss_section, align);
subseg_set (bss_section, 0);
if (align)
@ -3183,7 +3223,7 @@ s_common (ignore)
subseg_set (old_sec, old_subsec);
}
else
#endif
#endif /* OBJ_ELF */
{
allocate_common:
S_SET_VALUE (symbolP, (valueT) size);
@ -3349,16 +3389,12 @@ sparc_cons_align (nbytes)
return;
}
nalign = 0;
while ((nbytes & 1) == 0)
{
++nalign;
nbytes >>= 1;
}
nalign = log2 (nbytes);
if (nalign == 0)
return;
assert (nalign > 0);
if (now_seg == absolute_section)
{
if ((abs_section_offset & ((1 << nalign) - 1)) != 0)