/* write.c - emit .o file
Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
- 1998, 1999, 2000, 2001, 2002
+ 1998, 1999, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
#ifndef TC_FORCE_RELOCATION
#define TC_FORCE_RELOCATION(FIX) \
- (S_FORCE_RELOC ((FIX)->fx_addsy))
+ (generic_force_reloc (FIX))
#endif
#ifndef TC_FORCE_RELOCATION_ABS
return fix_new_internal (frag, where, size, add, sub, off, pcrel, r_type);
}
+/* Generic function to determine whether a fixup requires a relocation. */
+int
+generic_force_reloc (fix)
+ fixS *fix;
+{
+#ifdef BFD_ASSEMBLER
+ if (fix->fx_r_type == BFD_RELOC_VTABLE_INHERIT
+ || fix->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
+ return 1;
+#endif
+ return S_FORCE_RELOC (fix->fx_addsy, fix->fx_subsy == NULL);
+}
+
/* Append a string onto another string, bumping the pointer along. */
void
append (charPP, fromP, length)
else
flags &= ~SEC_RELOC;
x = bfd_set_section_flags (abfd, sec, flags);
- assert (x == true);
+ assert (x);
newsize = md_section_align (sec, size);
x = bfd_set_section_size (abfd, sec, newsize);
- assert (x == true);
+ assert (x);
/* If the size had to be rounded up, add some padding in the last
non-empty frag. */
/* If the symbol is undefined, common, weak, or global (ELF
shared libs), we can't replace it with the section symbol. */
- if (S_FORCE_RELOC (fixp->fx_addsy))
+ if (S_FORCE_RELOC (fixp->fx_addsy, 1))
continue;
/* Is there some other (target cpu dependent) reason we can't adjust
for (fixp = seginfo->fix_root; fixp != (fixS *) NULL; fixp = fixp->fx_next)
{
arelent **reloc;
- char *data;
bfd_reloc_status_type s;
symbolS *sym;
int j;
relocs[i++] = reloc[j];
assert (i <= n);
}
- data = fixp->fx_frag->fr_literal + fixp->fx_where;
if (fixp->fx_where + fixp->fx_size
> fixp->fx_frag->fr_fix + fixp->fx_frag->fr_offset)
as_bad_where (fixp->fx_file, fixp->fx_line,
x = bfd_set_section_contents (stdoutput, sec,
f->fr_literal, (file_ptr) offset,
(bfd_size_type) f->fr_fix);
- if (x == false)
+ if (!x)
{
bfd_perror (stdoutput->filename);
as_perror (_("FATAL: Can't write %s"), stdoutput->filename);
fill_literal,
(file_ptr) offset,
(bfd_size_type) fill_size);
- if (x == false)
+ if (!x)
{
bfd_perror (stdoutput->filename);
as_perror (_("FATAL: Can't write %s"),
x = bfd_set_section_contents
(stdoutput, sec, buf, (file_ptr) offset,
(bfd_size_type) n_per_buf * fill_size);
- if (x != true)
+ if (!x)
as_fatal (_("cannot write to output file"));
offset += n_per_buf * fill_size;
}
int nsyms;
asymbol **asympp;
symbolS *symp;
- boolean result;
+ bfd_boolean result;
extern PTR bfd_alloc PARAMS ((bfd *, bfd_size_type));
/* Count symbols. We can't rely on a count made by the loop in
else
asympp = 0;
result = bfd_set_symtab (stdoutput, asympp, nsyms);
- assert (result == true);
+ assert (result);
symbol_table_frozen = 1;
}
#endif
any alignment is meaningless, and, moreover, will look weird
if we are generating a listing. */
if (!had_errors ())
- alignment = SUB_SEGMENT_ALIGN (now_seg, frchainP);
+ {
+ alignment = SUB_SEGMENT_ALIGN (now_seg, frchainP);
+#ifdef BFD_ASSEMBLER
+ if ((bfd_get_section_flags (now_seg->owner, now_seg) & SEC_MERGE)
+ && now_seg->entsize)
+ {
+ unsigned int entsize = now_seg->entsize;
+ int entalign = 0;
+
+ while ((entsize & 1) == 0)
+ {
+ ++entalign;
+ entsize >>= 1;
+ }
+ if (entalign > alignment)
+ alignment = entalign;
+ }
+#endif
+ }
if (subseg_text_p (now_seg))
frag_align_code (alignment, 0);
/* Relaxation has completed. Freeze all syms. */
finalize_syms = 1;
+#ifdef md_post_relax_hook
+ md_post_relax_hook;
+#endif
+
#ifndef BFD_ASSEMBLER
/* Crawl the symbol chain.
#ifdef OBJ_BOUT
|| fragP->fr_next == data_frag_root
#endif
- || ((fragP->fr_next->fr_address - fragP->fr_address)
+ || ((offsetT) (fragP->fr_next->fr_address - fragP->fr_address)
== (fragP->fr_fix + fragP->fr_offset * fragP->fr_var))))
abort ();
#endif