projects
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
* dw2gencfi.c (TC_DWARF2_EMIT_OFFSET): Provide default.
[binutils-gdb.git]
/
gas
/
expr.c
diff --git
a/gas/expr.c
b/gas/expr.c
index a75be2c1ea850ccef73954866ec1a5ef6a88ad08..53952b56fa100020ad979bc17f21500d0f7cb7eb 100644
(file)
--- a/
gas/expr.c
+++ b/
gas/expr.c
@@
-1,6
+1,6
@@
/* expr.c -operands, expressions-
Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
/* expr.c -operands, expressions-
Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
, 2009
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@@
-45,10
+45,9
@@
static valueT generic_bignum_to_int64 (void);
#endif
static void integer_constant (int radix, expressionS * expressionP);
static void mri_char_constant (expressionS *);
#endif
static void integer_constant (int radix, expressionS * expressionP);
static void mri_char_constant (expressionS *);
-static void current_location (expressionS *);
static void clean_up_expression (expressionS * expressionP);
static segT operand (expressionS *, enum expr_mode);
static void clean_up_expression (expressionS * expressionP);
static segT operand (expressionS *, enum expr_mode);
-static operatorT operator (int *);
+static operatorT operator
f
(int *);
extern const char EXP_CHARS[], FLT_CHARS[];
extern const char EXP_CHARS[], FLT_CHARS[];
@@
-411,7
+410,7
@@
integer_constant (int radix, expressionS *expressionP)
if (num_little_digits > SIZE_OF_LARGE_NUMBER - 1)
num_little_digits = SIZE_OF_LARGE_NUMBER - 1;
if (num_little_digits > SIZE_OF_LARGE_NUMBER - 1)
num_little_digits = SIZE_OF_LARGE_NUMBER - 1;
- assert (num_little_digits >= 4);
+
gas_
assert (num_little_digits >= 4);
if (num_little_digits != 8)
as_bad (_("a bignum with underscores must have exactly 4 words"));
if (num_little_digits != 8)
as_bad (_("a bignum with underscores must have exactly 4 words"));
@@
-695,7
+694,7
@@
mri_char_constant (expressionS *expressionP)
/* Return an expression representing the current location. This
handles the magic symbol `.'. */
/* Return an expression representing the current location. This
handles the magic symbol `.'. */
-
static
void
+void
current_location (expressionS *expressionp)
{
if (now_seg == absolute_section)
current_location (expressionS *expressionp)
{
if (now_seg == absolute_section)
@@
-1057,6
+1056,15
@@
operand (expressionS *expressionP, enum expr_mode mode)
{
for (i = 0; i < expressionP->X_add_number; ++i)
generic_bignum[i] = ~generic_bignum[i];
{
for (i = 0; i < expressionP->X_add_number; ++i)
generic_bignum[i] = ~generic_bignum[i];
+
+ /* Extend the bignum to at least the size of .octa. */
+ if (expressionP->X_add_number < SIZE_OF_LARGE_NUMBER)
+ {
+ expressionP->X_add_number = SIZE_OF_LARGE_NUMBER;
+ for (; i < expressionP->X_add_number; ++i)
+ generic_bignum[i] = ~(LITTLENUM_TYPE) 0;
+ }
+
if (c == '-')
for (i = 0; i < expressionP->X_add_number; ++i)
{
if (c == '-')
for (i = 0; i < expressionP->X_add_number; ++i)
{
@@
-1067,14
+1075,12
@@
operand (expressionS *expressionP, enum expr_mode mode)
}
else if (c == '!')
{
}
else if (c == '!')
{
- int nonzero = 0;
for (i = 0; i < expressionP->X_add_number; ++i)
for (i = 0; i < expressionP->X_add_number; ++i)
- {
- if (generic_bignum[i])
- nonzero = 1;
- generic_bignum[i] = 0;
- }
- generic_bignum[0] = nonzero;
+ if (generic_bignum[i] != 0)
+ break;
+ expressionP->X_add_number = i >= expressionP->X_add_number;
+ expressionP->X_op = O_constant;
+ expressionP->X_unsigned = 1;
}
}
else if (expressionP->X_op != O_illegal
}
}
else if (expressionP->X_op != O_illegal
@@
-1228,9
+1234,9
@@
operand (expressionS *expressionP, enum expr_mode mode)
#ifdef md_operator
{
#ifdef md_operator
{
- operatorT op
erator
= md_operator (name, 1, &c);
+ operatorT op = md_operator (name, 1, &c);
- switch (op
erator
)
+ switch (op)
{
case O_uminus:
*input_line_pointer = c;
{
case O_uminus:
*input_line_pointer = c;
@@
-1250,14
+1256,14
@@
operand (expressionS *expressionP, enum expr_mode mode)
default:
break;
}
default:
break;
}
- if (op
erator != O_absent && operator
!= O_illegal)
+ if (op
!= O_absent && op
!= O_illegal)
{
*input_line_pointer = c;
expr (9, expressionP, mode);
expressionP->X_add_symbol = make_expr_symbol (expressionP);
expressionP->X_op_symbol = NULL;
expressionP->X_add_number = 0;
{
*input_line_pointer = c;
expr (9, expressionP, mode);
expressionP->X_add_symbol = make_expr_symbol (expressionP);
expressionP->X_op_symbol = NULL;
expressionP->X_add_number = 0;
- expressionP->X_op = op
erator
;
+ expressionP->X_op = op;
break;
}
}
break;
}
}
@@
-1486,7
+1492,7
@@
static const operatorT op_encoding[256] = {
7 * / % << >>
8 unary - unary ~
*/
7 * / % << >>
8 unary - unary ~
*/
-static operator_rankT op_rank[] = {
+static operator_rankT op_rank[
O_max
] = {
0, /* O_illegal */
0, /* O_absent */
0, /* O_constant */
0, /* O_illegal */
0, /* O_absent */
0, /* O_constant */
@@
-1517,22
+1523,6
@@
static operator_rankT op_rank[] = {
3, /* O_logical_and */
2, /* O_logical_or */
1, /* O_index */
3, /* O_logical_and */
2, /* O_logical_or */
1, /* O_index */
- 0, /* O_md1 */
- 0, /* O_md2 */
- 0, /* O_md3 */
- 0, /* O_md4 */
- 0, /* O_md5 */
- 0, /* O_md6 */
- 0, /* O_md7 */
- 0, /* O_md8 */
- 0, /* O_md9 */
- 0, /* O_md10 */
- 0, /* O_md11 */
- 0, /* O_md12 */
- 0, /* O_md13 */
- 0, /* O_md14 */
- 0, /* O_md15 */
- 0, /* O_md16 */
};
/* Unfortunately, in MRI mode for the m68k, multiplication and
};
/* Unfortunately, in MRI mode for the m68k, multiplication and
@@
-1562,10
+1552,10
@@
expr_set_precedence (void)
}
void
}
void
-expr_set_rank (operatorT op
erator
, operator_rankT rank)
+expr_set_rank (operatorT op, operator_rankT rank)
{
{
-
assert (operator >= O_md1 && operator
< ARRAY_SIZE (op_rank));
- op_rank[op
erator
] = rank;
+
gas_assert (op >= O_md1 && op
< ARRAY_SIZE (op_rank));
+ op_rank[op] = rank;
}
/* Initialize the expression parser. */
}
/* Initialize the expression parser. */
@@
-1579,7
+1569,7
@@
expr_begin (void)
{
expressionS e;
e.X_op = O_max;
{
expressionS e;
e.X_op = O_max;
- assert (e.X_op == O_max);
+
gas_
assert (e.X_op == O_max);
}
}
\f
}
}
\f
@@
-1588,7
+1578,7
@@
expr_begin (void)
Does not advance INPUT_LINE_POINTER. */
static inline operatorT
Does not advance INPUT_LINE_POINTER. */
static inline operatorT
-operator (int *num_chars)
+operator
f
(int *num_chars)
{
int c;
operatorT ret;
{
int c;
operatorT ret;
@@
-1603,13
+1593,13
@@
operator (int *num_chars)
if (is_name_beginner (c))
{
char *name = input_line_pointer;
if (is_name_beginner (c))
{
char *name = input_line_pointer;
- char c = get_symbol_end ();
+ char
e
c = get_symbol_end ();
- ret = md_operator (name, 2, &c);
+ ret = md_operator (name, 2, &
e
c);
switch (ret)
{
case O_absent:
switch (ret)
{
case O_absent:
- *input_line_pointer = c;
+ *input_line_pointer =
e
c;
input_line_pointer = name;
break;
case O_uminus:
input_line_pointer = name;
break;
case O_uminus:
@@
-1619,7
+1609,7
@@
operator (int *num_chars)
ret = O_illegal;
/* FALLTHROUGH */
default:
ret = O_illegal;
/* FALLTHROUGH */
default:
- *input_line_pointer = c;
+ *input_line_pointer =
e
c;
*num_chars = input_line_pointer - name;
input_line_pointer = name;
return ret;
*num_chars = input_line_pointer - name;
input_line_pointer = name;
return ret;
@@
-1748,7
+1738,7
@@
expr (int rankarg, /* Larger # is higher rank. */
/* operand () gobbles spaces. */
know (*input_line_pointer != ' ');
/* operand () gobbles spaces. */
know (*input_line_pointer != ' ');
- op_left = operator (&op_chars);
+ op_left = operator
f
(&op_chars);
while (op_left != O_illegal && op_rank[(int) op_left] > rank)
{
segT rightseg;
while (op_left != O_illegal && op_rank[(int) op_left] > rank)
{
segT rightseg;
@@
-1756,6
+1746,7
@@
expr (int rankarg, /* Larger # is higher rank. */
input_line_pointer += op_chars; /* -> after operator. */
input_line_pointer += op_chars; /* -> after operator. */
+ right.X_md = 0;
rightseg = expr (op_rank[(int) op_left], &right, mode);
if (right.X_op == O_absent)
{
rightseg = expr (op_rank[(int) op_left], &right, mode);
if (right.X_op == O_absent)
{
@@
-1779,7
+1770,7
@@
expr (int rankarg, /* Larger # is higher rank. */
}
}
}
}
- op_right = operator (&op_chars);
+ op_right = operator
f
(&op_chars);
know (op_right == O_illegal || op_left == O_index
|| op_rank[(int) op_right] <= op_rank[(int) op_left]);
know (op_right == O_illegal || op_left == O_index
|| op_rank[(int) op_right] <= op_rank[(int) op_left]);
@@
-2013,6
+2004,7
@@
resolve_expression (expressionS *expressionP)
/* Help out with CSE. */
valueT final_val = expressionP->X_add_number;
symbolS *add_symbol = expressionP->X_add_symbol;
/* Help out with CSE. */
valueT final_val = expressionP->X_add_number;
symbolS *add_symbol = expressionP->X_add_symbol;
+ symbolS *orig_add_symbol = add_symbol;
symbolS *op_symbol = expressionP->X_op_symbol;
operatorT op = expressionP->X_op;
valueT left, right;
symbolS *op_symbol = expressionP->X_op_symbol;
operatorT op = expressionP->X_op;
valueT left, right;
@@
-2094,6
+2086,7
@@
resolve_expression (expressionS *expressionP)
left = right;
seg_left = seg_right;
add_symbol = op_symbol;
left = right;
seg_left = seg_right;
add_symbol = op_symbol;
+ orig_add_symbol = expressionP->X_op_symbol;
op = O_symbol;
break;
}
op = O_symbol;
break;
}
@@
-2138,18
+2131,19
@@
resolve_expression (expressionS *expressionP)
{
if (op == O_bit_exclusive_or || op == O_bit_inclusive_or)
{
{
if (op == O_bit_exclusive_or || op == O_bit_inclusive_or)
{
- if (
seg_right != absolute_section || right != 0
)
+ if (
!(seg_right == absolute_section && right == 0)
)
{
seg_left = seg_right;
left = right;
add_symbol = op_symbol;
{
seg_left = seg_right;
left = right;
add_symbol = op_symbol;
+ orig_add_symbol = expressionP->X_op_symbol;
}
op = O_symbol;
break;
}
else if (op == O_left_shift || op == O_right_shift)
{
}
op = O_symbol;
break;
}
else if (op == O_left_shift || op == O_right_shift)
{
- if (
seg_left != absolute_section || left != 0
)
+ if (
!(seg_left == absolute_section && left == 0)
)
{
op = O_symbol;
break;
{
op = O_symbol;
break;
@@
-2165,6
+2159,7
@@
resolve_expression (expressionS *expressionP)
seg_left = seg_right;
left = right;
add_symbol = op_symbol;
seg_left = seg_right;
left = right;
add_symbol = op_symbol;
+ orig_add_symbol = expressionP->X_op_symbol;
op = O_symbol;
break;
}
op = O_symbol;
break;
}
@@
-2174,11
+2169,11
@@
resolve_expression (expressionS *expressionP)
op = O_symbol;
break;
}
op = O_symbol;
break;
}
- else if (
left !
= right
-
|| ((seg_left != reg_section || seg_right !
= reg_section)
-
&& (seg_left !
= undefined_section
-
|| seg_right !
= undefined_section
-
|| add_symbol != op_symbol
)))
+ else if (
!(left =
= right
+
&& ((seg_left == reg_section && seg_right =
= reg_section)
+
|| (seg_left =
= undefined_section
+
&& seg_right =
= undefined_section
+
&& add_symbol == op_symbol)
)))
return 0;
else if (op == O_bit_and || op == O_bit_inclusive_or)
{
return 0;
else if (op == O_bit_and || op == O_bit_inclusive_or)
{
@@
-2249,7
+2244,7
@@
resolve_expression (expressionS *expressionP)
op = O_constant;
else if (seg_left == reg_section && final_val == 0)
op = O_register;
op = O_constant;
else if (seg_left == reg_section && final_val == 0)
op = O_register;
- else if (
add_symbol != expressionP->X_add_symbol
)
+ else if (
!symbol_same_p (add_symbol, orig_add_symbol)
)
final_val += left;
expressionP->X_add_symbol = add_symbol;
}
final_val += left;
expressionP->X_add_symbol = add_symbol;
}