[clang] [llvm] [UEFI] Aarch64 support front-end changes. (PR #162950)
Prabhu Rajasekaran via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 15 13:31:07 PDT 2025
https://github.com/Prabhuk updated https://github.com/llvm/llvm-project/pull/162950
>From 8a39f9b18a94628a8edcfd3a176427cd31aec0c8 Mon Sep 17 00:00:00 2001
From: prabhukr <prabhukr at google.com>
Date: Fri, 10 Oct 2025 15:51:51 -0700
Subject: [PATCH 1/2] [UEFI] Aarch64 support front-end changes.
We have a MVP x86_64 UEFI target triple support. Now adding support for
Aarch64.
---
clang/lib/Basic/Targets.cpp | 2 ++
clang/lib/Basic/Targets/AArch64.cpp | 29 +++++++++++++++++
clang/lib/Basic/Targets/AArch64.h | 31 +++++++++++++++++++
clang/lib/Driver/Driver.cpp | 6 ++--
clang/lib/Driver/ToolChains/Clang.cpp | 21 +++++++++++--
clang/lib/Driver/ToolChains/CommonArgs.cpp | 5 ++-
.../Driver/aarch64-uefi-constructed-args.c | 19 ++++++++++++
clang/test/Driver/unsupported-target-arch.c | 6 ----
llvm/include/llvm/TargetParser/Triple.h | 3 ++
llvm/lib/TargetParser/AArch64TargetParser.cpp | 2 +-
10 files changed, 111 insertions(+), 13 deletions(-)
create mode 100644 clang/test/Driver/aarch64-uefi-constructed-args.c
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index d9aafc6c75d3b..701194a9fad93 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -175,6 +175,8 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
case llvm::Triple::Hurd:
return std::make_unique<HurdTargetInfo<AArch64leTargetInfo>>(Triple,
Opts);
+ case llvm::Triple::UEFI:
+ return std::make_unique<UEFIAArch64TargetInfo>(Triple, Opts);
case llvm::Triple::Win32:
switch (Triple.getEnvironment()) {
case llvm::Triple::GNU:
diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp
index 9e03a0846ffba..2bd8f3b4ab527 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -1772,6 +1772,35 @@ MinGWARM64TargetInfo::MinGWARM64TargetInfo(const llvm::Triple &Triple,
TheCXXABI.set(TargetCXXABI::GenericAArch64);
}
+TargetInfo::BuiltinVaListKind
+UEFIAArch64TargetInfo::getBuiltinVaListKind() const {
+ return TargetInfo::CharPtrBuiltinVaList;
+}
+
+void UEFIAArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
+ MacroBuilder &Builder) const {
+ AArch64leTargetInfo::getTargetDefines(Opts, Builder);
+ Builder.defineMacro("_M_ARM64", "1");
+}
+
+TargetInfo::CallingConvCheckResult
+UEFIAArch64TargetInfo::checkCallingConvention(CallingConv CC) const {
+ switch (CC) {
+ case CC_C:
+ case CC_PreserveMost:
+ case CC_PreserveAll:
+ case CC_Win64:
+ return CCCR_OK;
+ default:
+ return CCCR_Warning;
+ }
+}
+
+TargetInfo::CallingConvKind
+UEFIAArch64TargetInfo::getCallingConvKind(bool ClangABICompat4) const {
+ return CCK_MicrosoftWin64;
+}
+
AppleMachOAArch64TargetInfo::AppleMachOAArch64TargetInfo(
const llvm::Triple &Triple, const TargetOptions &Opts)
: AppleMachOTargetInfo<AArch64leTargetInfo>(Triple, Opts) {}
diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h
index dfd89beeee2f3..c449c117d73ef 100644
--- a/clang/lib/Basic/Targets/AArch64.h
+++ b/clang/lib/Basic/Targets/AArch64.h
@@ -351,6 +351,37 @@ class LLVM_LIBRARY_VISIBILITY DarwinAArch64TargetInfo
MacroBuilder &Builder) const override;
};
+// aarch64 UEFI target
+class LLVM_LIBRARY_VISIBILITY UEFIAArch64TargetInfo
+ : public UEFITargetInfo<AArch64leTargetInfo> {
+public:
+ UEFIAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
+ : UEFITargetInfo<AArch64leTargetInfo>(Triple, Opts) {
+ this->TheCXXABI.set(TargetCXXABI::Microsoft);
+ // 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;
+ this->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");
+ }
+ BuiltinVaListKind getBuiltinVaListKind() const override;
+ void getTargetDefines(const LangOptions &Opts,
+ MacroBuilder &Builder) const override;
+ CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
+ TargetInfo::CallingConvKind
+ getCallingConvKind(bool ClangABICompat4) const override;
+};
+
} // namespace targets
} // namespace clang
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 85a1335785542..be086f22d858a 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 aarch64.
+ if (Target.isUEFI() && Target.getArch() != llvm::Triple::x86_64 &&
+ Target.getArch() != llvm::Triple::aarch64)
D.Diag(diag::err_target_unknown_triple) << Target.str();
// The `-maix[32|64]` flags are only valid for AIX targets.
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index d326a81feb762..adcd79367ce06 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1178,7 +1178,7 @@ static bool isSignedCharDefault(const llvm::Triple &Triple) {
case llvm::Triple::armeb:
case llvm::Triple::thumb:
case llvm::Triple::thumbeb:
- if (Triple.isOSDarwin() || Triple.isOSWindows())
+ if (Triple.isOSDarwin() || Triple.isOSWindows() || Triple.isUEFI())
return true;
return false;
@@ -7044,7 +7044,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
if (!Args.hasFlag(
options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
!RawTriple.isOSAIX() &&
- (!RawTriple.isOSWindows() ||
+ ((!RawTriple.isOSWindows() && !RawTriple.isUEFI()) ||
RawTriple.isWindowsCygwinEnvironment()) &&
((RawTriple.getVendor() != llvm::Triple::MipsTechnologies) ||
RawTriple.hasEnvironment())) ||
@@ -7079,10 +7079,25 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-fkeep-system-includes");
}
+ if (IsUEFI) {
+ llvm::outs() << "IsUEFI true;\n";
+ } else {
+ llvm::outs() << "IsUEFI false;\n";
+ }
+ if (IsWindowsMSVC) {
+ llvm::outs() << "IsWindowsMSVC true;\n";
+ } else {
+ llvm::outs() << "IsWindowsMSVC false;\n";
+ }
+
// -fms-extensions=0 is default.
if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
- IsWindowsMSVC || IsUEFI))
+ IsWindowsMSVC || IsUEFI)) {
+ llvm::outs() << "set OPT_fms_extensions\n";
CmdArgs.push_back("-fms-extensions");
+ } else {
+ llvm::outs() << "DONT SET OPT_fms_extensions\n";
+ }
// -fms-compatibility=0 is default.
bool IsMSVCCompat = Args.hasFlag(
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 16cc1db0a2235..503bff1b14e51 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -128,6 +128,9 @@ static bool useFramePointerForTargetByDefault(const llvm::opt::ArgList &Args,
}
}
+ if (Triple.isUEFI())
+ return false;
+
if (Triple.isOSWindows()) {
switch (Triple.getArch()) {
case llvm::Triple::x86:
@@ -198,7 +201,7 @@ static bool mustMaintainValidFrameChain(const llvm::opt::ArgList &Args,
// Arm64 Windows requires that the frame chain is valid, as there is no
// way to indicate during a stack walk that a frame has used the frame
// pointer as a general purpose register.
- return Triple.isOSWindows();
+ return Triple.isOSWindows() || Triple.isUEFI();
}
}
diff --git a/clang/test/Driver/aarch64-uefi-constructed-args.c b/clang/test/Driver/aarch64-uefi-constructed-args.c
new file mode 100644
index 0000000000000..798af2c77bd60
--- /dev/null
+++ b/clang/test/Driver/aarch64-uefi-constructed-args.c
@@ -0,0 +1,19 @@
+// RUN: %clang -### --target=aarch64-unknown-uefi -g -- %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=CHECK %s
+// RUN: %clang_cl -### --target=aarch64-unknown-uefi -g -- %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=CHECK %s
+// CHECK: "-cc1"
+// CHECK-SAME: "-triple" "aarch64-unknown-uefi"
+// CHECK-SAME: "-mrelocation-model" "pic" "-pic-level" "2"
+// CHECK-SAME: "-mframe-pointer=all"
+// CHECK-SAME: "-fms-extensions"
+// CHECK-NEXT: "/nologo"
+// CHECK-SAME: "/subsystem:efi_application"
+// CHECK-SAME: "/entry:EfiMain"
+// CHECK-SAME: "/tsaware:no"
+// CHECK-SAME: "/debug"
+
+// RUN: %clang -### --target=aarch64-unknown-uefi -print-search-dirs 2>&1 \
+// RUN: | FileCheck -check-prefixes=PROGPATH %s
+// PROGPATH: InstalledDir: [[DRIVER_INSTALLED_DIR:.*]]
+// PROGPATH: programs: =[[DRIVER_INSTALLED_DIR]]
diff --git a/clang/test/Driver/unsupported-target-arch.c b/clang/test/Driver/unsupported-target-arch.c
index 426f646db50b0..0d52f44e1eafb 100644
--- a/clang/test/Driver/unsupported-target-arch.c
+++ b/clang/test/Driver/unsupported-target-arch.c
@@ -60,12 +60,6 @@
// 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
diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h
index ed2e01ccb1e26..e8c855cc7ad02 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -689,6 +689,9 @@ class Triple {
bool isWindowsMSVCEnvironment() const {
return isKnownWindowsMSVCEnvironment() ||
(isOSWindows() && getEnvironment() == Triple::UnknownEnvironment);
+ // ||
+ // (isUEFI() && isAArch64() && getEnvironment() ==
+ // Triple::UnknownEnvironment);
}
// Checks if we're using the Windows Arm64EC ABI.
diff --git a/llvm/lib/TargetParser/AArch64TargetParser.cpp b/llvm/lib/TargetParser/AArch64TargetParser.cpp
index 7e3583275a734..010bd7ea65bf7 100644
--- a/llvm/lib/TargetParser/AArch64TargetParser.cpp
+++ b/llvm/lib/TargetParser/AArch64TargetParser.cpp
@@ -138,7 +138,7 @@ void AArch64::fillValidCPUArchList(SmallVectorImpl<StringRef> &Values) {
bool AArch64::isX18ReservedByDefault(const Triple &TT) {
return TT.isAndroid() || TT.isOSDarwin() || TT.isOSFuchsia() ||
- TT.isOSWindows() || TT.isOHOSFamily();
+ TT.isOSWindows() || TT.isUEFI() || TT.isOHOSFamily();
}
// Allows partial match, ex. "v8a" matches "armv8a".
>From 5bd743668a2a18c32d4de38f39dd02a1a650e618 Mon Sep 17 00:00:00 2001
From: prabhukr <prabhukr at google.com>
Date: Wed, 15 Oct 2025 13:27:55 -0700
Subject: [PATCH 2/2] Add backend and predefine changes.
---
clang/lib/Basic/Targets/AArch64.cpp | 14 +++++++++++++
clang/lib/Basic/Targets/AArch64.h | 7 ++++---
clang/lib/Basic/Targets/OSTargets.h | 1 +
clang/lib/Driver/ToolChains/Clang.cpp | 20 -------------------
clang/test/Driver/uefi-defines.c | 1 +
clang/test/Preprocessor/init.c | 2 ++
.../lib/Target/AArch64/AArch64MCInstLower.cpp | 2 +-
.../MCTargetDesc/AArch64MCTargetDesc.cpp | 2 +-
8 files changed, 24 insertions(+), 25 deletions(-)
diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp
index 2bd8f3b4ab527..315bfd8f1fc99 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -1781,6 +1781,7 @@ void UEFIAArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const {
AArch64leTargetInfo::getTargetDefines(Opts, Builder);
Builder.defineMacro("_M_ARM64", "1");
+ UEFIAArch64TargetInfo::getOSDefines(Opts, getTriple(), Builder);
}
TargetInfo::CallingConvCheckResult
@@ -1801,6 +1802,11 @@ UEFIAArch64TargetInfo::getCallingConvKind(bool ClangABICompat4) const {
return CCK_MicrosoftWin64;
}
+void UEFIAArch64TargetInfo::setDataLayout() {
+ 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");
+}
+
AppleMachOAArch64TargetInfo::AppleMachOAArch64TargetInfo(
const llvm::Triple &Triple, const TargetOptions &Opts)
: AppleMachOTargetInfo<AArch64leTargetInfo>(Triple, Opts) {}
@@ -1861,6 +1867,14 @@ void DarwinAArch64TargetInfo::getOSDefines(const LangOptions &Opts,
DarwinTargetInfo<AArch64leTargetInfo>::getOSDefines(Opts, Triple, Builder);
}
+// void UEFIAArch64TargetInfo::getOSDefines(const LangOptions &Opts,
+// const llvm::Triple &Triple,
+// MacroBuilder &Builder) const{
+
+// UEFITargetInfo<AArch64leTargetInfo>::getOSDefines(Opts, Triple, Builder);
+// // Builder.defineMacro("__UEFI__");
+// }
+
TargetInfo::BuiltinVaListKind
DarwinAArch64TargetInfo::getBuiltinVaListKind() const {
return TargetInfo::CharPtrBuiltinVaList;
diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h
index c449c117d73ef..d11e8ca8e4858 100644
--- a/clang/lib/Basic/Targets/AArch64.h
+++ b/clang/lib/Basic/Targets/AArch64.h
@@ -357,6 +357,7 @@ class LLVM_LIBRARY_VISIBILITY UEFIAArch64TargetInfo
public:
UEFIAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
: UEFITargetInfo<AArch64leTargetInfo>(Triple, Opts) {
+ llvm::outs() << "In targetinfo constructor\n";
this->TheCXXABI.set(TargetCXXABI::Microsoft);
// This is an LLP64 platform.
// int:4, long:4, long long:8, long double:8.
@@ -370,9 +371,6 @@ class LLVM_LIBRARY_VISIBILITY UEFIAArch64TargetInfo
SizeType = UnsignedLongLong;
PtrDiffType = SignedLongLong;
IntPtrType = SignedLongLong;
- this->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");
}
BuiltinVaListKind getBuiltinVaListKind() const override;
void getTargetDefines(const LangOptions &Opts,
@@ -380,6 +378,9 @@ class LLVM_LIBRARY_VISIBILITY UEFIAArch64TargetInfo
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
TargetInfo::CallingConvKind
getCallingConvKind(bool ClangABICompat4) const override;
+
+private:
+ void setDataLayout() override;
};
} // namespace targets
diff --git a/clang/lib/Basic/Targets/OSTargets.h b/clang/lib/Basic/Targets/OSTargets.h
index 6c49a09ab27f5..4f886a356f9e0 100644
--- a/clang/lib/Basic/Targets/OSTargets.h
+++ b/clang/lib/Basic/Targets/OSTargets.h
@@ -848,6 +848,7 @@ class LLVM_LIBRARY_VISIBILITY UEFITargetInfo : public OSTargetInfo<Target> {
protected:
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
MacroBuilder &Builder) const override {
+ llvm::outs() << "define macro \n";
Builder.defineMacro("__UEFI__");
}
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index adcd79367ce06..4f23f87dea9d2 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -7079,26 +7079,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-fkeep-system-includes");
}
- if (IsUEFI) {
- llvm::outs() << "IsUEFI true;\n";
- } else {
- llvm::outs() << "IsUEFI false;\n";
- }
- if (IsWindowsMSVC) {
- llvm::outs() << "IsWindowsMSVC true;\n";
- } else {
- llvm::outs() << "IsWindowsMSVC false;\n";
- }
-
- // -fms-extensions=0 is default.
- if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
- IsWindowsMSVC || IsUEFI)) {
- llvm::outs() << "set OPT_fms_extensions\n";
- CmdArgs.push_back("-fms-extensions");
- } else {
- llvm::outs() << "DONT SET OPT_fms_extensions\n";
- }
-
// -fms-compatibility=0 is default.
bool IsMSVCCompat = Args.hasFlag(
options::OPT_fms_compatibility, options::OPT_fno_ms_compatibility,
diff --git a/clang/test/Driver/uefi-defines.c b/clang/test/Driver/uefi-defines.c
index 45f27bfdb9fa9..5f446853a4399 100644
--- a/clang/test/Driver/uefi-defines.c
+++ b/clang/test/Driver/uefi-defines.c
@@ -1,4 +1,5 @@
// RUN: %clang -target x86_64-unknown-uefi %s -emit-llvm -S -c -o - | FileCheck %s
+// RUN: %clang -target aarch64-unknown-uefi %s -emit-llvm -S -c -o - | FileCheck %s
// CHECK: __UEFI__defined
#ifdef __UEFI__
diff --git a/clang/test/Preprocessor/init.c b/clang/test/Preprocessor/init.c
index 7e0df96141364..a02e5e91bb202 100644
--- a/clang/test/Preprocessor/init.c
+++ b/clang/test/Preprocessor/init.c
@@ -2843,6 +2843,8 @@
// RUN: %clang_cc1 -dM -triple=x86_64-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
+// RUN: %clang_cc1 -dM -triple=aarch64-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
// UEFI: #define __UEFI__ 1
diff --git a/llvm/lib/Target/AArch64/AArch64MCInstLower.cpp b/llvm/lib/Target/AArch64/AArch64MCInstLower.cpp
index 39946633603f6..d7d423b4d11d2 100644
--- a/llvm/lib/Target/AArch64/AArch64MCInstLower.cpp
+++ b/llvm/lib/Target/AArch64/AArch64MCInstLower.cpp
@@ -49,7 +49,7 @@ MCSymbol *AArch64MCInstLower::GetGlobalValueSymbol(const GlobalValue *GV,
if (!TheTriple.isOSBinFormatCOFF())
return Printer.getSymbolPreferLocal(*GV);
- assert(TheTriple.isOSWindows() &&
+ assert((TheTriple.isOSWindows() || TheTriple.isUEFI()) &&
"Windows is the only supported COFF target");
bool IsIndirect =
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp
index 5c8f57664a2cc..5b7c532005026 100644
--- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp
+++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp
@@ -351,7 +351,7 @@ static MCAsmInfo *createAArch64MCAsmInfo(const MCRegisterInfo &MRI,
MAI = new AArch64MCAsmInfoDarwin(TheTriple.getArch() == Triple::aarch64_32);
else if (TheTriple.isOSBinFormatELF())
MAI = new AArch64MCAsmInfoELF(TheTriple);
- else if (TheTriple.isWindowsMSVCEnvironment())
+ else if (TheTriple.isWindowsMSVCEnvironment() || TheTriple.isUEFI())
MAI = new AArch64MCAsmInfoMicrosoftCOFF();
else if (TheTriple.isOSBinFormatCOFF())
MAI = new AArch64MCAsmInfoGNUCOFF();
More information about the cfe-commits
mailing list