[clang] [Clang][LoongArch] Add support for UEFI target (PR #155598)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 26 01:53:20 PDT 2025
https://github.com/leecheechen updated https://github.com/llvm/llvm-project/pull/155598
>From e5f0720586504337777e2ec1e61449059267d107 Mon Sep 17 00:00:00 2001
From: chenli <chenli at loongson.cn>
Date: Fri, 22 Aug 2025 18:02:23 +0800
Subject: [PATCH] [Clang][LoongArch] Add support for UEFI target
This patch adds basic UEFI target support for loongarch64, enabling
Clang to recognize and handle the loongarch64-unknown-uefi target
triple.
---
clang/lib/Basic/Targets.cpp | 3 +++
clang/lib/Basic/Targets/LoongArch.h | 3 +++
clang/lib/Driver/Driver.cpp | 6 ++++--
clang/test/CodeGen/LoongArch/uefi-data-layout.c | 3 +++
clang/test/Driver/uefi-constructed-args.c | 15 +++++++++++++++
5 files changed, 28 insertions(+), 2 deletions(-)
create mode 100644 clang/test/CodeGen/LoongArch/uefi-data-layout.c
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index d9aafc6c75d3b..be1369b9cb428 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -767,6 +767,9 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
case llvm::Triple::OpenBSD:
return std::make_unique<OpenBSDTargetInfo<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/lib/Basic/Targets/LoongArch.h b/clang/lib/Basic/Targets/LoongArch.h
index 88dc433924d6c..ae0838a58dd63 100644
--- a/clang/lib/Basic/Targets/LoongArch.h
+++ b/clang/lib/Basic/Targets/LoongArch.h
@@ -13,6 +13,7 @@
#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H
#define LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H
+#include "OSTargets.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Basic/TargetOptions.h"
#include "llvm/Support/Compiler.h"
@@ -159,6 +160,8 @@ class LLVM_LIBRARY_VISIBILITY LoongArch64TargetInfo
IntMaxType = Int64Type = SignedLong;
HasUnalignedAccess = true;
resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n32:64-S128");
+ if (Triple.isUEFI())
+ resetDataLayout("e-m:w-p:64:64-i64:64-i128:128-n32:64-S128");
// TODO: select appropriate ABI.
setABI("lp64d");
}
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index f110dbab3e5a5..e5d0940d3e081 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -698,8 +698,10 @@ 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)
+ // Currently the only architectures supported by *-uefi triples are
+ // x86_64 and loongarch64.
+ if (Target.isUEFI() && Target.getArch() != llvm::Triple::x86_64 &&
+ Target.getArch() != llvm::Triple::loongarch64)
D.Diag(diag::err_target_unknown_triple) << Target.str();
// The `-maix[32|64]` flags are only valid for AIX targets.
diff --git a/clang/test/CodeGen/LoongArch/uefi-data-layout.c b/clang/test/CodeGen/LoongArch/uefi-data-layout.c
new file mode 100644
index 0000000000000..8c3e0b00d9d05
--- /dev/null
+++ b/clang/test/CodeGen/LoongArch/uefi-data-layout.c
@@ -0,0 +1,3 @@
+// RUN: %clang -target loongarch64-unknown-uefi -S -emit-llvm -o - %s | \
+// RUN: FileCheck --check-prefix=LA64_UEFI %s
+// LA64_UEFI: target datalayout = "e-m:w-p:64:64-i64:64-i128:128-n32:64-S128"
diff --git a/clang/test/Driver/uefi-constructed-args.c b/clang/test/Driver/uefi-constructed-args.c
index c06cce351d654..883b8553bdb0d 100644
--- a/clang/test/Driver/uefi-constructed-args.c
+++ b/clang/test/Driver/uefi-constructed-args.c
@@ -12,3 +12,18 @@
// CHECK-SAME: "/entry:EfiMain"
// CHECK-SAME: "/tsaware:no"
// CHECK-SAME: "/debug"
+
+// RUN: %clang -### --target=loongarch64-unknown-uefi -g -- %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=LA64 %s
+// RUN: %clang_cl -### --target=loongarch64-unknown-uefi -g -- %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=LA64 %s
+// LA64: "-cc1"
+// LA64-SAME: "-triple" "loongarch64-unknown-uefi"
+// LA64-SAME: "-mrelocation-model" "pic" "-pic-level" "2"
+// LA64-SAME: "-mframe-pointer=all"
+// LA64-SAME: "-fms-extensions"
+// LA64-NEXT: "/nologo"
+// LA64-SAME: "/subsystem:efi_application"
+// LA64-SAME: "/entry:EfiMain"
+// LA64-SAME: "/tsaware:no"
+// LA64-SAME: "/debug"
More information about the cfe-commits
mailing list