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,10 +3747,8 @@ 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)
{
symbol_get_tc (sym)->within = ppc_current_block;
/* In this case : /* In this case :
.bs name .bs name
@ -3766,6 +3764,10 @@ ppc_stabx (int ignore ATTRIBUTE_UNUSED)
if (exp.X_op == O_symbol) if (exp.X_op == O_symbol)
{ {
if (ppc_current_block == NULL)
as_bad (_(".stabx of storage class stsym must be within .bs/.es"));
symbol_get_tc (sym)->within = ppc_current_block;
symbol_get_tc (exp.X_add_symbol)->within = ppc_current_block; symbol_get_tc (exp.X_add_symbol)->within = ppc_current_block;
} }
} }
@ -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;
valueT base;
block = symbol_get_tc (sym)->within;
if (block)
{
/* The value is the offset from the enclosing csect. */
symbolS *csect; symbolS *csect;
/* The value is the offset from the enclosing csect. */
block = symbol_get_tc (sym)->within;
csect = symbol_get_tc (block)->within; csect = symbol_get_tc (block)->within;
resolve_symbol_value (csect); resolve_symbol_value (csect);
S_SET_VALUE (sym, S_GET_VALUE (sym) - S_GET_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)