diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 5 | ||||
-rw-r--r-- | gas/config/tc-msp430.c | 16 |
2 files changed, 19 insertions, 2 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index c412689..e7ad1de 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2005-01-04 Dmitry Diky <diwil@spec.ru> + + * config/tc-msp430.c (md_apply_fix3): Fix offset calculation for + global label. + 2005-01-03 David Mosberger <davidm@hpl.hp.com> * config/tc-ia64.c (md): Add member "loc_directive_seen". diff --git a/gas/config/tc-msp430.c b/gas/config/tc-msp430.c index d836578..d7a2082 100644 --- a/gas/config/tc-msp430.c +++ b/gas/config/tc-msp430.c @@ -1,6 +1,6 @@ /* tc-msp430.c -- Assembler code for the Texas Instruments MSP430 - Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Contributed by Dmitry Diky <diwil@mail.ru> This file is part of GAS, the GNU Assembler. @@ -1851,7 +1851,19 @@ md_apply_fix3 (fixS * fixp, valueT * valuep, segT seg) if (fixp->fx_addsy && (s == seg || s == absolute_section)) { - value = S_GET_VALUE (fixp->fx_addsy) + *valuep; + /* FIXME: We can appear here only in case if we perform a pc + relative jump to the label which is i) global, ii) locally + defined or this is a jump to an absolute symbol. + If this is an absolute symbol -- everything is OK. + If this is a global label, we've got a symbol value defined + twice: + 1. S_GET_VALUE (fixp->fx_addsy) will contain a symbol offset + from this section start + 2. *valuep will contain the real offset from jump insn to the + label + So, the result of S_GET_VALUE (fixp->fx_addsy) + (* valuep); + will be incorrect. Therefore remove s_get_value. */ + value = /* S_GET_VALUE (fixp->fx_addsy) + */ * valuep; fixp->fx_done = 1; } else |