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>
|
2011-03-29 Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
PR 12610
|
PR 12610
|
||||||
|
@ -3747,28 +3747,30 @@ ppc_stabx (int ignore ATTRIBUTE_UNUSED)
|
|||||||
|
|
||||||
symbol_get_tc (sym)->output = 1;
|
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
|
resolve_symbol_value will copy the exp's "within" into sym's when the
|
||||||
.stabx "z",arrays_,133,0
|
offset is 0. Since this seems to be corner case problem,
|
||||||
.es
|
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
|
symbol_get_tc (sym)->within = ppc_current_block;
|
||||||
offset is 0. Since this seems to be corner case problem,
|
symbol_get_tc (exp.X_add_symbol)->within = ppc_current_block;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (exp.X_op != O_symbol
|
if (exp.X_op != O_symbol
|
||||||
|| ! S_IS_EXTERNAL (exp.X_add_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)
|
else if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
|
||||||
{
|
{
|
||||||
symbolS *block;
|
symbolS *block;
|
||||||
symbolS *csect;
|
valueT base;
|
||||||
|
|
||||||
/* The value is the offset from the enclosing csect. */
|
|
||||||
block = symbol_get_tc (sym)->within;
|
block = symbol_get_tc (sym)->within;
|
||||||
csect = symbol_get_tc (block)->within;
|
if (block)
|
||||||
resolve_symbol_value (csect);
|
{
|
||||||
S_SET_VALUE (sym, S_GET_VALUE (sym) - S_GET_VALUE (csect));
|
/* 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
|
else if (S_GET_STORAGE_CLASS (sym) == C_BINCL
|
||||||
|| S_GET_STORAGE_CLASS (sym) == C_EINCL)
|
|| S_GET_STORAGE_CLASS (sym) == C_EINCL)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user