/* obj-format for ieee-695 records.
- Copyright 1991, 1992, 1993, 1994, 1997, 2000
+ Copyright 1991, 1992, 1993, 1994, 1997, 2000, 2001, 2002, 2003, 2005
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
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. */
+ Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
+ 02110-1301, USA. */
/* Created by Steve Chamberlain <steve@cygnus.com>. */
reloc_ptr_vector[i] = to;
to->howto = (reloc_howto_type *) (from->fx_r_type);
-#if 0
- /* We can't represent complicated things in a reloc yet. */
- if (from->fx_addsy == 0 || from->fx_subsy != 0)
- abort ();
-#endif
-
s = &(from->fx_addsy->sy_symbol.sy);
to->address = ((char *) (from->fx_frag->fr_address +
from->fx_where))
from = from->fx_next;
}
- /* Attatch to the section. */
+ /* Attach to the section. */
section->orelocation = reloc_ptr_vector;
section->reloc_count = nrelocs;
section->flags |= SEC_LOAD;
input_line_pointer = p;
}
-void cons ();
-void s_ignore ();
-
-void s_globl ();
const pseudo_typeS obj_pseudo_table[] =
{
{"section", obj_ieee_section, 0},
}
#if 1
+
+#ifndef SUB_SEGMENT_ALIGN
+#ifdef HANDLE_ALIGN
+/* The last subsegment gets an alignment corresponding to the alignment
+ of the section. This allows proper nop-filling at the end of
+ code-bearing sections. */
+#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) \
+ (!(FRCHAIN)->frch_next || (FRCHAIN)->frch_next->frch_seg != (SEG) \
+ ? get_recorded_alignment (SEG) : 0)
+#else
+#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 2
+#endif
+#endif
+
extern void
write_object_file ()
{
subseg_set (1, 0);
subseg_set (2, 0);
subseg_set (3, 0);
+
+ /* Run through all the sub-segments and align them up. Also
+ close any open frags. We tack a .fill onto the end of the
+ frag chain so that any .align's size can be worked by looking
+ at the next frag. */
for (frchain_ptr = frchain_root;
frchain_ptr != (struct frchain *) NULL;
frchain_ptr = frchain_ptr->frch_next)
{
- /* Run through all the sub-segments and align them up. Also
- close any open frags. We tack a .fill onto the end of the
- frag chain so that any .align's size can be worked by looking
- at the next frag. */
+ int alignment;
subseg_set (frchain_ptr->frch_seg, frchain_ptr->frch_subseg);
-#ifndef SUB_SEGMENT_ALIGN
-#define SUB_SEGMENT_ALIGN(SEG) 2
+
+ alignment = SUB_SEGMENT_ALIGN (now_seg, frchain_ptr)
+
+#ifdef md_do_align
+ md_do_align (alignment, (char *) NULL, 0, 0, alignment_done);
#endif
- frag_align (SUB_SEGMENT_ALIGN (now_seg), 0, 0);
+ if (subseg_text_p (now_seg))
+ frag_align_code (alignment, 0);
+ else
+ frag_align (alignment, 0, 0);
+
+#ifdef md_do_align
+ alignment_done:
+#endif
+
frag_wane (frag_now);
frag_now->fr_fix = 0;
know (frag_now->fr_next == NULL);
fragS **prev_frag_ptr_ptr;
struct frchain *next_frchain_ptr;
-#if 0
- struct frag **head_ptr = segment_info[i].frag_root;
-#endif
-
segment_info[i].frag_root = segment_info[i].frchainP->frch_root;
-#if 0
- /* I'm not sure what this is for. */
- for (frchain_ptr = segment_info[i].frchainP->frch_root;
- frchain_ptr != (struct frchain *) NULL;
- frchain_ptr = frchain_ptr->frch_next)
- {
- *head_ptr = frchain_ptr;
- head_ptr = &frchain_ptr->next;
- }
-#endif
}
for (i = SEG_E0; i < SEG_UNKNOWN; i++)