mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-09 04:21:49 +08:00
2011-03-30 Tristan Gingold <gingold@adacore.com>
* config/tc-ppc.c (ppc_frob_symbol): Convert stsym symbols value to offset only if within is set. (ppc_stabx): Reformat. For stsym stabs, add a check and set within only for symbols.
This commit is contained in:
parent
311e6ab300
commit
c734e7e383
@ -1,3 +1,10 @@
|
||||
2011-03-30 Tristan Gingold <gingold@adacore.com>
|
||||
|
||||
* config/tc-ppc.c (ppc_frob_symbol): Convert stsym symbols value
|
||||
to offset only if within is set.
|
||||
(ppc_stabx): Reformat. For stsym stabs, add a check and set
|
||||
within only for symbols.
|
||||
|
||||
2011-03-29 Richard Henderson <rth@redhat.com>
|
||||
|
||||
PR 12610
|
||||
|
@ -3747,28 +3747,30 @@ ppc_stabx (int ignore ATTRIBUTE_UNUSED)
|
||||
|
||||
symbol_get_tc (sym)->output = 1;
|
||||
|
||||
if (S_GET_STORAGE_CLASS (sym) == C_STSYM) {
|
||||
if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
|
||||
{
|
||||
/* In this case :
|
||||
|
||||
symbol_get_tc (sym)->within = ppc_current_block;
|
||||
.bs name
|
||||
.stabx "z",arrays_,133,0
|
||||
.es
|
||||
|
||||
/* In this case :
|
||||
.comm arrays_,13768,3
|
||||
|
||||
.bs name
|
||||
.stabx "z",arrays_,133,0
|
||||
.es
|
||||
resolve_symbol_value will copy the exp's "within" into sym's when the
|
||||
offset is 0. Since this seems to be corner case problem,
|
||||
only do the correction for storage class C_STSYM. A better solution
|
||||
would be to have the tc field updated in ppc_symbol_new_hook. */
|
||||
|
||||
.comm arrays_,13768,3
|
||||
if (exp.X_op == O_symbol)
|
||||
{
|
||||
if (ppc_current_block == NULL)
|
||||
as_bad (_(".stabx of storage class stsym must be within .bs/.es"));
|
||||
|
||||
resolve_symbol_value will copy the exp's "within" into sym's when the
|
||||
offset is 0. Since this seems to be corner case problem,
|
||||
only do the correction for storage class C_STSYM. A better solution
|
||||
would be to have the tc field updated in ppc_symbol_new_hook. */
|
||||
|
||||
if (exp.X_op == O_symbol)
|
||||
{
|
||||
symbol_get_tc (exp.X_add_symbol)->within = ppc_current_block;
|
||||
}
|
||||
}
|
||||
symbol_get_tc (sym)->within = ppc_current_block;
|
||||
symbol_get_tc (exp.X_add_symbol)->within = ppc_current_block;
|
||||
}
|
||||
}
|
||||
|
||||
if (exp.X_op != O_symbol
|
||||
|| ! S_IS_EXTERNAL (exp.X_add_symbol)
|
||||
@ -5401,13 +5403,22 @@ ppc_frob_symbol (symbolS *sym)
|
||||
else if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
|
||||
{
|
||||
symbolS *block;
|
||||
symbolS *csect;
|
||||
valueT base;
|
||||
|
||||
/* The value is the offset from the enclosing csect. */
|
||||
block = symbol_get_tc (sym)->within;
|
||||
csect = symbol_get_tc (block)->within;
|
||||
resolve_symbol_value (csect);
|
||||
S_SET_VALUE (sym, S_GET_VALUE (sym) - S_GET_VALUE (csect));
|
||||
if (block)
|
||||
{
|
||||
/* The value is the offset from the enclosing csect. */
|
||||
symbolS *csect;
|
||||
|
||||
csect = symbol_get_tc (block)->within;
|
||||
resolve_symbol_value (csect);
|
||||
base = S_GET_VALUE (csect);
|
||||
}
|
||||
else
|
||||
base = 0;
|
||||
|
||||
S_SET_VALUE (sym, S_GET_VALUE (sym) - base);
|
||||
}
|
||||
else if (S_GET_STORAGE_CLASS (sym) == C_BINCL
|
||||
|| S_GET_STORAGE_CLASS (sym) == C_EINCL)
|
||||
|
Loading…
Reference in New Issue
Block a user