Skip to content

Commit 8a39f9b

Browse files
committed
[UEFI] Aarch64 support front-end changes.
We have a MVP x86_64 UEFI target triple support. Now adding support for Aarch64.
1 parent fabd1c4 commit 8a39f9b

File tree

10 files changed

+111
-13
lines changed

10 files changed

+111
-13
lines changed

clang/lib/Basic/Targets.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
175175
case llvm::Triple::Hurd:
176176
return std::make_unique<HurdTargetInfo<AArch64leTargetInfo>>(Triple,
177177
Opts);
178+
case llvm::Triple::UEFI:
179+
return std::make_unique<UEFIAArch64TargetInfo>(Triple, Opts);
178180
case llvm::Triple::Win32:
179181
switch (Triple.getEnvironment()) {
180182
case llvm::Triple::GNU:

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1772,6 +1772,35 @@ MinGWARM64TargetInfo::MinGWARM64TargetInfo(const llvm::Triple &Triple,
17721772
TheCXXABI.set(TargetCXXABI::GenericAArch64);
17731773
}
17741774

1775+
TargetInfo::BuiltinVaListKind
1776+
UEFIAArch64TargetInfo::getBuiltinVaListKind() const {
1777+
return TargetInfo::CharPtrBuiltinVaList;
1778+
}
1779+
1780+
void UEFIAArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
1781+
MacroBuilder &Builder) const {
1782+
AArch64leTargetInfo::getTargetDefines(Opts, Builder);
1783+
Builder.defineMacro("_M_ARM64", "1");
1784+
}
1785+
1786+
TargetInfo::CallingConvCheckResult
1787+
UEFIAArch64TargetInfo::checkCallingConvention(CallingConv CC) const {
1788+
switch (CC) {
1789+
case CC_C:
1790+
case CC_PreserveMost:
1791+
case CC_PreserveAll:
1792+
case CC_Win64:
1793+
return CCCR_OK;
1794+
default:
1795+
return CCCR_Warning;
1796+
}
1797+
}
1798+
1799+
TargetInfo::CallingConvKind
1800+
UEFIAArch64TargetInfo::getCallingConvKind(bool ClangABICompat4) const {
1801+
return CCK_MicrosoftWin64;
1802+
}
1803+
17751804
AppleMachOAArch64TargetInfo::AppleMachOAArch64TargetInfo(
17761805
const llvm::Triple &Triple, const TargetOptions &Opts)
17771806
: AppleMachOTargetInfo<AArch64leTargetInfo>(Triple, Opts) {}

clang/lib/Basic/Targets/AArch64.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,37 @@ class LLVM_LIBRARY_VISIBILITY DarwinAArch64TargetInfo
351351
MacroBuilder &Builder) const override;
352352
};
353353

354+
// aarch64 UEFI target
355+
class LLVM_LIBRARY_VISIBILITY UEFIAArch64TargetInfo
356+
: public UEFITargetInfo<AArch64leTargetInfo> {
357+
public:
358+
UEFIAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
359+
: UEFITargetInfo<AArch64leTargetInfo>(Triple, Opts) {
360+
this->TheCXXABI.set(TargetCXXABI::Microsoft);
361+
// This is an LLP64 platform.
362+
// int:4, long:4, long long:8, long double:8.
363+
IntWidth = IntAlign = 32;
364+
LongWidth = LongAlign = 32;
365+
DoubleAlign = LongLongAlign = 64;
366+
LongDoubleWidth = LongDoubleAlign = 64;
367+
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
368+
IntMaxType = SignedLongLong;
369+
Int64Type = SignedLongLong;
370+
SizeType = UnsignedLongLong;
371+
PtrDiffType = SignedLongLong;
372+
IntPtrType = SignedLongLong;
373+
this->resetDataLayout(
374+
"e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-"
375+
"i64:64-i128:128-n32:64-S128-Fn32");
376+
}
377+
BuiltinVaListKind getBuiltinVaListKind() const override;
378+
void getTargetDefines(const LangOptions &Opts,
379+
MacroBuilder &Builder) const override;
380+
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
381+
TargetInfo::CallingConvKind
382+
getCallingConvKind(bool ClangABICompat4) const override;
383+
};
384+
354385
} // namespace targets
355386
} // namespace clang
356387

clang/lib/Driver/Driver.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -698,8 +698,10 @@ static llvm::Triple computeTargetTriple(const Driver &D,
698698
}
699699
}
700700

701-
// Currently the only architecture supported by *-uefi triples are x86_64.
702-
if (Target.isUEFI() && Target.getArch() != llvm::Triple::x86_64)
701+
// Currently the only architectures supported by *-uefi triples are x86_64
702+
// and aarch64.
703+
if (Target.isUEFI() && Target.getArch() != llvm::Triple::x86_64 &&
704+
Target.getArch() != llvm::Triple::aarch64)
703705
D.Diag(diag::err_target_unknown_triple) << Target.str();
704706

705707
// The `-maix[32|64]` flags are only valid for AIX targets.

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,7 +1178,7 @@ static bool isSignedCharDefault(const llvm::Triple &Triple) {
11781178
case llvm::Triple::armeb:
11791179
case llvm::Triple::thumb:
11801180
case llvm::Triple::thumbeb:
1181-
if (Triple.isOSDarwin() || Triple.isOSWindows())
1181+
if (Triple.isOSDarwin() || Triple.isOSWindows() || Triple.isUEFI())
11821182
return true;
11831183
return false;
11841184

@@ -7044,7 +7044,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
70447044
if (!Args.hasFlag(
70457045
options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
70467046
!RawTriple.isOSAIX() &&
7047-
(!RawTriple.isOSWindows() ||
7047+
((!RawTriple.isOSWindows() && !RawTriple.isUEFI()) ||
70487048
RawTriple.isWindowsCygwinEnvironment()) &&
70497049
((RawTriple.getVendor() != llvm::Triple::MipsTechnologies) ||
70507050
RawTriple.hasEnvironment())) ||
@@ -7079,10 +7079,25 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
70797079
CmdArgs.push_back("-fkeep-system-includes");
70807080
}
70817081

7082+
if (IsUEFI) {
7083+
llvm::outs() << "IsUEFI true;\n";
7084+
} else {
7085+
llvm::outs() << "IsUEFI false;\n";
7086+
}
7087+
if (IsWindowsMSVC) {
7088+
llvm::outs() << "IsWindowsMSVC true;\n";
7089+
} else {
7090+
llvm::outs() << "IsWindowsMSVC false;\n";
7091+
}
7092+
70827093
// -fms-extensions=0 is default.
70837094
if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
7084-
IsWindowsMSVC || IsUEFI))
7095+
IsWindowsMSVC || IsUEFI)) {
7096+
llvm::outs() << "set OPT_fms_extensions\n";
70857097
CmdArgs.push_back("-fms-extensions");
7098+
} else {
7099+
llvm::outs() << "DONT SET OPT_fms_extensions\n";
7100+
}
70867101

70877102
// -fms-compatibility=0 is default.
70887103
bool IsMSVCCompat = Args.hasFlag(

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ static bool useFramePointerForTargetByDefault(const llvm::opt::ArgList &Args,
128128
}
129129
}
130130

131+
if (Triple.isUEFI())
132+
return false;
133+
131134
if (Triple.isOSWindows()) {
132135
switch (Triple.getArch()) {
133136
case llvm::Triple::x86:
@@ -198,7 +201,7 @@ static bool mustMaintainValidFrameChain(const llvm::opt::ArgList &Args,
198201
// Arm64 Windows requires that the frame chain is valid, as there is no
199202
// way to indicate during a stack walk that a frame has used the frame
200203
// pointer as a general purpose register.
201-
return Triple.isOSWindows();
204+
return Triple.isOSWindows() || Triple.isUEFI();
202205
}
203206
}
204207

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// RUN: %clang -### --target=aarch64-unknown-uefi -g -- %s 2>&1 \
2+
// RUN: | FileCheck -check-prefixes=CHECK %s
3+
// RUN: %clang_cl -### --target=aarch64-unknown-uefi -g -- %s 2>&1 \
4+
// RUN: | FileCheck -check-prefixes=CHECK %s
5+
// CHECK: "-cc1"
6+
// CHECK-SAME: "-triple" "aarch64-unknown-uefi"
7+
// CHECK-SAME: "-mrelocation-model" "pic" "-pic-level" "2"
8+
// CHECK-SAME: "-mframe-pointer=all"
9+
// CHECK-SAME: "-fms-extensions"
10+
// CHECK-NEXT: "/nologo"
11+
// CHECK-SAME: "/subsystem:efi_application"
12+
// CHECK-SAME: "/entry:EfiMain"
13+
// CHECK-SAME: "/tsaware:no"
14+
// CHECK-SAME: "/debug"
15+
16+
// RUN: %clang -### --target=aarch64-unknown-uefi -print-search-dirs 2>&1 \
17+
// RUN: | FileCheck -check-prefixes=PROGPATH %s
18+
// PROGPATH: InstalledDir: [[DRIVER_INSTALLED_DIR:.*]]
19+
// PROGPATH: programs: =[[DRIVER_INSTALLED_DIR]]

clang/test/Driver/unsupported-target-arch.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,6 @@
6060
// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-PPCMAC %s
6161
// CHECK-PPCMAC: error: unknown target triple 'unknown-apple-macosx{{.*}}'
6262

63-
// RUN: not %clang --target=aarch64-unknown-uefi -o %t.o %s 2> %t.err
64-
// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-AARCH64 %s
65-
// RUN: not %clang_cl --target=aarch64-unknown-uefi -o %t.o %s 2> %t.err
66-
// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-AARCH64 %s
67-
// CHECK-AARCH64: error: unknown target triple 'aarch64-unknown-uefi'{{$}}
68-
6963
// RUN: not %clang --target=arm-unknown-uefi -o %t.o %s 2> %t.err
7064
// RUN: FileCheck --input-file=%t.err -check-prefixes=CHECK-ARM %s
7165
// RUN: not %clang_cl --target=arm-unknown-uefi -o %t.o %s 2> %t.err

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,9 @@ class Triple {
689689
bool isWindowsMSVCEnvironment() const {
690690
return isKnownWindowsMSVCEnvironment() ||
691691
(isOSWindows() && getEnvironment() == Triple::UnknownEnvironment);
692+
// ||
693+
// (isUEFI() && isAArch64() && getEnvironment() ==
694+
// Triple::UnknownEnvironment);
692695
}
693696

694697
// Checks if we're using the Windows Arm64EC ABI.

llvm/lib/TargetParser/AArch64TargetParser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ void AArch64::fillValidCPUArchList(SmallVectorImpl<StringRef> &Values) {
138138

139139
bool AArch64::isX18ReservedByDefault(const Triple &TT) {
140140
return TT.isAndroid() || TT.isOSDarwin() || TT.isOSFuchsia() ||
141-
TT.isOSWindows() || TT.isOHOSFamily();
141+
TT.isOSWindows() || TT.isUEFI() || TT.isOHOSFamily();
142142
}
143143

144144
// Allows partial match, ex. "v8a" matches "armv8a".

0 commit comments

Comments
 (0)