aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2001-05-28 09:23:54 +0000
committerNick Clifton <nickc@redhat.com>2001-05-28 09:23:54 +0000
commit0f2712edc99c8717cd41a05b6fede5ba9ff8b35d (patch)
tree393fbe4e8d50197c60c94210e08ed34f14d1adb4 /gas
parentc04a062df3a62d69cdf5e75fe01c5cd3dec4435e (diff)
downloadgdb-0f2712edc99c8717cd41a05b6fede5ba9ff8b35d.zip
gdb-0f2712edc99c8717cd41a05b6fede5ba9ff8b35d.tar.gz
gdb-0f2712edc99c8717cd41a05b6fede5ba9ff8b35d.tar.bz2
Add support for .uahword, .uaword and .uaxword pseudo ops
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog9
-rw-r--r--gas/config/tc-sparc.c33
-rw-r--r--gas/testsuite/ChangeLog70
-rw-r--r--gas/testsuite/gas/sparc/sparc.exp1
-rw-r--r--gas/testsuite/gas/sparc/unalign.d18
-rw-r--r--gas/testsuite/gas/sparc/unalign.s15
6 files changed, 120 insertions, 26 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 1a623ad..0fe7e5b 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,12 @@
+2001-05-28 Jeff Sturm <jsturm@one-point.com>
+
+ * config/tc-sparc.c (md_apply_fix3): Handle BFD_RELOC_SPARC_UA16,
+ BFD_RELOC_SPARC_UA32 and BFD_RELOC_SPARC_UA64.
+ (tc_gen_reloc): Likewise.
+ (sparc_cons_align): Don't clear sparc_no_align_cons.
+ (cons_fix_new_sparc): Substitute BFD_RELOC_SPARC_UA{16|32|64} for
+ BFD_RELOC_{16|32|64} iff sparc_no_align_cons is set.
+
2001-05-27 Alan Modra <amodra@one.net.au>
* write.c (relax_segment <rs_space>): Check the section of a
diff --git a/gas/config/tc-sparc.c b/gas/config/tc-sparc.c
index dc90f5d..558dc89 100644
--- a/gas/config/tc-sparc.c
+++ b/gas/config/tc-sparc.c
@@ -2971,16 +2971,19 @@ md_apply_fix3 (fixP, value, segment)
/* If this is a data relocation, just output VAL. */
- if (fixP->fx_r_type == BFD_RELOC_16)
+ if (fixP->fx_r_type == BFD_RELOC_16
+ || fixP->fx_r_type == BFD_RELOC_SPARC_UA16)
{
md_number_to_chars (buf, val, 2);
}
else if (fixP->fx_r_type == BFD_RELOC_32
+ || fixP->fx_r_type == BFD_RELOC_SPARC_UA32
|| fixP->fx_r_type == BFD_RELOC_SPARC_REV32)
{
md_number_to_chars (buf, val, 4);
}
- else if (fixP->fx_r_type == BFD_RELOC_64)
+ else if (fixP->fx_r_type == BFD_RELOC_64
+ || fixP->fx_r_type == BFD_RELOC_SPARC_UA64)
{
md_number_to_chars (buf, val, 8);
}
@@ -3316,6 +3319,9 @@ tc_gen_reloc (section, fixp)
case BFD_RELOC_SPARC_LOX10:
case BFD_RELOC_SPARC_REV32:
case BFD_RELOC_SPARC_OLO10:
+ case BFD_RELOC_SPARC_UA16:
+ case BFD_RELOC_SPARC_UA32:
+ case BFD_RELOC_SPARC_UA64:
case BFD_RELOC_VTABLE_ENTRY:
case BFD_RELOC_VTABLE_INHERIT:
code = fixp->fx_r_type;
@@ -4066,12 +4072,9 @@ sparc_cons_align (nbytes)
if (! enforce_aligned_data)
return;
+ /* Don't align if this is an unaligned pseudo-op. */
if (sparc_no_align_cons)
- {
- /* This is an unaligned pseudo-op. */
- sparc_no_align_cons = 0;
- return;
- }
+ return;
nalign = log2 (nbytes);
if (nalign == 0)
@@ -4196,9 +4199,23 @@ cons_fix_new_sparc (frag, where, nbytes, exp)
(nbytes == 2 ? BFD_RELOC_16 :
(nbytes == 4 ? BFD_RELOC_32 : BFD_RELOC_64)));
- if (target_little_endian_data && nbytes == 4
+ if (target_little_endian_data
+ && nbytes == 4
&& now_seg->flags & SEC_ALLOC)
r = BFD_RELOC_SPARC_REV32;
+
+ if (sparc_no_align_cons)
+ {
+ switch (nbytes)
+ {
+ case 2: r = BFD_RELOC_SPARC_UA16; break;
+ case 4: r = BFD_RELOC_SPARC_UA32; break;
+ case 8: r = BFD_RELOC_SPARC_UA64; break;
+ default: abort ();
+ }
+ sparc_no_align_cons = 0;
+ }
+
fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
}
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index b74d3ad..369da2f 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,24 +1,58 @@
+2001-05-28 Jeff Sturm <jsturm@one-point.com>
+
+ * gas/sparc/unalign.s: New test. Check unaligned relocs.
+ * gas/sparc/unalign.d: New expected test results.
+ * gas/sparc/sparc.exp: Run new test.
+
2001-05-27 Hans-Peter Nilsson <hp@axis.com>
* gas/cris/addi.d: Tweak for 64-bit BFD.
- * gas/cris/binop-cmpmove.d, gas/cris/binop-cmpmovx.d,
- gas/cris/binop-extx.d, gas/cris/binop.d, gas/cris/bork.d,
- gas/cris/branch.d, gas/cris/break.d, gas/cris/brokw-1.d,
- gas/cris/brokw-2.d, gas/cris/brokw-3.d, gas/cris/ccr.d,
- gas/cris/clear.d, gas/cris/continue.d, gas/cris/fragtest.d,
- gas/cris/jump-type.d, gas/cris/labfloat.d, gas/cris/macroat.d,
- gas/cris/movem-to-reg.d, gas/cris/nosep.d, gas/cris/oneop-type.d,
- gas/cris/prefix.d, gas/cris/pushpop-byte-sreg.d,
- gas/cris/pushpop-dword-sreg.d, gas/cris/pushpop-word-sreg.d,
- gas/cris/pushpop.d, gas/cris/quick-s6.d, gas/cris/quick-u5.d,
- gas/cris/quick-u6.d, gas/cris/range-err-1.s, gas/cris/rd-pic-1.d,
- gas/cris/rd-regprefix-1.d, gas/cris/rd-regprefix-1b.d,
- gas/cris/reg-to-mem.d, gas/cris/regreg.d, gas/cris/return.d,
- gas/cris/scc.d, gas/cris/separator.d, gas/cris/shexpr-1.d,
- gas/cris/sreg-to-x.d, gas/cris/test.d, gas/cris/unimplemented.d,
- gas/cris/unop-mem.d, gas/cris/x-to-byte-sreg.d,
- gas/cris/x-to-dcr1-sreg.d, gas/cris/x-to-dword-sreg.d,
- gas/cris/x-to-word-sreg.d: Ditto.
+ * gas/cris/binop-cmpmove.d: Ditto.
+ * gas/cris/binop-cmpmovx.d: Ditto.
+ * gas/cris/binop-extx.d: Ditto.
+ * gas/cris/binop.d: Ditto.
+ * gas/cris/bork.d: Ditto.
+ * gas/cris/branch.d: Ditto.
+ * gas/cris/break.d: Ditto.
+ * gas/cris/brokw-1.d: Ditto.
+ * gas/cris/brokw-2.d: Ditto.
+ * gas/cris/brokw-3.d: Ditto.
+ * gas/cris/ccr.d: Ditto.
+ * gas/cris/clear.d: Ditto.
+ * gas/cris/continue.d: Ditto.
+ * gas/cris/fragtest.d: Ditto.
+ * gas/cris/jump-type.d: Ditto.
+ * gas/cris/labfloat.d: Ditto.
+ * gas/cris/macroat.d: Ditto.
+ * gas/cris/movem-to-reg.d: Ditto.
+ * gas/cris/nosep.d: Ditto.
+ * gas/cris/oneop-type.d: Ditto.
+ * gas/cris/prefix.d: Ditto.
+ * gas/cris/pushpop-byte-sreg.d: Ditto.
+ * gas/cris/pushpop-dword-sreg.d: Ditto.
+ * gas/cris/pushpop-word-sreg.d: Ditto.
+ * gas/cris/pushpop.d: Ditto.
+ * gas/cris/quick-s6.d: Ditto.
+ * gas/cris/quick-u5.d: Ditto.
+ * gas/cris/quick-u6.d: Ditto.
+ * gas/cris/range-err-1.s: Ditto.
+ * gas/cris/rd-pic-1.d: Ditto.
+ * gas/cris/rd-regprefix-1.d: Ditto.
+ * gas/cris/rd-regprefix-1b.d: Ditto.
+ * gas/cris/reg-to-mem.d: Ditto.
+ * gas/cris/regreg.d: Ditto.
+ * gas/cris/return.d: Ditto.
+ * gas/cris/scc.d: Ditto.
+ * gas/cris/separator.d: Ditto.
+ * gas/cris/shexpr-1.d: Ditto.
+ * gas/cris/sreg-to-x.d: Ditto.
+ * gas/cris/test.d: Ditto.
+ * gas/cris/unimplemented.d: Ditto.
+ * gas/cris/unop-mem.d: Ditto.
+ * gas/cris/x-to-byte-sreg.d: Ditto.
+ * gas/cris/x-to-dcr1-sreg.d: Ditto.
+ * gas/cris/x-to-dword-sreg.d: Ditto.
+ * gas/cris/x-to-word-sreg.d: Ditto.
* gas/cris/shexpr-1.d: Ditto. Correct format.
2001-05-25 H.J. Lu <hjl@gnu.org>
diff --git a/gas/testsuite/gas/sparc/sparc.exp b/gas/testsuite/gas/sparc/sparc.exp
index 17dcaaa..39bf0f9 100644
--- a/gas/testsuite/gas/sparc/sparc.exp
+++ b/gas/testsuite/gas/sparc/sparc.exp
@@ -18,6 +18,7 @@ proc gas_64_check { } {
if [istarget sparc*-*-*] {
run_dump_test "synth"
+ run_dump_test "unalign"
if [gas_64_check] {
run_dump_test "asi"
run_dump_test "membar"
diff --git a/gas/testsuite/gas/sparc/unalign.d b/gas/testsuite/gas/sparc/unalign.d
new file mode 100644
index 0000000..b949010
--- /dev/null
+++ b/gas/testsuite/gas/sparc/unalign.d
@@ -0,0 +1,18 @@
+#as:
+#objdump: -Dr
+#name: sparc unaligned relocs
+
+.*: +file format .*sparc.*
+
+Disassembly of section .text:
+Disassembly of section .data:
+
+0+ <foo>:
+ 0: 01 00 00 00 nop
+ 1: R_SPARC_UA32 fred
+ 4: 00 02 00 00 unimp 0x20000
+ 6: R_SPARC_UA16 jim
+ 8: 03 00 00 00 sethi %hi\(0\), %g1
+ 9: R_SPARC_UA64 harry
+ c: 00 00 00 00 unimp 0
+ 10: 00 04 05 06 unimp 0x40506
diff --git a/gas/testsuite/gas/sparc/unalign.s b/gas/testsuite/gas/sparc/unalign.s
new file mode 100644
index 0000000..1de6b2b
--- /dev/null
+++ b/gas/testsuite/gas/sparc/unalign.s
@@ -0,0 +1,15 @@
+# Test unaligned reloc generation
+
+ .data
+foo:
+ .byte 0x1
+ .uaword fred
+ .byte 0x2
+ .uahalf jim
+ .byte 0x3
+ .uaxword harry
+ .byte 0x4
+ .byte 0x5
+ .byte 0x6
+
+