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:
Tristan Gingold 2011-03-30 12:43:35 +00:00
parent 311e6ab300
commit c734e7e383
2 changed files with 40 additions and 22 deletions

View File

@ -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

View File

@ -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)