[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
Fri Jul 27 21:42:33 PDT 2018


mstorsjo updated this revision to Diff 157836.
mstorsjo added a comment.

Removed the part about data mapping symbols from the comment.


https://reviews.llvm.org/D49935

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


Index: test/MC/AArch64/inst-directive-other.s
===================================================================
--- /dev/null
+++ 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: lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp
===================================================================
--- lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp
+++ 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: lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
===================================================================
--- lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -4719,7 +4719,6 @@
   const MCObjectFileInfo::Environment Format =
     getContext().getObjectFileInfo()->getObjectFileType();
   bool IsMachO = Format == MCObjectFileInfo::IsMachO;
-  bool IsCOFF = Format == MCObjectFileInfo::IsCOFF;
 
   StringRef IDVal = DirectiveID.getIdentifier();
   SMLoc Loc = DirectiveID.getLoc();
@@ -4733,12 +4732,9 @@
     parseDirectiveLtorg(Loc);
   else if (IDVal == ".unreq")
     parseDirectiveUnreq(Loc);
-  else if (!IsMachO && !IsCOFF) {
-    if (IDVal == ".inst")
-      parseDirectiveInst(Loc);
-    else
-      return true;
-  } else if (IsMachO) {
+  else if (IDVal == ".inst")
+    parseDirectiveInst(Loc);
+  else if (IsMachO) {
     if (IDVal == MCLOHDirectiveName())
       parseDirectiveLOH(IDVal, Loc);
     else


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D49935.157836.patch
Type: text/x-patch
Size: 3974 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180728/15a58692/attachment.bin>


More information about the llvm-commits mailing list