From 49ccc555101b06e8cdca1ca24abbfc745d0735e7 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Thu, 17 Mar 1994 21:37:42 +0000 Subject: [PATCH] * config/tc-hppa.c (pa_import): Correctly handle importing of an already defined symbol. --- gas/ChangeLog | 5 +++++ gas/config/tc-hppa.c | 48 ++++++++++++++++++++++++++++---------------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index c87f1891a8d..91c59370a12 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +Thu Mar 17 13:36:09 1994 Jeffrey A. Law (law@snake.cs.utah.edu) + + * config/tc-hppa.c (pa_import): Correctly handle importing of an + already defined symbol. + Wed Mar 16 17:11:37 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) * config/tc-mips.c (mips_ip): Only accept overly large values for diff --git a/gas/config/tc-hppa.c b/gas/config/tc-hppa.c index f87710f435f..ef1dd71cd3e 100644 --- a/gas/config/tc-hppa.c +++ b/gas/config/tc-hppa.c @@ -4758,27 +4758,41 @@ pa_import (unused) name = input_line_pointer; c = get_symbol_end (); - symbol = symbol_find_or_make (name); - p = input_line_pointer; - *p = c; - - if (!is_end_of_statement ()) + symbol = symbol_find (name); + /* Ugh. We might be importing a symbol defined earlier in the file, + in which case all the code below will really screw things up + (set the wrong segment, symbol flags & type, etc). */ + if (symbol == NULL || !S_IS_DEFINED (symbol)) { - input_line_pointer++; - pa_type_args (symbol, 0); + symbol = symbol_find_or_make (name); + p = input_line_pointer; + *p = c; + + if (!is_end_of_statement ()) + { + input_line_pointer++; + pa_type_args (symbol, 0); + } + else + { + /* Sigh. To be compatable with the HP assembler and to help + poorly written assembly code, we assign a type based on + the the current segment. Note only BSF_FUNCTION really + matters, we do not need to set the full SYMBOL_TYPE_* info. */ + if (now_seg == text_section) + symbol->bsym->flags |= BSF_FUNCTION; + + /* If the section is undefined, then the symbol is undefined + Since this is an import, leave the section undefined. */ + S_SET_SEGMENT (symbol, &bfd_und_section); + } } else { - /* Sigh. To be compatable with the HP assembler and to help - poorly written assembly code, we assign a type based on - the the current segment. Note only BSF_FUNCTION really - matters, we do not need to set the full SYMBOL_TYPE_* info here. */ - if (now_seg == text_section) - symbol->bsym->flags |= BSF_FUNCTION; - - /* If the section is undefined, then the symbol is undefined - Since this is an import, leave the section undefined. */ - S_SET_SEGMENT (symbol, &bfd_und_section); + /* The symbol was already defined. Just eat everything up to + the end of the current statement. */ + while (!is_end_of_statement ()) + input_line_pointer++; } demand_empty_rest_of_line (); -- 2.30.2