Tue Oct 31 16:34:28 1995 David Mosberger-Tang <davidm@azstarnet.com>

* configure.in (alpha-*-linux*): Use ecoff.
	* configure: Rebuild.
	* ecoff.c (ecoff_directive_extern): New function.
	(ecoff_directive_weakext): New function.
	(ecoff_build_symbols): Handle weak symbols.
	(ecoff_setup_ext): Likewise.
	* ecoff.h (ecoff_directive_extern): Declare.
	(ecoff_directive_weakext): Declare.
	* symbols.c (S_IS_WEAK): New function.
	* symbols.h (S_IS_WEAK): Declare.
	* config/obj-ecoff.c (obj_pseudo_table): Add "extern" and
	"weakext".
	* config/tc-mips.c (mips_pseudo_table): Remove "extern".
	(s_extern): Remove.
This commit is contained in:
Ian Lance Taylor 1995-10-31 21:41:59 +00:00
parent 5d0e859038
commit d7b2038fac
4 changed files with 161 additions and 37 deletions

View File

@ -1,3 +1,20 @@
Tue Oct 31 16:34:28 1995 David Mosberger-Tang <davidm@azstarnet.com>
* configure.in (alpha-*-linux*): Use ecoff.
* configure: Rebuild.
* ecoff.c (ecoff_directive_extern): New function.
(ecoff_directive_weakext): New function.
(ecoff_build_symbols): Handle weak symbols.
(ecoff_setup_ext): Likewise.
* ecoff.h (ecoff_directive_extern): Declare.
(ecoff_directive_weakext): Declare.
* symbols.c (S_IS_WEAK): New function.
* symbols.h (S_IS_WEAK): Declare.
* config/obj-ecoff.c (obj_pseudo_table): Add "extern" and
"weakext".
* config/tc-mips.c (mips_pseudo_table): Remove "extern".
(s_extern): Remove.
Tue Oct 31 13:29:08 1995 Ian Lance Taylor <ian@cygnus.com> Tue Oct 31 13:29:08 1995 Ian Lance Taylor <ian@cygnus.com>
* config/tc-ppc.c (md_pseudo_table): Add "bc" and "ec". * config/tc-ppc.c (md_pseudo_table): Add "bc" and "ec".

35
gas/configure vendored
View File

@ -12,7 +12,7 @@ ac_help=
ac_default_prefix=/usr/local ac_default_prefix=/usr/local
# Any additions from configure.in: # Any additions from configure.in:
ac_help="$ac_help ac_help="$ac_help
bfd-assembler use BFD back end for writing object files" --enable-bfd-assembler use BFD back end for writing object files"
ac_help="$ac_help ac_help="$ac_help
targets alternative target configurations besides the primary" targets alternative target configurations besides the primary"
@ -659,6 +659,7 @@ for this_target in $target $canon_targets ; do
alpha-*-netware*) fmt=ecoff ;; alpha-*-netware*) fmt=ecoff ;;
alpha-*-osf*) fmt=ecoff ;; alpha-*-osf*) fmt=ecoff ;;
alpha-*-linux*) fmt=ecoff ;;
# start-sanitize-arc # start-sanitize-arc
arc-*-elf*) fmt=elf bfd_gas=yes ;; arc-*-elf*) fmt=elf bfd_gas=yes ;;
@ -1244,7 +1245,7 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser, # On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. # not just through cpp.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1247 "configure" #line 1249 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
@ -1258,7 +1259,7 @@ else
rm -rf conftest* rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp" CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1261 "configure" #line 1263 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
@ -1291,7 +1292,7 @@ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1294 "configure" #line 1296 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <$ac_hdr> #include <$ac_hdr>
EOF EOF
@ -1343,7 +1344,7 @@ else
ac_cv_c_cross=yes ac_cv_c_cross=yes
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1346 "configure" #line 1348 "configure"
#include "confdefs.h" #include "confdefs.h"
main(){return(0);} main(){return(0);}
EOF EOF
@ -1366,7 +1367,7 @@ if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1369 "configure" #line 1371 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <alloca.h> #include <alloca.h>
int main() { return 0; } int main() { return 0; }
@ -1397,7 +1398,7 @@ if eval "test \"`echo '$''{'ac_cv_func_alloca'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1400 "configure" #line 1402 "configure"
#include "confdefs.h" #include "confdefs.h"
#ifdef __GNUC__ #ifdef __GNUC__
@ -1455,7 +1456,7 @@ if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1458 "configure" #line 1460 "configure"
#include "confdefs.h" #include "confdefs.h"
#if defined(CRAY) && ! defined(CRAY2) #if defined(CRAY) && ! defined(CRAY2)
webecray webecray
@ -1483,7 +1484,7 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1486 "configure" #line 1488 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */ which can conflict with char $ac_func(); below. */
@ -1537,7 +1538,7 @@ else
ac_cv_c_stack_direction=0 ac_cv_c_stack_direction=0
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1540 "configure" #line 1542 "configure"
#include "confdefs.h" #include "confdefs.h"
find_stack_direction () find_stack_direction ()
{ {
@ -1579,7 +1580,7 @@ else
ac_cv_c_inline=no ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do for ac_kw in inline __inline__ __inline; do
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1582 "configure" #line 1584 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { return 0; } int main() { return 0; }
@ -1618,7 +1619,7 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1621 "configure" #line 1623 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */ which can conflict with char $ac_func(); below. */
@ -1671,7 +1672,7 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1674 "configure" #line 1676 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */ which can conflict with char $ac_func(); below. */
@ -1724,7 +1725,7 @@ if eval "test \"`echo '$''{'gas_cv_assert_ok'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1727 "configure" #line 1729 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
#include <stdio.h> #include <stdio.h>
@ -1781,7 +1782,7 @@ if eval "test \"`echo '$''{'gas_cv_decl_needed_malloc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1784 "configure" #line 1786 "configure"
#include "confdefs.h" #include "confdefs.h"
$gas_test_headers $gas_test_headers
int main() { return 0; } int main() { return 0; }
@ -1817,7 +1818,7 @@ if eval "test \"`echo '$''{'gas_cv_decl_needed_free'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1820 "configure" #line 1822 "configure"
#include "confdefs.h" #include "confdefs.h"
$gas_test_headers $gas_test_headers
int main() { return 0; } int main() { return 0; }
@ -1856,7 +1857,7 @@ if eval "test \"`echo '$''{'gas_cv_decl_needed_errno'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1859 "configure" #line 1861 "configure"
#include "confdefs.h" #include "confdefs.h"
#ifdef HAVE_ERRNO_H #ifdef HAVE_ERRNO_H

View File

@ -9,7 +9,7 @@ AC_INIT(as.h)dnl
dnl dnl
user_bfd_gas= user_bfd_gas=
AC_ARG_ENABLE(bfd-assembler, AC_ARG_ENABLE(bfd-assembler,
[ bfd-assembler use BFD back end for writing object files], [ --enable-bfd-assembler use BFD back end for writing object files],
[case "${enableval}" in [case "${enableval}" in
yes) need_bfd=yes user_bfd_gas=yes ;; yes) need_bfd=yes user_bfd_gas=yes ;;
no) user_bfd_gas=no ;; no) user_bfd_gas=no ;;
@ -132,6 +132,7 @@ changequote([,])dnl
alpha-*-netware*) fmt=ecoff ;; alpha-*-netware*) fmt=ecoff ;;
alpha-*-osf*) fmt=ecoff ;; alpha-*-osf*) fmt=ecoff ;;
alpha-*-linux*) fmt=ecoff ;;
# start-sanitize-arc # start-sanitize-arc
arc-*-elf*) fmt=elf bfd_gas=yes ;; arc-*-elf*) fmt=elf bfd_gas=yes ;;
@ -144,6 +145,7 @@ changequote([,])dnl
*) targ=arm-lit ;; *) targ=arm-lit ;;
esac esac
;; ;;
arm-*-coff) fmt=coff ;;
arm-*-riscix*) fmt=aout ;; arm-*-riscix*) fmt=aout ;;
arm-*-pe) fmt=coff targ=armcoff em=pe ;; arm-*-pe) fmt=coff targ=armcoff em=pe ;;

View File

@ -19,7 +19,7 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with GAS; see the file COPYING. If not, write to along with GAS; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "as.h" #include "as.h"
@ -936,6 +936,7 @@ typedef struct efdr {
FDR fdr; /* File header to be written out */ FDR fdr; /* File header to be written out */
FDR *orig_fdr; /* original file header */ FDR *orig_fdr; /* original file header */
char *name; /* filename */ char *name; /* filename */
int fake; /* whether this is faked .file */
symint_t void_type; /* aux. pointer to 'void' type */ symint_t void_type; /* aux. pointer to 'void' type */
symint_t int_type; /* aux. pointer to 'int' type */ symint_t int_type; /* aux. pointer to 'int' type */
scope_t *cur_scope; /* current nested scopes */ scope_t *cur_scope; /* current nested scopes */
@ -987,6 +988,7 @@ static const efdr_t init_file =
(FDR *)0, /* orig_fdr: original file header pointer */ (FDR *)0, /* orig_fdr: original file header pointer */
(char *)0, /* name: pointer to filename */ (char *)0, /* name: pointer to filename */
0, /* fake: whether this is a faked .file */
0, /* void_type: ptr to aux node for void type */ 0, /* void_type: ptr to aux node for void type */
0, /* int_type: ptr to aux node for int type */ 0, /* int_type: ptr to aux node for int type */
(scope_t *)0, /* cur_scope: current scope being processed */ (scope_t *)0, /* cur_scope: current scope being processed */
@ -1435,7 +1437,7 @@ static tag_t *get_tag PARAMS ((const char *tag, localsym_t *sym,
bt_t basic_type)); bt_t basic_type));
static void add_unknown_tag PARAMS ((tag_t *ptag)); static void add_unknown_tag PARAMS ((tag_t *ptag));
static void add_procedure PARAMS ((char *func)); static void add_procedure PARAMS ((char *func));
static void add_file PARAMS ((const char *file_name, int indx)); static void add_file PARAMS ((const char *file_name, int indx, int fake));
#ifdef ECOFF_DEBUG #ifdef ECOFF_DEBUG
static char *sc_to_string PARAMS ((sc_t storage_class)); static char *sc_to_string PARAMS ((sc_t storage_class));
static char *st_to_string PARAMS ((st_t symbol_type)); static char *st_to_string PARAMS ((st_t symbol_type));
@ -1509,7 +1511,7 @@ ecoff_symbol_new_hook (symbolP)
wrong. */ wrong. */
if (cur_file_ptr == (efdr_t *) NULL if (cur_file_ptr == (efdr_t *) NULL
&& seen_at_least_1_file ()) && seen_at_least_1_file ())
add_file ((const char *) NULL, 0); add_file ((const char *) NULL, 0, 1);
symbolP->ecoff_file = cur_file_ptr; symbolP->ecoff_file = cur_file_ptr;
symbolP->ecoff_symbol = NULL; symbolP->ecoff_symbol = NULL;
symbolP->ecoff_extern_size = 0; symbolP->ecoff_extern_size = 0;
@ -2178,9 +2180,10 @@ add_procedure (func)
where the current file structure lives. */ where the current file structure lives. */
static void static void
add_file (file_name, indx) add_file (file_name, indx, fake)
const char *file_name; /* file name */ const char *file_name; /* file name */
int indx; int indx;
int fake;
{ {
register int first_ch; register int first_ch;
register efdr_t *fil_ptr; register efdr_t *fil_ptr;
@ -2228,6 +2231,19 @@ add_file (file_name, indx)
first_ch = *file_name; first_ch = *file_name;
/* ??? This is ifdefed out, because it results in incorrect line number
debugging info when multiple .file pseudo-ops are merged into one file
descriptor. See for instance ecoff_build_lineno, which will
end up setting all file->fdr.* fields multiple times, resulting in
incorrect debug info. In order to make this work right, all line number
and symbol info for the same source file has to be adjacent in the object
file, so that a single file descriptor can be used to point to them.
This would require maintaining file specific lists of line numbers and
symbols for each file, so that they can be merged together (or output
together) when two .file pseudo-ops are merged into one file
descriptor. */
#if 0
/* See if the file has already been created. */ /* See if the file has already been created. */
for (fil_ptr = first_file; for (fil_ptr = first_file;
fil_ptr != (efdr_t *) NULL; fil_ptr != (efdr_t *) NULL;
@ -2237,9 +2253,14 @@ add_file (file_name, indx)
&& strcmp (file_name, fil_ptr->name) == 0) && strcmp (file_name, fil_ptr->name) == 0)
{ {
cur_file_ptr = fil_ptr; cur_file_ptr = fil_ptr;
if (! fake)
cur_file_ptr->fake = 0;
break; break;
} }
} }
#else
fil_ptr = (efdr_t *) NULL;
#endif
/* If this is a new file, create it. */ /* If this is a new file, create it. */
if (fil_ptr == (efdr_t *) NULL) if (fil_ptr == (efdr_t *) NULL)
@ -2254,6 +2275,8 @@ add_file (file_name, indx)
fil_ptr->file_index = current_file_idx++; fil_ptr->file_index = current_file_idx++;
++file_desc.num_allocated; ++file_desc.num_allocated;
fil_ptr->fake = fake;
/* Allocate the string hash table. */ /* Allocate the string hash table. */
fil_ptr->str_hash = hash_new (); fil_ptr->str_hash = hash_new ();
@ -3047,7 +3070,7 @@ ecoff_directive_ent (ignore)
register int ch; register int ch;
if (cur_file_ptr == (efdr_t *) NULL) if (cur_file_ptr == (efdr_t *) NULL)
add_file ((const char *) NULL, 0); add_file ((const char *) NULL, 0, 1);
if (cur_proc_ptr != (proc_t *) NULL) if (cur_proc_ptr != (proc_t *) NULL)
{ {
@ -3088,6 +3111,31 @@ ecoff_directive_ent (ignore)
demand_empty_rest_of_line (); demand_empty_rest_of_line ();
} }
/* Parse .extern directives. */
void
ecoff_directive_extern (ignore)
int ignore;
{
char *name;
int c;
symbolS *symbolp;
valueT size;
name = input_line_pointer;
c = get_symbol_end ();
symbolp = symbol_find_or_make (name);
*input_line_pointer = c;
S_SET_EXTERNAL (symbolp);
if (*input_line_pointer == ',')
++input_line_pointer;
size = get_absolute_expression ();
symbolp->ecoff_extern_size = size;
}
/* Parse .file directives. */ /* Parse .file directives. */
void void
@ -3110,7 +3158,7 @@ ecoff_directive_file (ignore)
/* FIXME: we don't have to save the name here. */ /* FIXME: we don't have to save the name here. */
name = demand_copy_C_string (&len); name = demand_copy_C_string (&len);
add_file (name, indx - 1); add_file (name, indx - 1, 0);
demand_empty_rest_of_line (); demand_empty_rest_of_line ();
} }
@ -3304,6 +3352,54 @@ mark_stabs (ignore)
} }
} }
/* Parse .weakext directives. */
void
ecoff_directive_weakext (ignore)
int ignore;
{
char *name;
int c;
symbolS *symbolP;
expressionS exp;
name = input_line_pointer;
c = get_symbol_end ();
symbolP = symbol_find_or_make (name);
*input_line_pointer = c;
SKIP_WHITESPACE ();
if (c == ',')
{
if (S_IS_DEFINED (symbolP))
{
as_bad ("Ignoring attempt to redefine symbol `%s'.",
S_GET_NAME (symbolP));
ignore_rest_of_line ();
return;
}
++input_line_pointer;
SKIP_WHITESPACE ();
if (! is_end_of_line[(unsigned char) *input_line_pointer])
{
expression (&exp);
if (exp.X_op != O_symbol)
{
as_bad ("bad .weakext directive");
ignore_rest_of_line();
return;
}
symbolP->sy_value = exp;
}
}
S_SET_WEAK (symbolP);
demand_empty_rest_of_line ();
}
/* Handle .stabs directives. The actual parsing routine is done by a /* Handle .stabs directives. The actual parsing routine is done by a
generic routine. This routine is called via OBJ_PROCESS_STAB. generic routine. This routine is called via OBJ_PROCESS_STAB.
When this is called, input_line_pointer will be pointing at the When this is called, input_line_pointer will be pointing at the
@ -3373,7 +3469,7 @@ ecoff_stab (sec, what, string, type, other, desc)
/* Make sure we have a current file. */ /* Make sure we have a current file. */
if (cur_file_ptr == (efdr_t *) NULL) if (cur_file_ptr == (efdr_t *) NULL)
{ {
add_file ((const char *) NULL, 0); add_file ((const char *) NULL, 0, 1);
save_file_ptr = cur_file_ptr; save_file_ptr = cur_file_ptr;
} }
@ -3653,8 +3749,6 @@ ecoff_build_lineno (backend, buf, bufend, offset, linecntptr)
if (l->file != file && file != (efdr_t *) NULL) if (l->file != file && file != (efdr_t *) NULL)
{ {
file->fdr.cbLine = c - file->fdr.cbLineOffset; file->fdr.cbLine = c - file->fdr.cbLineOffset;
/* The cline field is ill-documented. This is a guess
at the right value. */
file->fdr.cline = totcount + count; file->fdr.cline = totcount + count;
if (linecntptr != (long *) NULL) if (linecntptr != (long *) NULL)
*linecntptr += totcount + count; *linecntptr += totcount + count;
@ -3663,8 +3757,14 @@ ecoff_build_lineno (backend, buf, bufend, offset, linecntptr)
if (l->file != file) if (l->file != file)
{ {
efdr_t *last_file = file;
file = l->file; file = l->file;
file->fdr.ilineBase = iline; if (last_file != (efdr_t *) NULL)
file->fdr.ilineBase
= last_file->fdr.ilineBase + last_file->fdr.cline;
else
file->fdr.ilineBase = 0;
file->fdr.cbLineOffset = c; file->fdr.cbLineOffset = c;
} }
if (l->proc != proc) if (l->proc != proc)
@ -3674,8 +3774,6 @@ ecoff_build_lineno (backend, buf, bufend, offset, linecntptr)
{ {
proc->pdr.lnLow = l->lineno; proc->pdr.lnLow = l->lineno;
proc->pdr.cbLineOffset = c - file->fdr.cbLineOffset; proc->pdr.cbLineOffset = c - file->fdr.cbLineOffset;
/* The iline field is ill-documented. This is a
guess at the right value. */
proc->pdr.iline = totcount; proc->pdr.iline = totcount;
} }
} }
@ -3888,11 +3986,14 @@ ecoff_build_symbols (backend, buf, bufend, offset)
+ bfd_get_section_vma (stdoutput, + bfd_get_section_vma (stdoutput,
S_GET_SEGMENT (as_sym))); S_GET_SEGMENT (as_sym)));
sym_ptr->ecoff_sym.weakext = S_IS_WEAK (as_sym);
/* Set st_Proc to st_StaticProc for local /* Set st_Proc to st_StaticProc for local
functions. */ functions. */
if (sym_ptr->ecoff_sym.asym.st == st_Proc if (sym_ptr->ecoff_sym.asym.st == st_Proc
&& S_IS_DEFINED (as_sym) && S_IS_DEFINED (as_sym)
&& ! S_IS_EXTERNAL (as_sym)) && ! S_IS_EXTERNAL (as_sym)
&& ! S_IS_WEAK (as_sym))
sym_ptr->ecoff_sym.asym.st = st_StaticProc; sym_ptr->ecoff_sym.asym.st = st_StaticProc;
/* Get the type and storage class based on where /* Get the type and storage class based on where
@ -3915,6 +4016,7 @@ ecoff_build_symbols (backend, buf, bufend, offset)
if (! ECOFF_IS_STAB (&sym_ptr->ecoff_sym.asym) if (! ECOFF_IS_STAB (&sym_ptr->ecoff_sym.asym)
&& (S_IS_EXTERNAL (as_sym) && (S_IS_EXTERNAL (as_sym)
|| S_IS_WEAK (as_sym)
|| ! S_IS_DEFINED (as_sym))) || ! S_IS_DEFINED (as_sym)))
{ {
if ((as_sym->bsym->flags & BSF_FUNCTION) != 0) if ((as_sym->bsym->flags & BSF_FUNCTION) != 0)
@ -3983,6 +4085,7 @@ ecoff_build_symbols (backend, buf, bufend, offset)
than the actual symbol. Should we handle than the actual symbol. Should we handle
them here? */ them here? */
if ((S_IS_EXTERNAL (as_sym) if ((S_IS_EXTERNAL (as_sym)
|| S_IS_WEAK (as_sym)
|| ! S_IS_DEFINED (as_sym)) || ! S_IS_DEFINED (as_sym))
&& sym_ptr->proc_ptr == (proc_t *) NULL && sym_ptr->proc_ptr == (proc_t *) NULL
&& sym_ptr->ecoff_sym.asym.st != (int) st_Nil && sym_ptr->ecoff_sym.asym.st != (int) st_Nil
@ -4473,6 +4576,7 @@ ecoff_setup_ext ()
/* If this is a local symbol, then force the fields to zero. */ /* If this is a local symbol, then force the fields to zero. */
if (! S_IS_EXTERNAL (sym) if (! S_IS_EXTERNAL (sym)
&& ! S_IS_WEAK (sym)
&& S_IS_DEFINED (sym)) && S_IS_DEFINED (sym))
{ {
sym->ecoff_symbol->ecoff_sym.asym.value = 0; sym->ecoff_symbol->ecoff_sym.asym.value = 0;
@ -4485,7 +4589,7 @@ ecoff_setup_ext ()
} }
} }
/* Build the ECOFF dbeugging information. */ /* Build the ECOFF debugging information. */
unsigned long unsigned long
ecoff_build_debug (hdr, bufp, backend) ecoff_build_debug (hdr, bufp, backend)
@ -4507,7 +4611,7 @@ ecoff_build_debug (hdr, bufp, backend)
/* Make sure we have a file. */ /* Make sure we have a file. */
if (first_file == (efdr_t *) NULL) if (first_file == (efdr_t *) NULL)
add_file ((const char *) NULL, 0); add_file ((const char *) NULL, 0, 1);
/* Handle any top level tags. */ /* Handle any top level tags. */
for (ptag = top_tag_head->first_tag; for (ptag = top_tag_head->first_tag;
@ -4556,7 +4660,7 @@ ecoff_build_debug (hdr, bufp, backend)
&& cur_file_ptr->cur_scope->prev != (scope_t *) NULL) && cur_file_ptr->cur_scope->prev != (scope_t *) NULL)
{ {
cur_file_ptr->cur_scope = cur_file_ptr->cur_scope->prev; cur_file_ptr->cur_scope = cur_file_ptr->cur_scope->prev;
if (! end_warning) if (! end_warning && ! cur_file_ptr->fake)
{ {
as_warn ("Missing .end or .bend at end of file"); as_warn ("Missing .end or .bend at end of file");
end_warning = 1; end_warning = 1;
@ -5085,7 +5189,7 @@ generate_ecoff_stab (what, string, type, other, desc)
/* Make sure we have a current file. */ /* Make sure we have a current file. */
if (cur_file_ptr == (efdr_t *) NULL) if (cur_file_ptr == (efdr_t *) NULL)
{ {
add_file ((const char *) NULL, 0); add_file ((const char *) NULL, 0, 1);
save_file_ptr = cur_file_ptr; save_file_ptr = cur_file_ptr;
} }
@ -5174,7 +5278,7 @@ ecoff_generate_asm_lineno (filename, lineno)
if (current_stabs_filename == (char *)NULL || strcmp (current_stabs_filename, filename)) if (current_stabs_filename == (char *)NULL || strcmp (current_stabs_filename, filename))
{ {
add_file (filename, 0); add_file (filename, 0, 1);
generate_asm_lineno = 1; generate_asm_lineno = 1;
} }
@ -5216,7 +5320,7 @@ ecoff_generate_asm_line_stab (filename, lineno)
if (strcmp (current_stabs_filename, filename)) if (strcmp (current_stabs_filename, filename))
{ {
add_file (filename, 0); add_file (filename, 0, 1);
generate_asm_lineno = 1; generate_asm_lineno = 1;
} }