From: Tristan Gingold Date: Wed, 30 Mar 2011 12:43:35 +0000 (+0000) Subject: 2011-03-30 Tristan Gingold X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c734e7e3836935c1dab4e13e79b250bcd044a7fa;p=binutils-gdb.git 2011-03-30 Tristan Gingold * 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. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index d61c9526211..084f7edd424 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2011-03-30 Tristan Gingold + + * 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 PR 12610 diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c index 4396e144c98..045a8aa8df2 100644 --- a/gas/config/tc-ppc.c +++ b/gas/config/tc-ppc.c @@ -3747,28 +3747,30 @@ ppc_stabx (int ignore ATTRIBUTE_UNUSED) symbol_get_tc (sym)->output = 1; - if (S_GET_STORAGE_CLASS (sym) == C_STSYM) { - - symbol_get_tc (sym)->within = ppc_current_block; + if (S_GET_STORAGE_CLASS (sym) == C_STSYM) + { + /* In this case : - /* In this case : + .bs name + .stabx "z",arrays_,133,0 + .es - .bs name - .stabx "z",arrays_,133,0 - .es + .comm arrays_,13768,3 - .comm arrays_,13768,3 + 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. */ - 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) + { + if (ppc_current_block == NULL) + as_bad (_(".stabx of storage class stsym must be within .bs/.es")); - 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)