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>
PR 12610

View File

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