https://github.com/RossComputerGuy updated https://github.com/llvm/llvm-project/pull/136247
>From fe082622b38f5b4e00a5be7076523ad2adb104a4 Mon Sep 17 00:00:00 2001 From: Tristan Ross <tristan.r...@midstall.com> Date: Thu, 17 Apr 2025 20:06:51 -0700 Subject: [PATCH 1/4] [clang][uefi] add arm, aarch64, x86, loongarch64, riscv64 targets --- clang/include/clang/Basic/TargetOSMacros.def | 3 +++ clang/lib/Basic/Targets.cpp | 14 ++++++++++++++ clang/test/Preprocessor/init.c | 5 +++++ 3 files changed, 22 insertions(+) diff --git a/clang/include/clang/Basic/TargetOSMacros.def b/clang/include/clang/Basic/TargetOSMacros.def index 58dce330f9c8f..f4f3276ad1c25 100644 --- a/clang/include/clang/Basic/TargetOSMacros.def +++ b/clang/include/clang/Basic/TargetOSMacros.def @@ -53,4 +53,7 @@ TARGET_OS(TARGET_OS_NANO, Triple.isWatchOS()) TARGET_OS(TARGET_IPHONE_SIMULATOR, Triple.isSimulatorEnvironment()) TARGET_OS(TARGET_OS_UIKITFORMAC, Triple.isMacCatalystEnvironment()) +// UEFI target. +TARGET_OS(TARGET_OS_UEFI, Triple.isUEFI()) + #undef TARGET_OS diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index c6d228fe98100..0502d99a20e4f 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -164,6 +164,11 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple, return std::make_unique<OHOSTargetInfo<AArch64leTargetInfo>>(Triple, Opts); } + + case llvm::Triple::UEFI: + return std::make_unique<UEFITargetInfo<AArch64leTargetInfo>>(Triple, + Opts); + case llvm::Triple::NetBSD: return std::make_unique<NetBSDTargetInfo<AArch64leTargetInfo>>(Triple, Opts); @@ -227,6 +232,8 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple, return std::make_unique<HaikuTargetInfo<ARMleTargetInfo>>(Triple, Opts); case llvm::Triple::NaCl: return std::make_unique<NaClTargetInfo<ARMleTargetInfo>>(Triple, Opts); + case llvm::Triple::UEFI: + return std::make_unique<UEFITargetInfo<ARMleTargetInfo>>(Triple, Opts); case llvm::Triple::Win32: switch (Triple.getEnvironment()) { case llvm::Triple::Cygnus: @@ -457,6 +464,8 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple, case llvm::Triple::Haiku: return std::make_unique<HaikuTargetInfo<RISCV64TargetInfo>>(Triple, Opts); + case llvm::Triple::UEFI: + return std::make_unique<UEFITargetInfo<RISCV64TargetInfo>>(Triple, Opts); case llvm::Triple::Linux: switch (Triple.getEnvironment()) { default: @@ -569,6 +578,8 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple, case llvm::Triple::Solaris: return std::make_unique<SolarisTargetInfo<X86_32TargetInfo>>(Triple, Opts); + case llvm::Triple::UEFI: + return std::make_unique<UEFITargetInfo<X86_32TargetInfo>>(Triple, Opts); case llvm::Triple::Win32: { switch (Triple.getEnvironment()) { case llvm::Triple::Cygnus: @@ -760,6 +771,9 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple, case llvm::Triple::FreeBSD: return std::make_unique<FreeBSDTargetInfo<LoongArch64TargetInfo>>(Triple, Opts); + case llvm::Triple::UEFI: + return std::make_unique<UEFITargetInfo<LoongArch64TargetInfo>>(Triple, + Opts); default: return std::make_unique<LoongArch64TargetInfo>(Triple, Opts); } diff --git a/clang/test/Preprocessor/init.c b/clang/test/Preprocessor/init.c index 1ac325d444662..55a7340deba24 100644 --- a/clang/test/Preprocessor/init.c +++ b/clang/test/Preprocessor/init.c @@ -2835,6 +2835,11 @@ // RISCV64-LINUX: #define unix 1 // RUN: %clang_cc1 -dM -triple=x86_64-uefi -E /dev/null | FileCheck -match-full-lines -check-prefix UEFI %s +// RUN: %clang_cc1 -dM -triple=armv7l-unknown-uefi -E < /dev/null | FileCheck -match-full-lines -check-prefix UEFI %s +// RUN: %clang_cc1 -dM -triple=aarch64-unknown-uefi -E < /dev/null | FileCheck -match-full-lines -check-prefix UEFI %s +// RUN: %clang_cc1 -dM -triple=loongarch64-unknown-uefi -E < /dev/null | FileCheck -match-full-lines -check-prefix UEFI %s +// RUN: %clang_cc1 -dM -triple=riscv64-unknown-uefi -E < /dev/null | FileCheck -match-full-lines -check-prefix UEFI %s +// RUN: %clang_cc1 -dM -triple=x86_64-unknown-uefi -E /dev/null | FileCheck -match-full-lines -check-prefix UEFI %s // UEFI: #define __UEFI__ 1 >From b601bb7fbaa3e8d93970f913afdaf7e60e7b6ef8 Mon Sep 17 00:00:00 2001 From: Tristan Ross <tristan.r...@midstall.com> Date: Thu, 17 Apr 2025 20:46:01 -0700 Subject: [PATCH 2/4] [clang] remove x86_64-unknown-uefi block --- clang/lib/Driver/Driver.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 90d8e823d1d02..55abe691ea8e2 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -699,10 +699,6 @@ static llvm::Triple computeTargetTriple(const Driver &D, } } - // Currently the only architecture supported by *-uefi triples are x86_64. - if (Target.isUEFI() && Target.getArch() != llvm::Triple::x86_64) - D.Diag(diag::err_target_unknown_triple) << Target.str(); - // The `-maix[32|64]` flags are only valid for AIX targets. if (Arg *A = Args.getLastArgNoClaim(options::OPT_maix32, options::OPT_maix64); A && !Target.isOSAIX()) >From d7664acee0f62a3dfa5eaa636eca5f02d9832c72 Mon Sep 17 00:00:00 2001 From: Tristan Ross <tristan.r...@midstall.com> Date: Fri, 18 Apr 2025 08:33:35 -0700 Subject: [PATCH 3/4] [clang][driver] remove uefi from unsupported test --- clang/test/Driver/unsupported-target-arch.c | 18 ------------------ llvm/lib/Target/AArch64/AArch64MCInstLower.cpp | 4 ++-- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/clang/test/Driver/unsupported-target-arch.c b/clang/test/Driver/unsupported-target-arch.c index c0ec235439bca..8df0ee9fe7d06 100644 --- a/clang/test/Driver/unsupported-target-arch.c +++ b/clang/test/Driver/unsupported-target-arch.c @@ -63,21 +63,3 @@ // RUN: not %clang --target=powerpc-apple-darwin -o /dev/null %s 2> %t.err // RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-PPCMAC %s // CHECK-PPCMAC: error: unknown target triple 'unknown-apple-macosx{{.*}}' - -// RUN: not %clang --target=aarch64-unknown-uefi -o %t.o %s 2> %t.err -// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-AARCH64 %s -// RUN: not %clang_cl --target=aarch64-unknown-uefi -o %t.o %s 2> %t.err -// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-AARCH64 %s -// CHECK-AARCH64: error: unknown target triple 'aarch64-unknown-uefi'{{$}} - -// RUN: not %clang --target=arm-unknown-uefi -o %t.o %s 2> %t.err -// RUN: FileCheck --input-file=%t.err -check-prefixes=CHECK-ARM %s -// RUN: not %clang_cl --target=arm-unknown-uefi -o %t.o %s 2> %t.err -// RUN: FileCheck --input-file=%t.err -check-prefixes=CHECK-ARM %s -// CHECK-ARM: error: unknown target triple 'arm-unknown-uefi'{{$}} - -// RUN: not %clang --target=x86-unknown-uefi -o %t.o %s 2> %t.err -// RUN: FileCheck --input-file=%t.err -check-prefixes=CHECK-x86 %s -// RUN: not %clang_cl --target=x86-unknown-uefi -o %t.o %s 2> %t.err -// RUN: FileCheck --input-file=%t.err -check-prefixes=CHECK-x86 %s -// CHECK-x86: error: unknown target triple 'x86-unknown-uefi'{{$}} diff --git a/llvm/lib/Target/AArch64/AArch64MCInstLower.cpp b/llvm/lib/Target/AArch64/AArch64MCInstLower.cpp index 165b7d8ad6330..c7e5d12abc3ce 100644 --- a/llvm/lib/Target/AArch64/AArch64MCInstLower.cpp +++ b/llvm/lib/Target/AArch64/AArch64MCInstLower.cpp @@ -49,8 +49,8 @@ MCSymbol *AArch64MCInstLower::GetGlobalValueSymbol(const GlobalValue *GV, if (!TheTriple.isOSBinFormatCOFF()) return Printer.getSymbolPreferLocal(*GV); - assert(TheTriple.isOSWindows() && - "Windows is the only supported COFF target"); + assert((TheTriple.isOSWindows() || TheTriple.isUEFI()) && + "Windows and UEFI are the only supported COFF target"); bool IsIndirect = (TargetFlags & (AArch64II::MO_DLLIMPORT | AArch64II::MO_COFFSTUB)); >From 31d6ee2033a4c047450ba3c9c2929289e4c61a5a Mon Sep 17 00:00:00 2001 From: Tristan Ross <tristan.r...@midstall.com> Date: Fri, 18 Apr 2025 11:14:56 -0700 Subject: [PATCH 4/4] [clang][llvm] make aarch64 uefi work --- clang/lib/Basic/Targets.cpp | 3 +- clang/lib/Basic/Targets/AArch64.cpp | 29 +++++++++++++++++++ clang/lib/Basic/Targets/AArch64.h | 12 ++++++++ .../MCTargetDesc/AArch64MCTargetDesc.cpp | 2 ++ llvm/unittests/IR/DataLayoutTest.cpp | 5 ++++ 5 files changed, 49 insertions(+), 2 deletions(-) diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 0502d99a20e4f..94be17043dd7d 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -166,8 +166,7 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple, } case llvm::Triple::UEFI: - return std::make_unique<UEFITargetInfo<AArch64leTargetInfo>>(Triple, - Opts); + return std::make_unique<UEFIAArch64TargetInfo>(Triple, Opts); case llvm::Triple::NetBSD: return std::make_unique<NetBSDTargetInfo<AArch64leTargetInfo>>(Triple, diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 3633bab6e0df9..5f5acc5a5e54f 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -1824,3 +1824,32 @@ TargetInfo::BuiltinVaListKind DarwinAArch64TargetInfo::getBuiltinVaListKind() const { return TargetInfo::CharPtrBuiltinVaList; } + +UEFIAArch64TargetInfo::UEFIAArch64TargetInfo(const llvm::Triple &Triple, + const TargetOptions &Opts) + : UEFITargetInfo<AArch64leTargetInfo>(Triple, Opts), Triple(Triple) { + + // This is an LLP64 platform. + // int:4, long:4, long long:8, long double:8. + IntWidth = IntAlign = 32; + LongWidth = LongAlign = 32; + DoubleAlign = LongLongAlign = 64; + LongDoubleWidth = LongDoubleAlign = 64; + LongDoubleFormat = &llvm::APFloat::IEEEdouble(); + IntMaxType = SignedLongLong; + Int64Type = SignedLongLong; + SizeType = UnsignedLongLong; + PtrDiffType = SignedLongLong; + IntPtrType = SignedLongLong; +} + +void UEFIAArch64TargetInfo::setDataLayout() { + assert(Triple.isOSBinFormatCOFF()); + resetDataLayout("e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:" + "32-i64:64-i128:128-n32:64-S128-Fn32"); +} + +TargetInfo::BuiltinVaListKind +UEFIAArch64TargetInfo::getBuiltinVaListKind() const { + return TargetInfo::CharPtrBuiltinVaList; +} diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index 58822e467ce39..f979ee5690a6c 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -341,6 +341,18 @@ class LLVM_LIBRARY_VISIBILITY DarwinAArch64TargetInfo MacroBuilder &Builder) const override; }; +class LLVM_LIBRARY_VISIBILITY UEFIAArch64TargetInfo + : public UEFITargetInfo<AArch64leTargetInfo> { + const llvm::Triple Triple; + +public: + UEFIAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); + + void setDataLayout() override; + + BuiltinVaListKind getBuiltinVaListKind() const override; +}; + } // namespace targets } // namespace clang diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp index dd3ecb41494e0..4ad4222b29e66 100644 --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp @@ -352,6 +352,8 @@ static MCAsmInfo *createAArch64MCAsmInfo(const MCRegisterInfo &MRI, MAI = new AArch64MCAsmInfoMicrosoftCOFF(); else if (TheTriple.isOSBinFormatCOFF()) MAI = new AArch64MCAsmInfoGNUCOFF(); + else if (TheTriple.isUEFI()) + MAI = new AArch64MCAsmInfoMicrosoftCOFF(); else { assert(TheTriple.isOSBinFormatELF() && "Invalid target"); MAI = new AArch64MCAsmInfoELF(TheTriple); diff --git a/llvm/unittests/IR/DataLayoutTest.cpp b/llvm/unittests/IR/DataLayoutTest.cpp index 16a603ff6416f..5e9f52b8b3002 100644 --- a/llvm/unittests/IR/DataLayoutTest.cpp +++ b/llvm/unittests/IR/DataLayoutTest.cpp @@ -682,6 +682,11 @@ TEST(DataLayoutTest, UEFI) { // Test UEFI X86_64 Mangling Component. EXPECT_STREQ(DataLayout::getManglingComponent(TT), "-m:w"); + + TT = Triple("aarch64-unknown-uefi"); + + // Test UEFI AArch64 Mangling Component. + EXPECT_STREQ(DataLayout::getManglingComponent(TT), "-m:w"); } } // anonymous namespace _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits