From: Ian Lance Taylor Date: Wed, 30 Dec 1992 21:39:51 +0000 (+0000) Subject: A bunch of changes to COFF support. See the ChangeLog. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9a75dc1f76e4cb4130059dd9395dc4afe6b9cb8a;p=binutils-gdb.git A bunch of changes to COFF support. See the ChangeLog. --- diff --git a/gas/config/i386aix.mt b/gas/config/i386aix.mt deleted file mode 100644 index 9f073465b07..00000000000 --- a/gas/config/i386aix.mt +++ /dev/null @@ -1,4 +0,0 @@ -# TDEFINES = -DBFD_HEADERS -# LOCAL_LOADLIBES = $(srcdir)/../bfd/$(srcdir)/libbfd.a -CC = gcc -MINUS_G = -O diff --git a/gas/config/mh-i386aix b/gas/config/mh-i386aix index a1e5d77e95a..195875bebab 100644 --- a/gas/config/mh-i386aix +++ b/gas/config/mh-i386aix @@ -1,5 +1,6 @@ # Define SYSV as -DSYSV if you are using a System V operating system. SYSV = -DSYSV -RANLIB = /bin/true +RANLIB = true CC = gcc -MINUS_G = -O +# comment out the next line if you don't have gcc2 and shareable libraries. +LDFLAGS= -shlib diff --git a/gas/config/obj-coffbfd.c b/gas/config/obj-coffbfd.c index 54e5333f06f..a32598531b7 100644 --- a/gas/config/obj-coffbfd.c +++ b/gas/config/obj-coffbfd.c @@ -84,10 +84,8 @@ int function_lineoff = -1; /* Offset in line#s where the last function started (the odd entry for line #0) */ -int had_lineno = 0; -int had_reloc = 0; - static symbolS *last_line_symbol; + /* Add 4 to the real value to get the index and compensate the negatives. This vector is used by S_GET_SEGMENT to turn a coff section number into a segment number @@ -105,12 +103,14 @@ static void EXFUN (fixup_segment, (segment_info_type *segP, segT this_segment_type)); -static void EXFUN (fixup_mdeps, (fragS *)); +static void EXFUN (fixup_mdeps, (fragS *, + object_headers *, + segT)); static void EXFUN (fill_section, (bfd * abfd, - struct internal_filehdr * f, unsigned - long *)); + object_headers *, + unsigned long *)); char *EXFUN (s_get_name, (symbolS * s)); @@ -138,6 +138,8 @@ static void EXFUN (obj_coff_lcomm, (void)); static void EXFUN (obj_coff_dim, (void)); static void EXFUN (obj_coff_text, (void)); static void EXFUN (obj_coff_data, (void)); +static void EXFUN( obj_coff_bss,(void)); +static void EXFUN( obj_coff_ident,(void)); static void EXFUN (obj_coff_endef, (void)); static void EXFUN (obj_coff_line, (void)); static void EXFUN (obj_coff_ln, (void)); @@ -171,8 +173,8 @@ const pseudo_typeS obj_pseudo_table[] = {"sect", obj_coff_section, 0}, {"text", obj_coff_text, 0}, {"data", obj_coff_data, 0}, -/* we don't yet handle this. */ - {"ident", s_ignore, 0}, + {"bss", obj_coff_bss, 0}, + {"ident", obj_coff_ident, 0}, {"ABORT", s_abort, 0}, {"lcomm", obj_coff_lcomm, 0}, {NULL} /* end sentinel */ @@ -279,7 +281,6 @@ DEFUN (size_section, (abfd, idx), while (frag) { size = frag->fr_address; -#if 0 if (frag->fr_address != size) { printf ("Out of step\n"); @@ -302,7 +303,6 @@ DEFUN (size_section, (abfd, idx), size += frag->fr_fix; size += relax_align (size, frag->fr_offset); } -#endif frag = frag->fr_next; } segment_info[idx].scnhdr.s_size = size; @@ -343,13 +343,15 @@ DEFUN (count_entries_in_chain, (idx), /* output all the relocations for a section */ void -DEFUN (do_relocs_for, (abfd, file_cursor), +DEFUN (do_relocs_for, (abfd, h, file_cursor), bfd * abfd AND + object_headers * h AND unsigned long *file_cursor) { unsigned int nrelocs; unsigned int idx; - unsigned int addr = 0; + unsigned long reloc_start = *file_cursor; + for (idx = SEG_E0; idx < SEG_E9; idx++) { if (segment_info[idx].scnhdr.s_name[0]) @@ -359,19 +361,14 @@ DEFUN (do_relocs_for, (abfd, file_cursor), struct external_reloc *external_reloc_vec; unsigned int external_reloc_size; unsigned int count = 0; - unsigned int base = addr; + unsigned int base = segment_info[idx].scnhdr.s_paddr; fixS *fix_ptr = segment_info[idx].fix_root; nrelocs = count_entries_in_chain (idx); - if (nrelocs) - had_reloc = 1; - external_reloc_size = nrelocs * RELSZ; external_reloc_vec = (struct external_reloc *) malloc (external_reloc_size); - - ext_ptr = external_reloc_vec; /* Fill in the internal coff style reloc struct from the @@ -426,16 +423,25 @@ DEFUN (do_relocs_for, (abfd, file_cursor), ext_ptr++; #if defined(TC_A29K) - /* The 29k has a special kludge for the high 16 bit reloc. - Two relocations are emmited, R_IHIHALF, and - R_IHCONST. The second one doesn't contain a symbol, - but uses the value for offset */ + + /* The 29k has a special kludge for the high 16 bit + reloc. Two relocations are emited, R_IHIHALF, + and R_IHCONST. The second one doesn't contain a + symbol, but uses the value for offset. */ if (intr.r_type == R_IHIHALF) { /* now emit the second bit */ intr.r_type = R_IHCONST; intr.r_symndx = fix_ptr->fx_addnumber; + + /* The offset to the segment holding the symbol + has already been counted in the R_IHIHALF. + We don't want to add it in again for the + R_IHCONST. */ + if (symbol_ptr) + intr.r_symndx -= + segment_info[S_GET_SEGMENT (symbol_ptr)].scnhdr.s_paddr; (void) bfd_coff_swap_reloc_out (abfd, &intr, ext_ptr); ext_ptr++; } @@ -446,14 +452,15 @@ DEFUN (do_relocs_for, (abfd, file_cursor), } /* Write out the reloc table */ - segment_info[idx].scnhdr.s_relptr = *file_cursor; + segment_info[idx].scnhdr.s_relptr = nrelocs ? *file_cursor : 0; segment_info[idx].scnhdr.s_nreloc = nrelocs; bfd_write ((PTR) external_reloc_vec, 1, external_reloc_size, abfd); *file_cursor += external_reloc_size; free (external_reloc_vec); } - addr += segment_info[idx].scnhdr.s_size; } + /* Set relocation_size field in file headers */ + H_SET_RELOCATION_SIZE (h, *file_cursor - reloc_start, 0); } @@ -461,16 +468,14 @@ DEFUN (do_relocs_for, (abfd, file_cursor), in the scnhdrs with the info on the file postions */ static void -DEFUN (fill_section, (abfd, filehdr, file_cursor), +DEFUN (fill_section, (abfd, h, file_cursor), bfd * abfd AND - struct internal_filehdr *filehdr AND + object_headers *h AND unsigned long *file_cursor) { unsigned int i; -#ifdef ZERO_BASED_SEGMENTS unsigned int paddr = 0; -#endif for (i = SEG_E0; i < SEG_UNKNOWN; i++) { @@ -483,20 +488,15 @@ DEFUN (fill_section, (abfd, filehdr, file_cursor), fragS *frag = segment_info[i].frchainP->frch_root; char *buffer; - if (s->s_size != 0 && i != SEG_E2) - { - buffer = malloc (s->s_size); - s->s_scnptr = *file_cursor; -#ifdef ZERO_BASED_SEGMENTS - s->s_paddr = paddr; - s->s_vaddr = paddr; -#endif - } + if (s->s_size == 0) + s->s_scnptr = 0; else { - buffer = NULL; - s->s_scnptr = 0; + buffer = xmalloc (s->s_size); + s->s_scnptr = *file_cursor; } + know (s->s_paddr == paddr); + s->s_vaddr = paddr; s->s_flags = STYP_REG; if (strcmp (s->s_name, ".text") == 0) @@ -504,13 +504,23 @@ DEFUN (fill_section, (abfd, filehdr, file_cursor), else if (strcmp (s->s_name, ".data") == 0) s->s_flags |= STYP_DATA; else if (strcmp (s->s_name, ".bss") == 0) - s->s_flags |= STYP_BSS | STYP_NOLOAD; + { + s->s_scnptr = 0; + s->s_flags |= STYP_BSS; +#ifndef TC_I386 + /* Apparently the SVR3 linker is confused by noload + sections. */ + s->s_flags |= STYP_NOLOAD; +#endif + } else if (strcmp (s->s_name, ".lit") == 0) s->s_flags = STYP_LIT | STYP_TEXT; else if (strcmp (s->s_name, ".init") == 0) s->s_flags |= STYP_TEXT; else if (strcmp (s->s_name, ".fini") == 0) s->s_flags |= STYP_TEXT; + else if (strncmp (s->s_name, ".comment", 8) == 0) + s->s_flags |= STYP_INFO; while (frag) { @@ -545,17 +555,15 @@ DEFUN (fill_section, (abfd, filehdr, file_cursor), unsigned int off = frag->fr_fix; for (count = frag->fr_offset; count; count--) { - if (fill_size < s->s_size) { - - memcpy (buffer + frag->fr_address + off, - frag->fr_literal + frag->fr_fix, - fill_size); - off += fill_size; - offset += fill_size; + if (fill_size < s->s_size) + { + memcpy (buffer + frag->fr_address + off, + frag->fr_literal + frag->fr_fix, + fill_size); + off += fill_size; + offset += fill_size; + } } - - } - } break; case rs_broken_word: @@ -566,45 +574,49 @@ DEFUN (fill_section, (abfd, filehdr, file_cursor), frag = frag->fr_next; } - if (s->s_size != 0 && i != SEG_E2) + if (s->s_size != 0) { - bfd_write (buffer, s->s_size, 1, abfd); + if (s->s_scnptr != 0) + { + bfd_write (buffer, s->s_size, 1, abfd); + *file_cursor += s->s_size; + } free (buffer); - *file_cursor += s->s_size; } -#ifdef ZERO_BASED_SEGMENTS paddr += s->s_size; -#endif } } } - - /* Coff file generation & utilities */ - static void -DEFUN (coff_header_append, (abfd, filehdr, aouthdr), +DEFUN (coff_header_append, (abfd, h), bfd * abfd AND - struct internal_filehdr *filehdr AND - struct internal_aouthdr *aouthdr) + object_headers * h) { unsigned int i; char buffer[1000]; char buffero[1000]; bfd_seek (abfd, 0, 0); -#if 0 - filehdr.f_opthdr = bfd_coff_swap_aouthdr_out (abfd, aouthdr, - buffero); -#else - filehdr->f_opthdr = 0; -#endif - i = bfd_coff_swap_filehdr_out (abfd, filehdr, buffer); + +#ifndef OBJ_COFF_OMIT_OPTIONAL_HEADER + H_SET_MAGIC_NUMBER (h, COFF_MAGIC); + H_SET_VERSION_STAMP (h, 0); + H_SET_ENTRY_POINT (h, 0); + H_SET_TEXT_START (h, segment_info[SEG_E0].frchainP->frch_root->fr_address); + H_SET_DATA_START (h, segment_info[SEG_E1].frchainP->frch_root->fr_address); + H_SET_SIZEOF_OPTIONAL_HEADER (h, bfd_coff_swap_aouthdr_out(abfd, &h->aouthdr, + buffero)); +#else /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */ + H_SET_SIZEOF_OPTIONAL_HEADER (h, 0); +#endif /* defined (OBJ_COFF_OMIT_OPTIONAL_HEADER) */ + + i = bfd_coff_swap_filehdr_out (abfd, &h->filehdr, buffer); bfd_write (buffer, i, 1, abfd); - bfd_write (buffero, filehdr->f_opthdr, 1, abfd); + bfd_write (buffero, H_GET_SIZEOF_OPTIONAL_HEADER (h), 1, abfd); for (i = SEG_E0; i < SEG_E9; i++) { @@ -1591,8 +1603,8 @@ DEFUN_VOID (tie_tags) } static void -DEFUN (crawl_symbols, (headers, abfd), - struct internal_filehdr *headers AND +DEFUN (crawl_symbols, (h, abfd), + object_headers *h AND bfd * abfd) { @@ -1654,20 +1666,21 @@ DEFUN (crawl_symbols, (headers, abfd), { if (segment_info[i].scnhdr.s_name[0]) { - segment_info[i].dot = - c_section_symbol (segment_info[i].scnhdr.s_name, - i - SEG_E0 + 1); + char name[9]; + strncpy (name, segment_info[i].scnhdr.s_name, 8); + name[8] = '\0'; + segment_info[i].dot = c_section_symbol (name, i - SEG_E0 + 1); } } /* Take all the externals out and put them into another chain */ - headers->f_nsyms = yank_symbols (); + H_SET_SYMBOL_TABLE_SIZE (h, yank_symbols ()); /* Take the externals and glue them onto the end.*/ - headers->f_nsyms += glue_symbols (); + H_SET_SYMBOL_TABLE_SIZE (h, H_GET_SYMBOL_COUNT (h) + glue_symbols ()); - headers->f_nsyms = tie_tags (); + H_SET_SYMBOL_TABLE_SIZE (h, tie_tags ()); know (symbol_externP == NULL); know (symbol_extern_lastP == NULL); @@ -1705,16 +1718,14 @@ DEFUN (w_strings, (where), } - - - - static void -DEFUN (do_linenos_for, (abfd, file_cursor), +DEFUN (do_linenos_for, (abfd, h, file_cursor), bfd * abfd AND + object_headers * h AND unsigned long *file_cursor) { unsigned int idx; + unsigned long start = *file_cursor; for (idx = SEG_E0; idx < SEG_E9; idx++) { @@ -1763,6 +1774,7 @@ DEFUN (do_linenos_for, (abfd, file_cursor), *file_cursor += s->scnhdr.s_nlnno * LINESZ; } } + H_SET_LINENO_SIZE (h, *file_cursor - start); } @@ -1799,8 +1811,7 @@ DEFUN_VOID (write_object_file) int i; struct frchain *frchain_ptr; - struct internal_filehdr filehdr; - struct internal_aouthdr aouthdr; + object_headers headers; unsigned long file_cursor; bfd *abfd; unsigned int addr; @@ -1815,8 +1826,6 @@ DEFUN_VOID (write_object_file) bfd_set_format (abfd, bfd_object); bfd_set_arch_mach (abfd, BFD_ARCH, machine); - - string_byte_count = 4; for (frchain_ptr = frchain_root; @@ -1847,106 +1856,90 @@ DEFUN_VOID (write_object_file) relax_segment (segment_info[i].frchainP->frch_root, i); } - filehdr.f_nscns = 0; + H_SET_NUMBER_OF_SECTIONS (&headers, 0); /* Find out how big the sections are, and set the addresses. */ addr = 0; for (i = SEG_E0; i < SEG_UNKNOWN; i++) { + long size; + segment_info[i].scnhdr.s_paddr = addr; - segment_info[i].scnhdr.s_vaddr = addr; if (segment_info[i].scnhdr.s_name[0]) { - filehdr.f_nscns++; + H_SET_NUMBER_OF_SECTIONS (&headers, + H_GET_NUMBER_OF_SECTIONS (&headers) + 1); } - /* Supposedly setting segment addresses non-zero - causes problems for some platforms, although it - shouldn't. If you define ZERO_BASED_SEGMENTS, all - the segments will be based at 0. Please don't make - this the default, since some systems (e.g., SVR3.2) - require the segments to be non-zero based. Ian - Taylor . */ + size = size_section (abfd, i); + addr += size; - if (i == SEG_E2) - { - /* This is a special case, we leave the size alone, which - will have been made up from all and any lcomms seen. */ -#ifndef ZERO_BASED_SEGMENTS - addr += segment_info[i].scnhdr.s_size; -#endif - } - else - { -#ifndef ZERO_BASED_SEGMENTS - addr += size_section (abfd, i); -#else - size_section (abfd, i); -#endif - } + if (i == SEG_E0) + H_SET_TEXT_SIZE (&headers, size); + else if (i == SEG_E1) + H_SET_DATA_SIZE (&headers, size); + else if (i == SEG_E2) + H_SET_BSS_SIZE (&headers, size); } + /* Turn the gas native symbol table shape into a coff symbol table */ + crawl_symbols (&headers, abfd); + + if (string_byte_count == 4) + string_byte_count = 0; + H_SET_STRING_SIZE (&headers, string_byte_count); - /* Turn the gas native symbol table shape into a coff symbol table */ - crawl_symbols (&filehdr, abfd); #if !defined(TC_H8300) && !defined(TC_Z8K) for (i = SEG_E0; i < SEG_UNKNOWN; i++) { - fixup_mdeps (segment_info[i].frchainP->frch_root); + fixup_mdeps (segment_info[i].frchainP->frch_root, &headers, i); fixup_segment (&segment_info[i], i); } #endif - file_cursor = FILHSZ + SCNHSZ * filehdr.f_nscns; + file_cursor = H_GET_TEXT_FILE_OFFSET (&headers); bfd_seek (abfd, file_cursor, 0); - - do_relocs_for (abfd, &file_cursor); - - do_linenos_for (abfd, &file_cursor); - - /* Plant the data */ - fill_section (abfd, &filehdr, &file_cursor); - - - - filehdr.f_magic = COFF_MAGIC; - filehdr.f_timdat = time (0); - filehdr.f_flags = COFF_FLAGS | coff_flags; - - if (!had_lineno) - { - filehdr.f_flags |= F_LNNO; - } - if (!had_reloc) - { - filehdr.f_flags |= F_RELFLG; - } - - + fill_section (abfd, &headers, &file_cursor); + do_relocs_for (abfd, &headers, &file_cursor); + do_linenos_for (abfd, &headers, &file_cursor); + H_SET_FILE_MAGIC_NUMBER (&headers, COFF_MAGIC); +#ifndef OBJ_COFF_OMIT_TIMESTAMP + H_SET_TIME_STAMP (&headers, (long)time((long*)0)); +#else + H_SET_TIME_STAMP (&headers, 0); +#endif +#ifdef KEEP_RELOC_INFO + H_SET_FLAGS (&headers, ((H_GET_LINENO_SIZE(&headers) ? 0 : F_LNNO) | + COFF_FLAGS | coff_flags)); +#else + H_SET_FLAGS (&headers, ((H_GET_LINENO_SIZE(&headers) ? 0 : F_LNNO) | + (H_GET_RELOCATION_SIZE(&headers) ? 0 : F_RELFLG) | + COFF_FLAGS | coff_flags)); +#endif { - - unsigned int symtable_size = filehdr.f_nsyms * SYMESZ; - char *buffer1 = malloc (symtable_size + string_byte_count + 4); + unsigned int symtable_size = H_GET_SYMBOL_TABLE_SIZE (&headers); + char *buffer1 = xmalloc (symtable_size + string_byte_count + 1); char *ptr = buffer1; - filehdr.f_symptr = bfd_tell (abfd); + H_SET_SYMBOL_TABLE_POINTER (&headers, bfd_tell (abfd)); w_symbols (abfd, buffer1, symbol_rootP); - w_strings (buffer1 + symtable_size); - bfd_write (buffer1, 1, symtable_size + string_byte_count + 4, abfd); + if (string_byte_count > 0) + w_strings (buffer1 + symtable_size); + bfd_write (buffer1, 1, symtable_size + string_byte_count, abfd); free (buffer1); - } - coff_header_append (abfd, &filehdr, &aouthdr); + + coff_header_append (abfd, &headers); if (bfd_close_all_done (abfd) == false) as_fatal ("Can't close %s: %s", out_file_name, @@ -1976,6 +1969,21 @@ DEFUN (change_to_section, (name, len, exp), subseg_new (i, exp); } +/* + * implement the .section pseudo op: + * .section name {, "flags"} + * ^ ^ + * | +--- optional flags: 'b' for bss + * | 'i' for info + * +-- section name 'l' for lib + * 'n' for noload + * 'o' for over + * 'w' for data + * 'x' for text + * But if the argument is not a quoted string, treat it as a + * subsegment number. + */ + void DEFUN_VOID (obj_coff_section) { @@ -1983,9 +1991,10 @@ DEFUN_VOID (obj_coff_section) char *section_name; char *section_name_end; char c; - + int argp; unsigned int len; unsigned int exp; + long flags; section_name = input_line_pointer; c = get_symbol_end (); @@ -1995,26 +2004,53 @@ DEFUN_VOID (obj_coff_section) input_line_pointer++; SKIP_WHITESPACE (); - /* Some 386 assemblers stick a quoted string at the end of - a .section; we just ignore it. */ - if (c == ',' && *input_line_pointer != '"') + argp = 0; + if (c == ',') + argp = 1; + else if (*input_line_pointer == ',') { - exp = get_absolute_expression (); + argp = 1; + ++input_line_pointer; + SKIP_WHITESPACE (); } - else if (*input_line_pointer == ',' - && input_line_pointer[1] != '"') - { - input_line_pointer++; - exp = get_absolute_expression (); - } - else + + exp = 0; + flags = 0; + if (argp) { - exp = 0; - while (! is_end_of_line[*input_line_pointer]) - ++input_line_pointer; + if (*input_line_pointer != '"') + exp = get_absolute_expression (); + else + { + ++input_line_pointer; + while (*input_line_pointer != '"' + && ! is_end_of_line[*input_line_pointer]) + { + switch (*input_line_pointer) + { + case 'b': flags |= STYP_BSS; break; + case 'i': flags |= STYP_INFO; break; + case 'l': flags |= STYP_LIB; break; + case 'n': flags |= STYP_NOLOAD; break; + case 'o': flags |= STYP_OVER; break; + case 'w': flags |= STYP_DATA; break; + case 'x': flags |= STYP_TEXT; break; + default: + as_warn("unknown section attribute '%c'", + *input_line_pointer); + break; + } + ++input_line_pointer; + } + if (*input_line_pointer == '"') + ++input_line_pointer; + } } change_to_section (section_name, len, exp); + + segment_info[now_seg].scnhdr.s_flags |= flags; + *section_name_end = c; } @@ -2032,6 +2068,25 @@ obj_coff_data () change_to_section (".data", 5, get_absolute_expression ()); } +static void +obj_coff_bss() +{ + if (*input_line_pointer == '\n') /* .bss */ + change_to_section(".bss",4, get_absolute_expression()); + else /* .bss id,expr */ + obj_coff_lcomm(); +} + +static void +obj_coff_ident() +{ + segT current_seg = now_seg; /* save current seg */ + subsegT current_subseg = now_subseg; + change_to_section (".comment", 8, 0); /* .comment seg */ + stringer (1); /* read string */ + subseg_new (current_seg, current_subseg); /* restore current seg */ +} + void c_symbol_merge (debug, normal) symbolS *debug; @@ -2067,8 +2122,6 @@ DEFUN (c_line_new, (symbol, paddr, line_number, frag), segment_info_type *s = segment_info + now_seg; new_line->line.l_lnno = line_number; - had_lineno = 1; - if (line_number == 0) { last_line_symbol = symbol; @@ -2221,12 +2274,10 @@ DEFUN_VOID (obj_coff_lcomm) char c; int temp; char *p; - unsigned long vma; symbolS *symbolP; name = input_line_pointer; - c = get_symbol_end (); p = input_line_pointer; *p = c; @@ -2251,30 +2302,40 @@ DEFUN_VOID (obj_coff_lcomm) } *p = 0; - { - /* Allocate zero static local data in the .data section now - instead of the bss section as a symbol with a value */ - char *x; - segT oldseg = now_seg; - int oldsubseg = now_subseg; - - subseg_new (SEG_DATA, 10); - colon (name); - frag_align (2, 0); - record_alignment (SEG_DATA, 4); - x = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0, - temp, (char *) 0); - *x = 0; - - subseg_new (oldseg, oldsubseg); - } - demand_empty_rest_of_line (); + symbolP = symbol_find_or_make(name); + + if (S_GET_SEGMENT(symbolP) == SEG_UNKNOWN && + S_GET_VALUE(symbolP) == 0) + { + if (! need_pass_2) + { + char *p; + segT current_seg = now_seg; /* save current seg */ + subsegT current_subseg = now_subseg; + + subseg_new (SEG_E2, 1); + symbolP->sy_frag = frag_now; + p = frag_var(rs_org, 1, 1, (relax_substateT)0, symbolP, + temp, (char *)0); + *p = 0; + subseg_new (current_seg, current_subseg); /* restore current seg */ + S_SET_SEGMENT(symbolP, SEG_E2); + S_SET_STORAGE_CLASS(symbolP, C_STAT); + } + } + else + as_bad("Symbol %s already defined", name); + + demand_empty_rest_of_line(); } static void -DEFUN (fixup_mdeps, (frags), - fragS * frags) +DEFUN (fixup_mdeps, (frags, h, this_segment), + fragS * frags AND + object_headers * h AND + segT this_segment) { + subseg_change (this_segment, 0); while (frags) { switch (frags->fr_type) @@ -2286,14 +2347,14 @@ DEFUN (fixup_mdeps, (frags), (frags->fr_next->fr_address - frags->fr_address - frags->fr_fix); break; case rs_machine_dependent: - md_convert_frag (0, frags); + md_convert_frag (h, frags); + frag_wane (frags); break; default: ; } frags = frags->fr_next; } - } #if 1 @@ -2469,7 +2530,8 @@ DEFUN (fixup_segment, (segP, this_segment_type), stored in the .text segment (I've checked this on SVR3.2 and SCO 3.2.2) Ian Taylor . */ - add_number += S_GET_VALUE (add_symbolP); + if (S_IS_COMMON (add_symbolP)) + add_number += S_GET_VALUE (add_symbolP); #endif break; diff --git a/gas/config/obj-coffbfd.h b/gas/config/obj-coffbfd.h index 2789546e577..807219a9cb1 100644 --- a/gas/config/obj-coffbfd.h +++ b/gas/config/obj-coffbfd.h @@ -1,4 +1,3 @@ - /* coff object file format Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. @@ -26,6 +25,9 @@ #define WORKING_DOT_WORD #define WARN_SIGNED_OVERFLOW_WORD +/* By default we omit the optional aouthdr. */ +#define OBJ_COFF_OMIT_OPTIONAL_HEADER + #include "targ-cpu.h" #include "bfd.h" diff --git a/gas/config/obj-vms.c b/gas/config/obj-vms.c index 619fe4a466b..af884589552 100644 --- a/gas/config/obj-vms.c +++ b/gas/config/obj-vms.c @@ -4488,9 +4488,11 @@ VMS_Check_For_Main () /* * Write a VAX/VMS object file (everything else has been done!) */ -VMS_write_object_file (text_siz, data_siz, text_frag_root, data_frag_root) +VMS_write_object_file (text_siz, data_siz, bss_siz, text_frag_root, + data_frag_root) unsigned text_siz; unsigned data_siz; + unsigned bss_siz; struct frag *text_frag_root; struct frag *data_frag_root; { @@ -4581,11 +4583,10 @@ VMS_write_object_file (text_siz, data_siz, text_frag_root, data_frag_root) /* * Define the BSS Psect */ - if (local_bss_counter > 0) + if (bss_siz > 0) { Bss_Psect = Psect_Number++; - VMS_Psect_Spec ("$uninitialized_data", local_bss_counter, "DATA", - 0); + VMS_Psect_Spec ("$uninitialized_data", bss_siz, "DATA", 0); } #ifndef gxx_bug_fixed /* diff --git a/gas/config/tc-a29k.c b/gas/config/tc-a29k.c index 23d8228533e..db330d2b1cd 100644 --- a/gas/config/tc-a29k.c +++ b/gas/config/tc-a29k.c @@ -22,7 +22,6 @@ much bloody rewriting required before. There still probably is. */ #include "as.h" -#include "read.h" #include "opcode/a29k.h" diff --git a/gas/config/tc-m88k.c b/gas/config/tc-m88k.c index 31b7ebb7234..949b0d55f0d 100644 --- a/gas/config/tc-m88k.c +++ b/gas/config/tc-m88k.c @@ -22,20 +22,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include "m88k-opcode.h" #include "as.h" -#include "frags.h" -#include "struc-symbol.h" #include "flonum.h" -#include "expr.h" -#include "hash.h" #include "md.h" #include "m88k.h" -#include "write.h" -#include "read.h" -/* -#include "obstack.h" -#include "struc-symbol.h" -*/ -#include "symbols.h" char *getval (); char *get_reg (); @@ -1232,7 +1221,7 @@ s_bss () char *name; char c; char *p; - int temp, bss_align = 1; + int temp, bss_align; symbolS *symbolP; extern const char is_end_of_line[256]; @@ -1261,27 +1250,42 @@ s_bss () { input_line_pointer++; bss_align = get_absolute_expression (); - while (local_bss_counter % bss_align != 0) - local_bss_counter++; } + else + bss_align = 0; - if (symbolP->sy_other == 0 - && symbolP->sy_desc == 0 - && ((symbolP->sy_type == N_BSS - && symbolP->sy_value == local_bss_counter) - || ((symbolP->sy_type & N_TYPE) == N_UNDF - && symbolP->sy_value == 0))) + if (!S_IS_DEFINED(symbolP) + || S_GET_SEGMENT(symbolP) == SEG_BSS) { - symbolP->sy_value = local_bss_counter; - symbolP->sy_type = N_BSS; - symbolP->sy_frag = &bss_address_frag; - local_bss_counter += temp; + if (! need_pass_2) + { + char *p; + segT current_seg = now_seg; + subsegT current_subseg = now_subseg; + + subseg_new (SEG_BSS, 1); /* switch to bss */ + + if (bss_align) + frag_align (bss_align, 0); + + /* detach from old frag */ + if (symbolP->sy_type == N_BSS && symbolP->sy_frag != NULL) + symbolP->sy_frag->fr_symbol = NULL; + + symbolP->sy_frag = frag_now; + p = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP, + temp, (char *)0); + *p = 0; + S_SET_SEGMENT (symbolP, SEG_BSS); + + subseg_new (current_seg, current_subseg); + } } else { - as_warn ("Ignoring attempt to re-define symbol from %d. to %d.", - symbolP->sy_value, local_bss_counter); + as_warn ("Ignoring attempt to re-define symbol %s.", name); } + while (!is_end_of_line[*input_line_pointer]) { input_line_pointer++; diff --git a/gas/config/tc-vax.c b/gas/config/tc-vax.c index 498b32d4f28..3d76647c5b9 100644 --- a/gas/config/tc-vax.c +++ b/gas/config/tc-vax.c @@ -23,7 +23,6 @@ #include "as.h" -#include "read.h" #include "vax-inst.h" #include "obstack.h" /* For FRAG_APPEND_1_CHAR macro in "frags.h" */ @@ -388,20 +387,20 @@ md_assemble (instruction_string) as_fatal ("vax_assemble\"%s\" in=\"%s\"", p, instruction_string); } /* - * Now we try to find as many as_warn()s as we can. If we do any as_warn()s - * then goofed=1. Notice that we don't make any frags yet. - * Should goofed be 1, then this instruction will wedge in any pass, - * and we can safely flush it, without causing interpass symbol phase - * errors. That is, without changing label values in different passes. - */ + * Now we try to find as many as_warn()s as we can. If we do any as_warn()s + * then goofed=1. Notice that we don't make any frags yet. + * Should goofed be 1, then this instruction will wedge in any pass, + * and we can safely flush it, without causing interpass symbol phase + * errors. That is, without changing label values in different passes. + */ if (goofed = (*v.vit_error)) { as_warn ("Ignoring statement due to \"%s\"", v.vit_error); } /* - * We need to use expression() and friends, which require us to diddle - * input_line_pointer. So we save it and restore it later. - */ + * We need to use expression() and friends, which require us to diddle + * input_line_pointer. So we save it and restore it later. + */ save_input_line_pointer = input_line_pointer; for (operandP = v.vit_operand, expP = exp_of_operand, @@ -418,7 +417,8 @@ md_assemble (instruction_string) goofed = 1; } else - { /* statement has no syntax goofs: lets sniff the expression */ + { + /* statement has no syntax goofs: lets sniff the expression */ int can_be_short = 0; /* 1 if a bignum can be reduced to a short literal. */ input_line_pointer = operandP->vop_expr_begin; @@ -431,10 +431,11 @@ md_assemble (instruction_string) /* for BSD4.2 compatibility, missing expression is absolute 0 */ to_seg = expP->X_seg = SEG_ABSOLUTE; expP->X_add_number = 0; - /* for SEG_ABSOLUTE, we shouldnt need to set X_subtract_symbol, X_add_symbol to any - particular value. But, we will program defensively. Since this situation occurs rarely - so it costs us little to do, and stops Dean worrying about the origin of random bits in - expressionS's. */ + /* For SEG_ABSOLUTE, we shouldn't need to set X_subtract_symbol, + X_add_symbol to any particular value. But, we will program + defensively. Since this situation occurs rarely so it costs + us little to do, and stops Dean worrying about the origin of + random bits in expressionS's. */ expP->X_add_symbol = NULL; expP->X_subtract_symbol = NULL; case SEG_TEXT: @@ -447,18 +448,18 @@ md_assemble (instruction_string) case SEG_DIFFERENCE: case SEG_PASS1: /* - * Major bug. We can't handle the case of a - * SEG_DIFFERENCE expression in a VIT_OPCODE_SYNTHETIC - * variable-length instruction. - * We don't have a frag type that is smart enough to - * relax a SEG_DIFFERENCE, and so we just force all - * SEG_DIFFERENCEs to behave like SEG_PASS1s. - * Clearly, if there is a demand we can invent a new or - * modified frag type and then coding up a frag for this - * case will be easy. SEG_DIFFERENCE was invented for the - * .words after a CASE opcode, and was never intended for - * instruction operands. - */ + * Major bug. We can't handle the case of a + * SEG_DIFFERENCE expression in a VIT_OPCODE_SYNTHETIC + * variable-length instruction. + * We don't have a frag type that is smart enough to + * relax a SEG_DIFFERENCE, and so we just force all + * SEG_DIFFERENCEs to behave like SEG_PASS1s. + * Clearly, if there is a demand we can invent a new or + * modified frag type and then coding up a frag for this + * case will be easy. SEG_DIFFERENCE was invented for the + * .words after a CASE opcode, and was never intended for + * instruction operands. + */ need_pass_2 = 1; as_warn ("Can't relocate expression"); break; @@ -1828,10 +1829,10 @@ vip (vitP, instring) c = *p; *p = '\0'; /* - * Here with instring pointing to what better be an op-name, and p - * pointing to character just past that. - * We trust instring points to an op-name, with no whitespace. - */ + * Here with instring pointing to what better be an op-name, and p + * pointing to character just past that. + * We trust instring points to an op-name, with no whitespace. + */ vwP = (struct vot_wot *) hash_find (op_hash, instring); *p = c; /* Restore char after op-code. */ if (vwP == 0) @@ -1843,18 +1844,18 @@ vip (vitP, instring) else { /* - * We found a match! So lets pick up as many operands as the - * instruction wants, and even gripe if there are too many. - * We expect comma to seperate each operand. - * We let instring track the text, while p tracks a part of the - * struct vot. - */ + * We found a match! So lets pick up as many operands as the + * instruction wants, and even gripe if there are too many. + * We expect comma to seperate each operand. + * We let instring track the text, while p tracks a part of the + * struct vot. + */ /* - * The lines below know about 2-byte opcodes starting FD,FE or FF. - * They also understand synthetic opcodes. Note: - * we return 32 bits of opcode, including bucky bits, BUT - * an opcode length is either 8 or 16 bits for vit_opcode_nbytes. - */ + * The lines below know about 2-byte opcodes starting FD,FE or FF. + * They also understand synthetic opcodes. Note: + * we return 32 bits of opcode, including bucky bits, BUT + * an opcode length is either 8 or 16 bits for vit_opcode_nbytes. + */ oc = vwP->vot_code; /* The op-code. */ vitP->vit_opcode_nbytes = (oc & 0xFF) >= 0xFD ? 2 : 1; md_number_to_chars (vitP->vit_opcode, oc, 4); @@ -1867,9 +1868,9 @@ vip (vitP, instring) ) { /* - * Here to parse one operand. Leave instring pointing just - * past any one ',' that marks the end of this operand. - */ + * Here to parse one operand. Leave instring pointing just + * past any one ',' that marks the end of this operand. + */ if (!p[1]) bug = "p"; /* ODD(!!) number of bytes in vot_how?? */ else if (*instring) @@ -1877,9 +1878,9 @@ vip (vitP, instring) for (q = instring; (c = *q) && c != ','; q++) ; /* - * Q points to ',' or '\0' that ends argument. C is that - * character. - */ + * Q points to ',' or '\0' that ends argument. C is that + * character. + */ *q = 0; operandp->vop_width = p[1]; operandp->vop_nbytes = vax_operand_width_size[p[1]]; @@ -2355,12 +2356,13 @@ vip_op_defaults (immediate, indirect, displen) /* can be called any time */ char * /* (code here) bug message, "" = OK */ /* our code bug, NOT bad assembly language */ vip_op (optext, vopP) - char *optext; /* user's input string e.g.: */ - /* "@B^foo@bar(AP)[FP]:" */ - struct vop *vopP; /* In: vop_access, vop_width. */ - /* Out: _ndx, _reg, _mode, _short, _warn, */ - /* _error _expr_begin, _expr_end, _nbytes. */ - /* vop_nbytes : number of bytes in a datum. */ + /* user's input string e.g.: "@B^foo@bar(AP)[FP]:" */ + char *optext; + /* Input fields: vop_access, vop_width. + Output fields: _ndx, _reg, _mode, _short, _warn, + _error _expr_begin, _expr_end, _nbytes. + vop_nbytes : number of bytes in a datum. */ + struct vop *vopP; { char *p; /* track operand text forward */ char *q; /* track operand text backward */ @@ -2467,9 +2469,9 @@ vip_op (optext, vopP) else { /* - * Confusers like "[]" will eventually lose with a bad register - * name error. So again we don't need to check for early '\0'. - */ + * Confusers like "[]" will eventually lose with a bad register + * name error. So again we don't need to check for early '\0'. + */ if (q[3] == ']') ndx = vax_reg_parse (q[1], q[2], 0); else if (q[4] == ']') @@ -2522,9 +2524,9 @@ vip_op (optext, vopP) else { /* - * Confusers like "()" will eventually lose with a bad register - * name error. So again we don't need to check for early '\0'. - */ + * Confusers like "()" will eventually lose with a bad register + * name error. So again we don't need to check for early '\0'. + */ if (q[3] == ')') reg = vax_reg_parse (q[1], q[2], 0); else if (q[4] == ')') @@ -2532,11 +2534,11 @@ vip_op (optext, vopP) else reg = -1; /* - * Since we saw a ')' we will demand a register name in the ')'. - * This is nasty: why can't our hypothetical assembler permit - * parenthesised expressions? BECAUSE I AM LAZY! That is why. - * Abuse luser if we didn't spy a register name. - */ + * Since we saw a ')' we will demand a register name in the ')'. + * This is nasty: why can't our hypothetical assembler permit + * parenthesised expressions? BECAUSE I AM LAZY! That is why. + * Abuse luser if we didn't spy a register name. + */ if (reg < 0) { /* JF allow parenthasized expressions. I hope this works */ @@ -2548,31 +2550,31 @@ vip_op (optext, vopP) else q--; /* point just before '(' of "(...)" */ /* - * If err == "..." then we lost. Run away. - * Otherwise if reg >= 0 then we saw (Rn). - */ + * If err == "..." then we lost. Run away. + * Otherwise if reg >= 0 then we saw (Rn). + */ } /* - * If err == "..." then we lost. - * Otherwise paren==1 and reg = register in "()". - */ + * If err == "..." then we lost. + * Otherwise paren==1 and reg = register in "()". + */ } else paren = 0; /* - * If err == "..." then we lost. - * Otherwise, q points just before "(Rn)", if any. - * If there was a "(...)" then paren==1, and reg is the register. - */ + * If err == "..." then we lost. + * Otherwise, q points just before "(Rn)", if any. + * If there was a "(...)" then paren==1, and reg is the register. + */ /* - * We should only seek '-' of "-(...)" if: - * we saw "(...)" paren == 1 - * we have no errors so far ! *err - * we did not see '+' of "(...)+" sign < 1 - * We don't check len. We want a specific error message later if - * user tries "x^...-(Rn)". This is a feature not a bug. - */ + * We should only seek '-' of "-(...)" if: + * we saw "(...)" paren == 1 + * we have no errors so far ! *err + * we did not see '+' of "(...)+" sign < 1 + * We don't check len. We want a specific error message later if + * user tries "x^...-(Rn)". This is a feature not a bug. + */ if (!*err) { if (paren && sign < 1)/* !sign is adequate test */ @@ -2584,14 +2586,14 @@ vip_op (optext, vopP) } } /* - * We have back-tracked over most - * of the crud at the end of an operand. - * Unless err, we know: sign, paren. If paren, we know reg. - * The last case is of an expression "Rn". - * This is worth hunting for if !err, !paren. - * We wouldn't be here if err. - * We remember to save q, in case we didn't want "Rn" anyway. - */ + * We have back-tracked over most + * of the crud at the end of an operand. + * Unless err, we know: sign, paren. If paren, we know reg. + * The last case is of an expression "Rn". + * This is worth hunting for if !err, !paren. + * We wouldn't be here if err. + * We remember to save q, in case we didn't want "Rn" anyway. + */ if (!paren) { if (*q == ' ' && q >= p) /* Expect all whitespace reduced to ' '. */ @@ -2603,8 +2605,8 @@ vip_op (optext, vopP) else reg = -1; /* always comes here if no register at all */ /* - * Here with a definitive reg value. - */ + * Here with a definitive reg value. + */ if (reg >= 0) { oldq = q; @@ -2614,41 +2616,41 @@ vip_op (optext, vopP) } } /* - * have reg. -1:absent; else 0:15 - */ + * have reg. -1:absent; else 0:15 + */ /* - * We have: err, at, len, hash, ndx, sign, paren, reg. - * Also, any remaining expression is from *p through *q inclusive. - * Should there be no expression, q==p-1. So expression length = q-p+1. - * This completes the first part: parsing the operand text. - */ + * We have: err, at, len, hash, ndx, sign, paren, reg. + * Also, any remaining expression is from *p through *q inclusive. + * Should there be no expression, q==p-1. So expression length = q-p+1. + * This completes the first part: parsing the operand text. + */ /* - * We now want to boil the data down, checking consistency on the way. - * We want: len, mode, reg, ndx, err, p, q, wrn, bug. - * We will deliver a 4-bit reg, and a 4-bit mode. - */ + * We now want to boil the data down, checking consistency on the way. + * We want: len, mode, reg, ndx, err, p, q, wrn, bug. + * We will deliver a 4-bit reg, and a 4-bit mode. + */ /* - * Case of branch operand. Different. No L^B^W^I^S^ allowed for instance. - * - * in: at ? - * len ? - * hash ? - * p:q ? - * sign ? - * paren ? - * reg ? - * ndx ? - * - * out: mode 0 - * reg -1 - * len ' ' - * p:q whatever was input - * ndx -1 - * err " " or error message, and other outputs trashed - */ + * Case of branch operand. Different. No L^B^W^I^S^ allowed for instance. + * + * in: at ? + * len ? + * hash ? + * p:q ? + * sign ? + * paren ? + * reg ? + * ndx ? + * + * out: mode 0 + * reg -1 + * len ' ' + * p:q whatever was input + * ndx -1 + * err " " or error message, and other outputs trashed + */ /* branch operands have restricted forms */ if (!*err && access == 'b') { @@ -2661,24 +2663,24 @@ vip_op (optext, vopP) /* Since nobody seems to use it: comment this 'feature'(?) out for now. */ #ifdef NEVER /* - * Case of stand-alone operand. e.g. ".long foo" - * - * in: at ? - * len ? - * hash ? - * p:q ? - * sign ? - * paren ? - * reg ? - * ndx ? - * - * out: mode 0 - * reg -1 - * len ' ' - * p:q whatever was input - * ndx -1 - * err " " or error message, and other outputs trashed - */ + * Case of stand-alone operand. e.g. ".long foo" + * + * in: at ? + * len ? + * hash ? + * p:q ? + * sign ? + * paren ? + * reg ? + * ndx ? + * + * out: mode 0 + * reg -1 + * len ' ' + * p:q whatever was input + * ndx -1 + * err " " or error message, and other outputs trashed + */ if (!*err) { if (access == ' ') @@ -2730,23 +2732,23 @@ vip_op (optext, vopP) #endif /*#Ifdef NEVER*/ /* - * Case of S^#. - * - * in: at 0 - * len 's' definition - * hash 1 demand - * p:q demand not empty - * sign 0 by paren==0 - * paren 0 by "()" scan logic because "S^" seen - * reg -1 or nn by mistake - * ndx -1 - * - * out: mode 0 - * reg -1 - * len 's' - * exp - * ndx -1 - */ + * Case of S^#. + * + * in: at 0 + * len 's' definition + * hash 1 demand + * p:q demand not empty + * sign 0 by paren==0 + * paren 0 by "()" scan logic because "S^" seen + * reg -1 or nn by mistake + * ndx -1 + * + * out: mode 0 + * reg -1 + * len 's' + * exp + * ndx -1 + */ if (!*err && len == 's') { if (!hash || paren || at || ndx >= 0) @@ -2779,23 +2781,23 @@ vip_op (optext, vopP) } /* - * Case of -(Rn), which is weird case. - * - * in: at 0 - * len ' - * hash 0 - * p:q q

q) { at = 1; @@ -2823,23 +2825,23 @@ vip_op (optext, vopP) } /* - * Case of (Rn)+, which is slightly different. - * - * in: at - * len ' ' - * hash 0 - * p:q q

0) { if (len != ' ' || hash || p <= q) @@ -2856,23 +2858,23 @@ vip_op (optext, vopP) } /* - * Case of #, without S^. - * - * in: at - * len ' ' or 'i' - * hash 1 by definition - * p:q - * sign 0 - * paren 0 - * reg absent - * ndx optional - * - * out: mode 8+@ - * reg PC - * len ' ' or 'i' - * exp - * ndx optional - */ + * Case of #, without S^. + * + * in: at + * len ' ' or 'i' + * hash 1 by definition + * p:q + * sign 0 + * paren 0 + * reg absent + * ndx optional + * + * out: mode 8+@ + * reg PC + * len ' ' or 'i' + * exp + * ndx optional + */ if (!*err && hash) { if (len != 'i' && len != ' ') @@ -2884,10 +2886,10 @@ vip_op (optext, vopP) if (reg >= 0) { /* - * SHIT! we saw #Rnn! Put the Rnn back into the expression. - * By using oldq, we don't need to know how long Rnn was. - * KLUDGE! - */ + * SHIT! we saw #Rnn! Put the Rnn back into the expression. + * By using oldq, we don't need to know how long Rnn was. + * KLUDGE! + */ q = oldq; reg = -1; /* no register any more */ } @@ -2904,29 +2906,29 @@ vip_op (optext, vopP) } } /* - * If !*err, then sign == 0 - * hash == 0 - */ + * If !*err, then sign == 0 + * hash == 0 + */ /* - * Case of Rn. We seperate this one because it has a few special - * errors the remaining modes lack. - * - * in: at optional - * len ' ' - * hash 0 by program logic - * p:q empty - * sign 0 by program logic - * paren 0 by definition - * reg present by definition - * ndx optional - * - * out: mode 5+@ - * reg present - * len ' ' enforce no length - * exp "" enforce empty expression - * ndx optional warn if same as reg - */ + * Case of Rn. We seperate this one because it has a few special + * errors the remaining modes lack. + * + * in: at optional + * len ' ' + * hash 0 by program logic + * p:q empty + * sign 0 by program logic + * paren 0 by definition + * reg present by definition + * ndx optional + * + * out: mode 5+@ + * reg present + * len ' ' enforce no length + * exp "" enforce empty expression + * ndx optional warn if same as reg + */ if (!*err && !paren && reg >= 0) { if (len != ' ') @@ -2943,12 +2945,12 @@ vip_op (optext, vopP) else { /* - * Idea here is to detect from length of datum - * and from register number if we will touch PC. - * Warn if we do. - * vop_nbytes is number of bytes in operand. - * Compute highest byte affected, compare to PC0. - */ + * Idea here is to detect from length of datum + * and from register number if we will touch PC. + * Warn if we do. + * vop_nbytes is number of bytes in operand. + * Compute highest byte affected, compare to PC0. + */ if ((vopP->vop_nbytes + reg * 4) > 60) wrn = "PC part of operand unpredictable"; err = " "; /* win */ @@ -2996,12 +2998,12 @@ vip_op (optext, vopP) } /* - * here with completely specified mode - * len - * reg - * expression p,q - * ndx - */ + * here with completely specified mode + * len + * reg + * expression p,q + * ndx + */ if (*err == ' ') err = ""; /* " " is no longer an error */ diff --git a/gas/config/te-sco386.h b/gas/config/te-sco386.h index da8de1da36c..2c93f0be354 100644 --- a/gas/config/te-sco386.h +++ b/gas/config/te-sco386.h @@ -1,7 +1,7 @@ /* Machine specific defines for the SCO Unix V.3.2 ODT */ #define scounix -/* Return true if s (a non null string pointer), points to a local variable name. */ -#define LOCAL_LABEL(n) ((n)[0] == '.' && (n)[1] == 'L') +/* Local labels start with a period. */ +#define DOT_LABEL_PREFIX /* end of te-sco386.h */