[PATCH] D49935: [AArch64] Support the .inst directive for MachO and COFF targets

Martin Storsjö via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 31 02:27:16 PDT 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL338355: [AArch64] Support the .inst directive for MachO and COFF targets (authored by mstorsjo, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D49935?vs=157836&id=158190#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D49935

Files:
  llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
  llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp
  llvm/trunk/test/MC/AArch64/inst-directive-other.s


Index: llvm/trunk/test/MC/AArch64/inst-directive-other.s
===================================================================
--- llvm/trunk/test/MC/AArch64/inst-directive-other.s
+++ llvm/trunk/test/MC/AArch64/inst-directive-other.s
@@ -0,0 +1,42 @@
+// RUN: llvm-mc %s -triple=arm64-apple-darwin -filetype=asm -o - \
+// RUN:   | FileCheck %s --check-prefix=CHECK-ASM
+// RUN: llvm-mc %s -triple=arm64-apple-darwin -filetype=obj -o - \
+// RUN:   | llvm-objdump -d - | FileCheck %s --check-prefixes=CHECK-OBJ,CHECK-OBJ-CODE
+// RUN: llvm-mc %s -triple=aarch64-win32-gnu -filetype=asm -o - \
+// RUN:   | FileCheck %s --check-prefix=CHECK-ASM
+// RUN: llvm-mc %s -triple=aarch64-win32-gnu -filetype=obj -o - \
+// RUN:   | llvm-objdump -d - | FileCheck %s --check-prefixes=CHECK-OBJ,CHECK-OBJ-CODE
+// RUN: llvm-mc %s -triple=aarch64-linux-gnu -filetype=asm -o - \
+// RUN:   | FileCheck %s --check-prefix=CHECK-ASM
+// RUN: llvm-mc %s -triple=aarch64-linux-gnu -filetype=obj -o - \
+// RUN:   | llvm-objdump -d - | FileCheck %s --check-prefixes=CHECK-OBJ,CHECK-OBJ-DATA
+// RUN: llvm-mc %s -triple=aarch64_be-linux-gnu -filetype=asm -o - \
+// RUN:   | FileCheck %s --check-prefix=CHECK-ASM
+// RUN: llvm-mc %s -triple=aarch64_be-linux-gnu -filetype=obj -o - \
+// RUN:   | llvm-objdump -d - | FileCheck %s --check-prefixes=CHECK-OBJ,CHECK-OBJ-BE
+
+    .text
+
+    .p2align  2
+    .globl _func
+_func:
+    nop
+    // A .long is stored differently for big endian aarch64 targets, while
+    // instructions always are stored in little endian.
+    // ELF distinguishes between data and code when emitted this way, but
+    // MachO and COFF don't.
+    .long 0xd503201f
+    .inst 0xd503201f
+
+// CHECK-ASM:        .p2align  2
+// CHECK-ASM:        .globl  _func
+// CHECK-ASM: _func:
+// CHECK-ASM:        nop
+// CHECK-ASM:        .{{long|word}}   3573751839
+// CHECK-ASM:        .inst   0xd503201f
+
+// CHECK-OBJ:        0:       1f 20 03 d5     nop
+// CHECK-OBJ-CODE:   4:       1f 20 03 d5     nop
+// CHECK-OBJ-DATA:   4:       1f 20 03 d5     .word 0xd503201f
+// CHECK-OBJ-BE:     4:       d5 03 20 1f     .word 0xd503201f
+// CHECK-OBJ:        8:       1f 20 03 d5     nop
Index: llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp
===================================================================
--- llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp
+++ llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp
@@ -39,4 +39,16 @@
 // finish() - write out any non-empty assembler constant pools.
 void AArch64TargetStreamer::finish() { ConstantPools->emitAll(Streamer); }
 
-void AArch64TargetStreamer::emitInst(uint32_t Inst) {}
+void AArch64TargetStreamer::emitInst(uint32_t Inst) {
+  char Buffer[4];
+
+  // We can't just use EmitIntValue here, as that will swap the
+  // endianness on big-endian systems (instructions are always
+  // little-endian).
+  for (unsigned I = 0; I < 4; ++I) {
+    Buffer[I] = uint8_t(Inst);
+    Inst >>= 8;
+  }
+
+  getStreamer().EmitBytes(StringRef(Buffer, 4));
+}
Index: llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
===================================================================
--- llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -4873,12 +4873,11 @@
     parseDirectiveLtorg(Loc);
   else if (IDVal == ".unreq")
     parseDirectiveUnreq(Loc);
-  else if (!IsMachO && !IsCOFF) {
-    if (IDVal == ".inst")
-      parseDirectiveInst(Loc);
-    else
-      return true;
-  } else if (IDVal == MCLOHDirectiveName())
+  else if (IDVal == ".inst")
+    parseDirectiveInst(Loc);
+  else if (!IsMachO && !IsCOFF)
+    return true;
+  else if (IDVal == MCLOHDirectiveName())
     parseDirectiveLOH(IDVal, Loc);
   else
     return true;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D49935.158190.patch
Type: text/x-patch
Size: 3841 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180731/68a37586/attachment-0001.bin>


More information about the llvm-commits mailing list