diff --git a/gas/ChangeLog b/gas/ChangeLog index a28308fab3..865284a7fb 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,16 @@ +1999-06-12 Ian Lance Taylor + + * subsegs.c (subseg_text_p): New function. + * as.h (subseg_text_p): Declare. + * read.c (do_align): Use subseg_text_p to set the default fill. + * write.c (subsegs_finish): Likewise. + * config/obj-coff.c (write_object_file): Likewise. + * config/tc-i386.h (md_maybe_text): Don't define. + (md_do_align): Use subseg_text_p to set the default fill. + * config/tc-m32r.c (m32r_do_align): Likewise. + * config/tc-sh.c (sh_do_align): Likewise. + * config/tc-sparc.h (md_do_align): Likewise. + 1999-06-12 David O'Brien * configure.in: (i[3456]86-*-freebsd*): Now defaults to ELF. diff --git a/gas/as.h b/gas/as.h index 4be36cc163..e72902bf6b 100644 --- a/gas/as.h +++ b/gas/as.h @@ -585,6 +585,7 @@ void subseg_set PARAMS ((segT seg, subsegT subseg)); #ifdef BFD_ASSEMBLER segT subseg_get PARAMS ((const char *, int)); #endif +int subseg_text_p PARAMS ((segT)); void start_dependencies PARAMS ((char *)); void register_dependency PARAMS ((char *)); diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c index a6bdaeee76..e4d51dde74 100644 --- a/gas/config/obj-coff.c +++ b/gas/config/obj-coff.c @@ -3235,6 +3235,7 @@ write_object_file () at the next frag. */ subseg_set (frchain_ptr->frch_seg, frchain_ptr->frch_subseg); + #ifndef SUB_SEGMENT_ALIGN #define SUB_SEGMENT_ALIGN(SEG) 1 #endif @@ -3242,7 +3243,9 @@ write_object_file () md_do_align (SUB_SEGMENT_ALIGN (now_seg), (char *) NULL, 0, 0, alignment_done); #endif - frag_align (SUB_SEGMENT_ALIGN (now_seg), NOP_OPCODE, 0); + frag_align (SUB_SEGMENT_ALIGN (now_seg), + subseg_text_p (now_seg) ? NOP_OPCODE : 0, + 0); #ifdef md_do_align alignment_done: #endif diff --git a/gas/config/tc-i386.h b/gas/config/tc-i386.h index 112e4bc61b..ef778c158e 100644 --- a/gas/config/tc-i386.h +++ b/gas/config/tc-i386.h @@ -1,5 +1,6 @@ /* tc-i386.h -- Header file for tc-i386.c - Copyright (C) 1989, 92, 93, 94, 95, 96, 97, 1998 Free Software Foundation. + Copyright (C) 1989, 92, 93, 94, 95, 96, 97, 98, 1999 + Free Software Foundation. This file is part of GAS, the GNU Assembler. @@ -432,18 +433,10 @@ extern const struct relax_type md_relax_table[]; extern int flag_16bit_code; -#ifdef BFD_ASSEMBLER -#define md_maybe_text() \ - ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0) -#else -#define md_maybe_text() \ - (now_seg != data_section && now_seg != bss_section) -#endif - #define md_do_align(n, fill, len, max, around) \ if ((n) && !need_pass_2 \ && (!(fill) || ((char)*(fill) == (char)0x90 && (len) == 1)) \ - && md_maybe_text ()) \ + && subseg_text_p (now_seg)) \ { \ char *p; \ p = frag_var (rs_align_code, 15, 1, (relax_substateT) max, \ diff --git a/gas/config/tc-m32r.c b/gas/config/tc-m32r.c index 76fb9ab1a6..9a108245b2 100644 --- a/gas/config/tc-m32r.c +++ b/gas/config/tc-m32r.c @@ -245,7 +245,7 @@ m32r_do_align (n, fill, len, max) { /* Only do this if the fill pattern wasn't specified. */ if (fill == NULL - && (now_seg->flags & SEC_CODE) != 0 + && subseg_text_p (now_seg) /* Only do this special handling if aligning to at least a 4 byte boundary. */ && n > 1 diff --git a/gas/config/tc-sh.c b/gas/config/tc-sh.c index e21962cbbe..2752d031cb 100644 --- a/gas/config/tc-sh.c +++ b/gas/config/tc-sh.c @@ -2192,12 +2192,7 @@ sh_do_align (n, fill, len, max) int max; { if (fill == NULL -#ifdef BFD_ASSEMBLER - && (now_seg->flags & SEC_CODE) != 0 -#else - && now_seg != data_section - && now_seg != bss_section -#endif + && subseg_text_p (now_seg) && n > 1) { static const unsigned char big_nop_pattern[] = { 0x00, 0x09 }; diff --git a/gas/config/tc-sparc.h b/gas/config/tc-sparc.h index 2a057642be..d5031f6268 100644 --- a/gas/config/tc-sparc.h +++ b/gas/config/tc-sparc.h @@ -57,7 +57,7 @@ extern int sparc_pic_code; #define md_do_align(n, fill, len, max, around) \ if ((n) && (n) <= 10 && !need_pass_2 && !(fill) \ - && now_seg != data_section && now_seg != bss_section) \ + && subseg_text_p (now_seg)) \ { \ char *p; \ p = frag_var (rs_align_code, 1 << n, 1, (relax_substateT) 1024, \ diff --git a/gas/read.c b/gas/read.c index 9b57438ad3..bd471ff5d7 100644 --- a/gas/read.c +++ b/gas/read.c @@ -1173,21 +1173,7 @@ do_align (n, fill, len, max) if (fill == NULL) { - int maybe_text; - -#ifdef BFD_ASSEMBLER - if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0) - maybe_text = 1; - else - maybe_text = 0; -#else - if (now_seg != data_section && now_seg != bss_section) - maybe_text = 1; - else - maybe_text = 0; -#endif - - if (maybe_text) + if (subseg_text_p (now_seg)) default_fill = NOP_OPCODE; else default_fill = 0; diff --git a/gas/subsegs.c b/gas/subsegs.c index 70dda27903..a8e4b4b5a0 100644 --- a/gas/subsegs.c +++ b/gas/subsegs.c @@ -564,6 +564,21 @@ section_symbol (sec) #endif /* BFD_ASSEMBLER */ +/* Return whether the specified segment is thought to hold text. */ + +int +subseg_text_p (sec) + segT sec; +{ +#ifdef BFD_ASSEMBLER + return (bfd_get_section_flags (stdoutput, sec) & SEC_CODE) != 0; +#else + return (sec != data_section + && sec != bss_section + && strcmp (segment_name (sec), ".eh_frame") != 0); +#endif +} + void subsegs_print_statistics (file) FILE *file; diff --git a/gas/write.c b/gas/write.c index cd74c702e9..3a49234383 100644 --- a/gas/write.c +++ b/gas/write.c @@ -1372,7 +1372,8 @@ subsegs_finish () any alignment is meaningless, and, moreover, will look weird if we are generating a listing. */ frag_align (had_errors () ? 0 : SUB_SEGMENT_ALIGN (now_seg), - NOP_OPCODE, 0); + subseg_text_p (now_seg) ? NOP_OPCODE : 0, + 0); /* frag_align will have left a new frag. Use this last frag for an empty ".fill".