[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