From d7bf6158eb08d2d5630e2aa63776268ecc2219c2 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 14 Feb 1997 22:49:25 +0000 Subject: [PATCH] * read.c (do_align): Add max parameter. Change all callers. Remove useless static variables. (s_align): New static function. Do common portion of s_align_bytes and s_align_ptwo. (s_align_bytes, s_align_ptwo): Just call s_align. * frags.c (frag_align): Add max parameter. Change all callers. (frag_align_pattern): Likewise. * frags.h (frag_align, frag_align_pattern): Update declarations. * write.c (relax_segment): Limit alignment change to fr_subtype. Fix some types to be addressT. * config/obj-coff.c (size_section): Likewise. * config/obj-ieee.c (size_section): Likewise. * config/tc-d10v.h (md_do_align): Add max parameter. * config/tc-i386.h (md_do_align): Likewise. * config/tc-m88k.h (md_do_align): Likewise. * config/tc-m88k.c (m88k_do_align): Likewise. * config/tc-sh.h (md_do_align): Likewise. * config/tc-sh.c (sh_do_align): Likewise. * as.h: Improve comments on rs_align and rs_align_code. * doc/as.texinfo: Document new alignment arguments. * doc/internals.texi (Frags): Document use of fr_subtype field for rs_align and rs_align_code. --- gas/ChangeLog | 29 +++++++++++++++++++++ gas/config/obj-coff.c | 58 +++++++++++++++++++++++++++++++++++++----- gas/config/obj-ieee.c | 19 ++++++++++---- gas/config/tc-d10v.h | 6 +++-- gas/config/tc-i386.h | 56 +++++++++++++++++++++++++++++++++++++--- gas/config/tc-m88k.c | 14 +++++----- gas/config/tc-m88k.h | 11 ++++---- gas/doc/internals.texi | 16 ++++++++++-- 8 files changed, 178 insertions(+), 31 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 1380dab7153..103e5793c07 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,32 @@ +Fri Feb 14 17:24:48 1997 Ian Lance Taylor + + * read.c (do_align): Add max parameter. Change all callers. + Remove useless static variables. + (s_align): New static function. Do common portion of + s_align_bytes and s_align_ptwo. + (s_align_bytes, s_align_ptwo): Just call s_align. + * frags.c (frag_align): Add max parameter. Change all callers. + (frag_align_pattern): Likewise. + * frags.h (frag_align, frag_align_pattern): Update declarations. + * write.c (relax_segment): Limit alignment change to fr_subtype. + Fix some types to be addressT. + * config/obj-coff.c (size_section): Likewise. + * config/obj-ieee.c (size_section): Likewise. + * config/tc-d10v.h (md_do_align): Add max parameter. + * config/tc-i386.h (md_do_align): Likewise. + * config/tc-m88k.h (md_do_align): Likewise. + * config/tc-m88k.c (m88k_do_align): Likewise. + * config/tc-sh.h (md_do_align): Likewise. + * config/tc-sh.c (sh_do_align): Likewise. + * as.h: Improve comments on rs_align and rs_align_code. + * doc/as.texinfo: Document new alignment arguments. + * doc/internals.texi (Frags): Document use of fr_subtype field for + rs_align and rs_align_code. + +Fri Feb 14 15:56:06 1997 Gavin Koch + + * config/tc-mips.c: Changed opcode parsing. + Thu Feb 13 20:02:16 1997 Fred Fish * config/{tc-alpha.h, tc-arc.h, tc-d10v.h, tc-generic.h, tc-i960.h, diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c index 86e9a82e761..7a2b6de093b 100644 --- a/gas/config/obj-coff.c +++ b/gas/config/obj-coff.c @@ -1524,8 +1524,15 @@ size_section (abfd, idx) break; case rs_align: case rs_align_code: - size += frag->fr_fix; - size += relax_align (size, frag->fr_offset); + { + addressT off; + + size += frag->fr_fix; + off = relax_align (size, frag->fr_offset); + if (frag->fr_subtype != 0 && off > frag->fr_subtype) + off = 0; + size += off; + } break; default: BAD_CASE (frag->fr_type); @@ -1648,7 +1655,16 @@ do_relocs_for (abfd, h, file_cursor) while (symbol_ptr->sy_value.X_op == O_symbol && (! S_IS_DEFINED (symbol_ptr) || S_IS_COMMON (symbol_ptr))) - symbol_ptr = symbol_ptr->sy_value.X_add_symbol; + { + symbolS *n; + + /* We must avoid looping, as that can occur + with a badly written program. */ + n = symbol_ptr->sy_value.X_add_symbol; + if (n == symbol_ptr) + break; + symbol_ptr = n; + } /* Turn the segment of the symbol into an offset. */ if (symbol_ptr) @@ -3106,10 +3122,10 @@ write_object_file () #ifdef md_do_align { static char nop = NOP_OPCODE; - md_do_align (SUB_SEGMENT_ALIGN (now_seg), &nop, 1, alignment_done); + md_do_align (SUB_SEGMENT_ALIGN (now_seg), &nop, 1, 0, alignment_done); } #endif - frag_align (SUB_SEGMENT_ALIGN (now_seg), NOP_OPCODE); + frag_align (SUB_SEGMENT_ALIGN (now_seg), NOP_OPCODE, 0); #ifdef md_do_align alignment_done: #endif @@ -3848,6 +3864,34 @@ fixup_segment (segP, this_segment_type) happened if these are expression symbols. */ if (add_symbolP != NULL && ! add_symbolP->sy_resolved) resolve_symbol_value (add_symbolP); + + if (add_symbolP != NULL) + { + /* If this fixup is against a symbol which has been equated + to another symbol, convert it to the other symbol. */ + if (add_symbolP->sy_value.X_op == O_symbol + && (! S_IS_DEFINED (add_symbolP) + || S_IS_COMMON (add_symbolP))) + { + while (add_symbolP->sy_value.X_op == O_symbol + && (! S_IS_DEFINED (add_symbolP) + || S_IS_COMMON (add_symbolP))) + { + symbolS *n; + + /* We must avoid looping, as that can occur with a + badly written program. */ + n = add_symbolP->sy_value.X_add_symbol; + if (n == add_symbolP) + break; + add_number += add_symbolP->sy_value.X_add_number; + add_symbolP = n; + } + fixP->fx_addsy = add_symbolP; + fixP->fx_offset = add_number; + } + } + if (sub_symbolP != NULL && ! sub_symbolP->sy_resolved) resolve_symbol_value (sub_symbolP); @@ -4096,12 +4140,12 @@ fixup_segment (segP, this_segment_type) && ((add_number & ~0xFF) || (fixP->fx_signed && (add_number & 0x80))) && ((add_number & ~0xFF) != (-1 & ~0xFF) - || (fixP->fx_signed && (add_number & 0x80) == 0))) + || (add_number & 0x80) == 0)) || (size == 2 && ((add_number & ~0xFFFF) || (fixP->fx_signed && (add_number & 0x8000))) && ((add_number & ~0xFFFF) != (-1 & ~0xFFFF) - || (fixP->fx_signed && (add_number & 0x8000) == 0)))) + || (add_number & 0x8000) == 0))) { as_bad_where (fixP->fx_file, fixP->fx_line, "Value of %ld too large for field of %d bytes at 0x%lx", diff --git a/gas/config/obj-ieee.c b/gas/config/obj-ieee.c index c4217d1d911..973e80536ea 100644 --- a/gas/config/obj-ieee.c +++ b/gas/config/obj-ieee.c @@ -1,5 +1,5 @@ /* obj-format for ieee-695 records. - Copyright (C) 1991, 1992 Free Software Foundation, Inc. + Copyright (C) 1991, 92, 93, 94, 95, 1997 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -14,8 +14,9 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with GAS; see the file COPYING. If not, write to - the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + along with GAS; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ /* @@ -76,7 +77,15 @@ DEFUN (size_section, (abfd, idx), size += frag->fr_offset * frag->fr_var; break; case rs_align: - size += relax_align (size, frag->fr_offset); + case rs_align_code: + { + addressT off; + + off = relax_align (size, frag->fr_offset); + if (frag->fr_subtype != 0 && off > frag->fr_subtype) + off = 0; + size += off; + } } frag = frag->fr_next; } @@ -529,7 +538,7 @@ DEFUN_VOID (write_object_file) #ifndef SUB_SEGMENT_ALIGN #define SUB_SEGMENT_ALIGN(SEG) 2 #endif - frag_align (SUB_SEGMENT_ALIGN (now_seg), 0); + frag_align (SUB_SEGMENT_ALIGN (now_seg), 0, 0); frag_wane (frag_now); frag_now->fr_fix = 0; know (frag_now->fr_next == NULL); diff --git a/gas/config/tc-d10v.h b/gas/config/tc-d10v.h index b87d66342c9..9194cd3a5da 100644 --- a/gas/config/tc-d10v.h +++ b/gas/config/tc-d10v.h @@ -1,5 +1,5 @@ /* tc-d10v.h -- Header file for tc-d10v.c. - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. Written by Martin Hunt, Cygnus Support. This file is part of GAS, the GNU Assembler. @@ -20,6 +20,8 @@ #define TC_D10V +#define TARGET_BYTES_BIG_ENDIAN 0 + #ifndef BFD_ASSEMBLER #error D10V support requires BFD_ASSEMBLER #endif @@ -50,7 +52,7 @@ int d10v_cleanup PARAMS ((void)); #define md_after_pass_hook() d10v_cleanup() #define md_cleanup() d10v_cleanup() -#define md_do_align(a,b,c,d) d10v_cleanup() +#define md_do_align(a,b,c,d,e) d10v_cleanup() #define TC_START_LABEL(ch, ptr) (ch == ':' && d10v_cleanup()) diff --git a/gas/config/tc-i386.h b/gas/config/tc-i386.h index c3e84fbb348..034476f0995 100644 --- a/gas/config/tc-i386.h +++ b/gas/config/tc-i386.h @@ -1,5 +1,5 @@ /* tc-i386.h -- Header file for tc-i386.c - Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation. + Copyright (C) 1989, 92, 93, 94, 95, 96, 1997 Free Software Foundation. This file is part of GAS, the GNU Assembler. @@ -20,6 +20,8 @@ #ifndef TC_I386 #define TC_I386 1 +#define TARGET_BYTES_BIG_ENDIAN 0 + #ifdef TE_LYNX #define TARGET_FORMAT "coff-i386-lynx" #endif @@ -59,7 +61,6 @@ && (FIX)->fx_r_type != BFD_RELOC_386_GOTPC) #define TARGET_ARCH bfd_arch_i386 -#define TARGET_BYTES_BIG_ENDIAN 0 #ifdef OBJ_AOUT #ifdef TE_NetBSD @@ -90,17 +91,26 @@ #define COFF_MAGIC I386MAGIC #define BFD_ARCH bfd_arch_i386 #define COFF_FLAGS F_AR32WR -#define TC_COUNT_RELOC(x) ((x)->fx_addsy /* ||(x)->fx_subsy||(x)->fx_offset */) +#define TC_COUNT_RELOC(x) ((x)->fx_addsy || (x)->fx_r_type==7) +#define TC_FORCE_RELOCATION(x) ((x)->fx_r_type==7) #define TC_COFF_FIX2RTYPE(fixP) tc_coff_fix2rtype(fixP) extern short tc_coff_fix2rtype (); #define TC_COFF_SIZEMACHDEP(frag) tc_coff_sizemachdep(frag) extern int tc_coff_sizemachdep PARAMS ((fragS *frag)); #define SUB_SEGMENT_ALIGN(SEG) 2 - +#define TC_RVA_RELOC 7 /* Need this for PIC relocations */ #define NEED_FX_R_TYPE + +#ifdef TE_386BSD +/* The BSDI linker apparently rejects objects with a machine type of + M_386 (100). */ +#define AOUT_MACHTYPE 0 +#else #define AOUT_MACHTYPE 100 +#endif + #undef REVERSE_SORT_RELOCS #endif /* ! BFD_ASSEMBLER */ @@ -113,11 +123,13 @@ extern int tc_coff_sizemachdep PARAMS ((fragS *frag)); #define tc_coff_symbol_emit_hook(a) ; /* not used */ #ifndef OBJ_AOUT +#ifndef TE_PE /* Local labels starts with .L */ #define LOCAL_LABEL(name) (name[0] == '.' \ && (name[1] == 'L' || name[1] == 'X' || name[1] == '.')) #define FAKE_LABEL_NAME ".L0\001" #endif +#endif #define LOCAL_LABELS_FB 1 #define tc_aout_pre_write_hook(x) {;} /* not used */ @@ -363,4 +375,40 @@ void i386_validate_fix (); extern const struct relax_type md_relax_table[]; #define TC_GENERIC_RELAX_TABLE md_relax_table + +extern int flag_16bit_code; + +#define md_do_align(n, fill, len, max, around) \ +if ((n) && !need_pass_2 \ + && (!(fill) || ((char)*(fill) == (char)0x90 && (len) == 1)) \ + && now_seg != data_section && now_seg != bss_section) \ + { \ + char *p; \ + p = frag_var (rs_align_code, 15, 1, (relax_substateT) max, \ + (symbolS *) 0, (long) (n), (char *) 0); \ + *p = 0x90; \ + goto around; \ + } + +extern void i386_align_code PARAMS ((fragS *, int)); + +#define HANDLE_ALIGN(fragP) \ +if (fragP->fr_type == rs_align_code) \ + i386_align_code (fragP, (fragP->fr_next->fr_address \ + - fragP->fr_address \ + - fragP->fr_fix)); + +/* call md_apply_fix3 with segment instead of md_apply_fix */ +#define MD_APPLY_FIX3 + +void i386_print_statistics PARAMS ((FILE *)); +#define tc_print_statistics i386_print_statistics + +#define md_number_to_chars number_to_chars_littleendian + +#ifdef SCO_ELF +#define tc_init_after_args() sco_id () +extern void sco_id PARAMS ((void)); +#endif + /* end of tc-i386.h */ diff --git a/gas/config/tc-m88k.c b/gas/config/tc-m88k.c index ca49ac261ff..47b154d48de 100644 --- a/gas/config/tc-m88k.c +++ b/gas/config/tc-m88k.c @@ -1,7 +1,7 @@ /* m88k.c -- Assembler for the Motorola 88000 Contributed by Devon Bowen of Buffalo University and Torbjorn Granlund of the Swedish Institute of Computer Science. - Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 1996 + Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -17,8 +17,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +along with GAS; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. */ #include #include "as.h" @@ -1291,7 +1292,7 @@ s_bss () subseg_set (SEG_BSS, 1); /* switch to bss */ if (bss_align) - frag_align (bss_align, 0); + frag_align (bss_align, 0, 0); /* detach from old frag */ if (symbolP->sy_type == N_BSS && symbolP->sy_frag != NULL) @@ -1433,16 +1434,17 @@ md_pcrel_from (fixp) /* When we align the .init section, insert the correct NOP pattern. */ int -m88k_do_align (n, fill, len) +m88k_do_align (n, fill, max, len) int n; const char *fill; int len; + int max; { if ((fill == NULL || (*fill == 0 && len == 1)) && strcmp (obj_segment_name (now_seg), ".init") == 0) { static const unsigned char nop_pattern[] = { 0xf4, 0x00, 0x58, 0x00 }; - frag_align_pattern (n, nop_pattern, sizeof (nop_pattern)); + frag_align_pattern (n, nop_pattern, sizeof (nop_pattern), max); return 1; } return 0; diff --git a/gas/config/tc-m88k.h b/gas/config/tc-m88k.h index d96852e30f7..f26580f3cac 100644 --- a/gas/config/tc-m88k.h +++ b/gas/config/tc-m88k.h @@ -1,7 +1,7 @@ /* m88k.h -- Assembler for the Motorola 88000 Contributed by Devon Bowen of Buffalo University and Torbjorn Granlund of the Swedish Institute of Computer Science. - Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 1996 + Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -17,8 +17,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +along with GAS; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. */ #define TC_M88K @@ -98,7 +99,7 @@ struct reloc_info_m88k /* We use a special alignment function to insert the correct nop pattern in .init. */ -extern int m88k_do_align PARAMS ((int, const char *, int)); -#define md_do_align(n,fill,len,l) if (m88k_do_align(n,fill,len)) goto l +extern int m88k_do_align PARAMS ((int, const char *, int, int)); +#define md_do_align(n,fill,len,max,l) if (m88k_do_align(n,fill,max,len)) goto l #endif /* M88KCOFF */ diff --git a/gas/doc/internals.texi b/gas/doc/internals.texi index 9c418db6c82..a2d2a756c49 100644 --- a/gas/doc/internals.texi +++ b/gas/doc/internals.texi @@ -495,8 +495,11 @@ The start of the following frag should be aligned on some boundary. In this frag, @code{fr_offset} is the logarithm (base 2) of the alignment in bytes. (For example, if alignment on an 8-byte boundary were desired, @code{fr_offset} would have a value of 3.) The variable characters indicate the fill pattern to -be used. Target backends can use @code{rs_align_code} to handle certain types -of alignment differently. +be used. The @code{fr_subtype} field holds the maximum number of bytes to skip +when doing this alignment. If more bytes are needed, the alignment is not +done. An @code{fr_subtype} value of 0 means no maximum, which is the normal +case. Target backends can use @code{rs_align_code} to handle certain types of +alignment differently. @item rs_broken_word This indicates that ``broken word'' processing should be done (@pxref{Broken @@ -858,6 +861,15 @@ expression. You can define this to handle special symbols in a special way. If a symbol always has a certain value, you should normally enter it in the symbol table, perhaps using @code{reg_section}. +@item md_undefined_symbol +@cindex md_undefined_symbol +GAS will call this function when a symbol table lookup fails, before it +creates a new symbol. Typically this would be used to supply symbols whose +name or value changes dynamically, possibly in a context sensitive way. +Predefined symbols with fixed values, such as register names or condition +codes, are typically entered directly into the symbol table when @code{md_begin} +is called. + @item md_operand @cindex md_operand GAS will call this function for any expression that can not be recognized. -- 2.30.2