[ARM64EC 2/?] Add target triple, and allow targeting it.
authorEli Friedman <efriedma@quicinc.com>
Mon, 5 Sep 2022 19:27:10 +0000 (12:27 -0700)
committerEli Friedman <efriedma@quicinc.com>
Mon, 5 Sep 2022 19:27:10 +0000 (12:27 -0700)
Part of patchset to add initial support for ARM64EC.

Per discussion on review, using the triple arm64ec-pc-windows-msvc. The
parsing works the same way as Apple's alternate Arm ABI "arm64e".

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

llvm/include/llvm/ADT/Triple.h
llvm/lib/Support/Triple.cpp
llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.h
llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp
llvm/test/MC/AArch64/arm64ec.s [new file with mode: 0644]

index bd1a3ac..db4d9c9 100644 (file)
@@ -142,6 +142,7 @@ public:
     ARMSubArch_v4t,
 
     AArch64SubArch_arm64e,
+    AArch64SubArch_arm64ec,
 
     KalimbaSubArch_v3,
     KalimbaSubArch_v4,
@@ -583,6 +584,12 @@ public:
            (isOSWindows() && getEnvironment() == Triple::UnknownEnvironment);
   }
 
+  // Checks if we're using the Windows Arm64EC ABI.
+  bool isWindowsArm64EC() const {
+    return getArch() == Triple::aarch64 &&
+           getSubArch() == Triple::AArch64SubArch_arm64ec;
+  }
+
   bool isWindowsCoreCLREnvironment() const {
     return isOSWindows() && getEnvironment() == Triple::CoreCLR;
   }
index 3766f26..33416fc 100644 (file)
@@ -458,6 +458,7 @@ static Triple::ArchType parseArch(StringRef ArchName) {
     .Case("arm64", Triple::aarch64)
     .Case("arm64_32", Triple::aarch64_32)
     .Case("arm64e", Triple::aarch64)
+    .Case("arm64ec", Triple::aarch64)
     .Case("arm", Triple::arm)
     .Case("armeb", Triple::armeb)
     .Case("thumb", Triple::thumb)
@@ -656,6 +657,9 @@ static Triple::SubArchType parseSubArch(StringRef SubArchName) {
   if (SubArchName == "arm64e")
     return Triple::AArch64SubArch_arm64e;
 
+  if (SubArchName == "arm64ec")
+    return Triple::AArch64SubArch_arm64ec;
+
   if (SubArchName.startswith("spirv"))
     return StringSwitch<Triple::SubArchType>(SubArchName)
         .EndsWith("v1.0", Triple::SPIRVSubArch_v10)
index e4b547e..fb6c5af 100644 (file)
@@ -745,7 +745,7 @@ public:
 
   std::unique_ptr<MCObjectTargetWriter>
   createObjectTargetWriter() const override {
-    return createAArch64WinCOFFObjectWriter();
+    return createAArch64WinCOFFObjectWriter(TheTriple);
   }
 };
 }
index 049c497..7daf084 100644 (file)
@@ -33,6 +33,7 @@ class MCSubtargetInfo;
 class MCTargetOptions;
 class MCTargetStreamer;
 class Target;
+class Triple;
 
 MCCodeEmitter *createAArch64MCCodeEmitter(const MCInstrInfo &MCII,
                                           MCContext &Ctx);
@@ -52,7 +53,8 @@ std::unique_ptr<MCObjectTargetWriter>
 createAArch64MachObjectWriter(uint32_t CPUType, uint32_t CPUSubtype,
                               bool IsILP32);
 
-std::unique_ptr<MCObjectTargetWriter> createAArch64WinCOFFObjectWriter();
+std::unique_ptr<MCObjectTargetWriter>
+createAArch64WinCOFFObjectWriter(const Triple &TheTriple);
 
 MCTargetStreamer *createAArch64AsmTargetStreamer(MCStreamer &S,
                                                  formatted_raw_ostream &OS,
index 46ffa50..05c7d76 100644 (file)
@@ -30,8 +30,10 @@ namespace {
 
 class AArch64WinCOFFObjectWriter : public MCWinCOFFObjectTargetWriter {
 public:
-  AArch64WinCOFFObjectWriter()
-      : MCWinCOFFObjectTargetWriter(COFF::IMAGE_FILE_MACHINE_ARM64) {}
+  AArch64WinCOFFObjectWriter(const Triple &TheTriple)
+      : MCWinCOFFObjectTargetWriter(TheTriple.isWindowsArm64EC()
+                                        ? COFF::IMAGE_FILE_MACHINE_ARM64EC
+                                        : COFF::IMAGE_FILE_MACHINE_ARM64) {}
 
   ~AArch64WinCOFFObjectWriter() override = default;
 
@@ -159,6 +161,7 @@ bool AArch64WinCOFFObjectWriter::recordRelocation(const MCFixup &Fixup) const {
   return true;
 }
 
-std::unique_ptr<MCObjectTargetWriter> llvm::createAArch64WinCOFFObjectWriter() {
-  return std::make_unique<AArch64WinCOFFObjectWriter>();
+std::unique_ptr<MCObjectTargetWriter>
+llvm::createAArch64WinCOFFObjectWriter(const Triple &TheTriple) {
+  return std::make_unique<AArch64WinCOFFObjectWriter>(TheTriple);
 }
diff --git a/llvm/test/MC/AArch64/arm64ec.s b/llvm/test/MC/AArch64/arm64ec.s
new file mode 100644 (file)
index 0000000..e6ac6bd
--- /dev/null
@@ -0,0 +1,4 @@
+// RUN: llvm-mc -triple arm64ec-pc-windows-msvc -filetype=obj %s -o - | llvm-objdump -d -r - | FileCheck %s
+// CHECK: file format coff-arm64ec
+// CHECK: add x0, x1, x2
+add x0, x1, x2