[M68k][MC] Make immediate operands relocatable
authorMin-Yih Hsu <minyihh@uci.edu>
Tue, 11 Oct 2022 05:07:48 +0000 (22:07 -0700)
committerMin-Yih Hsu <minyihh@uci.edu>
Wed, 25 Jan 2023 05:59:24 +0000 (21:59 -0800)
Sometimes memory addresses are treated as immediate values. Thus
immediate operands have to be relocatable.

Differential Revision: https://reviews.llvm.org/D137902

llvm/lib/Target/M68k/M68kInstrFormats.td
llvm/test/MC/M68k/Relocations/data-abs.s

index 2071a16..2343af0 100644 (file)
@@ -326,10 +326,13 @@ class MxEncAddrMode_i<string opnd_name, int size> : MxEncMemOp {
   // Immediate
   let Supplement =
     !cond(
-      !eq(size, 8)  : (descend 0b00000000, (operand "$"#opnd_name, 8)),
-      !eq(size, 16) : (operand "$"#opnd_name, 16),
-      !eq(size, 32) : (ascend (slice "$"#opnd_name, 31, 16),
-                              (slice "$"#opnd_name, 15, 0))
+      !eq(size, 8)  : (descend 0b00000000, (operand "$"#opnd_name, 8,
+                          (encoder "encodeRelocImm<8>"))),
+      !eq(size, 16) : (operand "$"#opnd_name, 16,
+                           (encoder "encodeRelocImm<16>")),
+      !eq(size, 32) : (operand "$"#opnd_name, 32,
+                           (encoder "encodeRelocImm<32>"),
+                           (decoder "DecodeImm32"))
     );
 }
 
index b8e6784..b15007d 100644 (file)
@@ -7,3 +7,20 @@
 ; INSTR: move.l dst, %d0
 ; FIXUP: fixup A - offset: 2, value: dst, kind: FK_Data_4
 move.l dst, %d0
+
+; Relocating immediate values
+
+; RELOC: R_68K_8 str8 0x0
+; INSTR: move.b  #str8,  (4,%sp)
+; FIXUP: fixup A - offset: 3, value: str8, kind: FK_Data_1
+move.b  #str8,  (4,%sp)
+
+; RELOC: R_68K_16 str16 0x0
+; INSTR: move.w  #str16,  (4,%sp)
+; FIXUP: fixup A - offset: 2, value: str16, kind: FK_Data_2
+move.w  #str16, (4,%sp)
+
+; RELOC: R_68K_32 str32 0x0
+; INSTR: move.l  #str32,  (4,%sp)
+; FIXUP: fixup A - offset: 2, value: str32, kind: FK_Data_4
+move.l  #str32, (4,%sp)