[1/5] gas: streamline expr_build_dot()
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_binutils_build--master-arm |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 |
success
|
Build passed
|
linaro-tcwg-bot/tcwg_binutils_check--master-aarch64 |
success
|
Test passed
|
linaro-tcwg-bot/tcwg_binutils_check--master-arm |
success
|
Test passed
|
Commit Message
There's no point involving symbol_clone_if_forward_ref(), just for it to
replace dot_symbol by one obtained from symbol_temp_new_now(). For the
abs-section case also produce a slightly more "complete" (as in: all
potentially relevant fields filled) expression by going through
expr_build_uconstant().
Move the function next to current_location(), for it to be easier to see
the (dis)similarities. Correct the function's comment while there.
Comments
On Fri, 22 Nov 2024, Jan Beulich wrote:
> There's no point involving symbol_clone_if_forward_ref(), just for it to
> replace dot_symbol by one obtained from symbol_temp_new_now(). For the
> abs-section case also produce a slightly more "complete" (as in: all
> potentially relevant fields filled) expression by going through
> expr_build_uconstant().
As I recall this cloning is needed for equated symbols, so that the value
of `.' used in an expression used for a symbol's calculation is obtained
at the time of the symbol's reference and not the symbol's definition.
For further details please see the discussion starting from:
<https://inbox.sourceware.org/binutils/alpine.DEB.1.10.1010291442440.25860@tp.orcam.me.uk/>.
Let me know if you have further questions after reviewing it and I'll try
to address them (mind though that it's been 14 years since I worked on it
and my memory may a bit hazy about it now).
Maciej
On 26.11.2024 03:43, Maciej W. Rozycki wrote:
> On Fri, 22 Nov 2024, Jan Beulich wrote:
>
>> There's no point involving symbol_clone_if_forward_ref(), just for it to
>> replace dot_symbol by one obtained from symbol_temp_new_now(). For the
>> abs-section case also produce a slightly more "complete" (as in: all
>> potentially relevant fields filled) expression by going through
>> expr_build_uconstant().
>
> As I recall this cloning is needed for equated symbols, so that the value
> of `.' used in an expression used for a symbol's calculation is obtained
> at the time of the symbol's reference and not the symbol's definition.
Yet then symbol_clone_if_forward_ref() would be wrong to use here, as that
pins down . at the present location (the cloning is done to keep this
"pinning down" from affecting the original symbol). Aiui it's quite the
opposite: expr_build_dot() _wants_ to latch . at its current location. At
least according to my interpretation of all the uses of it that we
presently have.
The special treatment of forward equates is happening elsewhere, by
pseudo_set() using deferred_expression() in that case. That's entirely
unrelated to expr_build_dot() (current_location() is what the expression
parser uses).
Jan
@@ -193,17 +193,6 @@ expr_build_uconstant (offsetT value)
e.X_extrabit = 0;
return make_expr_symbol (&e);
}
-
-/* Build an expression for the current location ('.'). */
-
-symbolS *
-expr_build_dot (void)
-{
- expressionS e;
-
- current_location (&e);
- return symbol_clone_if_forward_ref (make_expr_symbol (&e));
-}
/* Build any floating-point literal here.
Also build any bignum literal here. */
@@ -754,6 +743,24 @@ current_location (expressionS *expressio
}
}
+/* Make a symbol for the current location ('.'). */
+
+symbolS *
+expr_build_dot (void)
+{
+ if (now_seg != absolute_section)
+ {
+ symbolS *symbolP = symbol_temp_new_now ();
+
+#ifdef tc_new_dot_label
+ tc_new_dot_label (symbolP);
+#endif
+ return symbolP;
+ }
+
+ return expr_build_uconstant (abs_section_offset);
+}
+
#ifndef md_register_arithmetic
# define md_register_arithmetic 1
#endif