aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-h8300.c36
2 files changed, 39 insertions, 2 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 5bb6f2b..d038b8c 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -7,6 +7,11 @@
Fri Aug 31 12:05:13 2001 J"orn Rennecke <amylaar@redhat.com>
Jeff Law <law@redhat.com>
+ * config/tc-h8300.c (build_bytes): For OBJ_ELF, make relocation's
+ offset match H8 ELF spec.
+ (md_section_align): Alternate implementation for BFD_ASSEMBLER.
+ (md_apply_fix): Fix argument and return types for BFD_ASSEMBLER.
+
* tc-h8300.c (relocation mappings): Remove. Moved to tc-h8300.h.
(build_bytes): Mark fixups for PCrel branches as signed. For
OBJ_ELF, make sure the reloc's offset points to the first byte
diff --git a/gas/config/tc-h8300.c b/gas/config/tc-h8300.c
index 19ec6df..f4f5063 100644
--- a/gas/config/tc-h8300.c
+++ b/gas/config/tc-h8300.c
@@ -1140,6 +1140,16 @@ build_bytes (this_try, operand)
}
else if (x & ABSJMP)
{
+ int where = 0;
+
+#ifdef OBJ_ELF
+ /* To be compatible with the proposed H8 ELF format, we
+ want the relocation's offset to point to the first byte
+ that will be modified, not to the start of the instruction. */
+ where += 1;
+
+
+#endif
/* This jmp may be a jump or a branch. */
check_operand (operand + i, Hmode ? 0xffffff : 0xffff, "@");
@@ -1152,7 +1162,7 @@ build_bytes (this_try, operand)
operand[i].exp.X_add_number =
((operand[i].exp.X_add_number & 0xffff) ^ 0x8000) - 0x8000;
fix_new_exp (frag_now,
- output - frag_now->fr_literal,
+ output - frag_now->fr_literal + where,
4,
&operand[i].exp,
0,
@@ -1458,21 +1468,43 @@ md_convert_frag (headers, seg, fragP)
abort ();
}
+#ifdef BFD_ASSEMBLER
+valueT
+md_section_align (segment, size)
+ segT segment;
+ valueT size;
+{
+ int align = bfd_get_section_alignment (stdoutput, segment);
+ return ((size + (1 << align) - 1) & (-1 << align));
+}
+#else
valueT
md_section_align (seg, size)
segT seg;
valueT size;
{
return ((size + (1 << section_alignment[(int) seg]) - 1)
- & (-1 << section_alignment[(int) seg]));
+ & (-1 << section_alignment[(int) seg]));
}
+#endif
+
+#ifdef BFD_ASSEMBLER
+int
+md_apply_fix (fixP, valp)
+ fixS *fixP;
+ valueT *valp;
+#else
void
md_apply_fix (fixP, val)
fixS *fixP;
long val;
+#endif
{
char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
+#ifdef BFD_ASSEMBLER
+ long val = *valp;
+#endif
switch (fixP->fx_size)
{