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
ARMSubArch_v4t,
AArch64SubArch_arm64e,
+ AArch64SubArch_arm64ec,
KalimbaSubArch_v3,
KalimbaSubArch_v4,
(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;
}
.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)
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)
std::unique_ptr<MCObjectTargetWriter>
createObjectTargetWriter() const override {
- return createAArch64WinCOFFObjectWriter();
+ return createAArch64WinCOFFObjectWriter(TheTriple);
}
};
}
class MCTargetOptions;
class MCTargetStreamer;
class Target;
+class Triple;
MCCodeEmitter *createAArch64MCCodeEmitter(const MCInstrInfo &MCII,
MCContext &Ctx);
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,
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;
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);
}
--- /dev/null
+// 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