diff options
author | Ian Lance Taylor <ian@airs.com> | 1995-09-21 20:42:11 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1995-09-21 20:42:11 +0000 |
commit | 52e1cf9d019c225dfa03720fa14d841f0b84de1a (patch) | |
tree | f2a8312536d3a7db572b48ce7d47f07f26d478f6 /gas/expr.c | |
parent | 2c4747540f8a9cbfe17cae6114c505325f61036e (diff) | |
download | fsf-binutils-gdb-52e1cf9d019c225dfa03720fa14d841f0b84de1a.zip fsf-binutils-gdb-52e1cf9d019c225dfa03720fa14d841f0b84de1a.tar.gz fsf-binutils-gdb-52e1cf9d019c225dfa03720fa14d841f0b84de1a.tar.bz2 |
* subsegs.c (subseg_set): Permit SEG_ABSOLUTE in know expression.
* expr.c (expr): Account for new operatorT values in know
expression.
* write.c (fixup_segment): Clear fixp->fx_subsy if the relocation
is fully resolved.
Diffstat (limited to 'gas/expr.c')
-rw-r--r-- | gas/expr.c | 57 |
1 files changed, 42 insertions, 15 deletions
@@ -34,6 +34,7 @@ static void floating_constant PARAMS ((expressionS * expressionP)); static void integer_constant PARAMS ((int radix, expressionS * expressionP)); static void mri_char_constant PARAMS ((expressionS *)); +static void current_location PARAMS ((expressionS *)); static void clean_up_expression PARAMS ((expressionS * expressionP)); extern const char EXP_CHARS[], FLT_CHARS[]; @@ -491,6 +492,31 @@ mri_char_constant (expressionP) ++input_line_pointer; } +/* Return an expression representing the current location. This + handles the magic symbol `.'. */ + +static void +current_location (expressionp) + expressionS *expressionp; +{ + if (now_seg == absolute_section) + { + expressionp->X_op = O_constant; + expressionp->X_add_number = abs_section_offset; + } + else + { + symbolS *symbolp; + + symbolp = symbol_new (FAKE_LABEL_NAME, now_seg, + (valueT) frag_now_fix (), + frag_now); + expressionp->X_op = O_symbol; + expressionp->X_add_symbol = symbolp; + expressionp->X_add_number = 0; + } +} + /* * Summary of operand(). * @@ -810,23 +836,17 @@ operand (expressionP) integer_constant (16, expressionP); break; } - /* Fall through. */ + + if (is_part_of_name (*input_line_pointer)) + goto isname; + + current_location (expressionP); + break; + case '.': if (!is_part_of_name (*input_line_pointer)) { - const char *fake; - - /* JF: '.' is pseudo symbol with value of current location - in current segment. */ - fake = FAKE_LABEL_NAME; - symbolP = symbol_new (fake, - now_seg, - (valueT) frag_now_fix (), - frag_now); - - expressionP->X_op = O_symbol; - expressionP->X_add_symbol = symbolP; - expressionP->X_add_number = 0; + current_location (expressionP); break; } else if ((strncasecmp (input_line_pointer, "startof.", 8) == 0 @@ -908,6 +928,13 @@ operand (expressionP) integer_constant (16, expressionP); break; + case '*': + if (! flag_mri || is_part_of_name (*input_line_pointer)) + goto de_fault; + + current_location (expressionP); + break; + default: de_fault: if (is_end_of_line[(unsigned char) c]) @@ -1272,7 +1299,7 @@ expr (rank, resultP) op_right = operator (); know (op_right == O_illegal || op_rank[(int) op_right] <= op_rank[(int) op_left]); - know ((int) op_left >= (int) O_multiply && (int) op_left <= (int) O_subtract); + know ((int) op_left >= (int) O_multiply && (int) op_left <= (int) O_gt); /* input_line_pointer->after right-hand quantity. */ /* left-hand quantity in resultP */ |