Skip to content

Commit bede2c6

Browse files
[clang][llvm] make aarch64 uefi work
1 parent d7664ac commit bede2c6

File tree

5 files changed

+49
-2
lines changed

5 files changed

+49
-2
lines changed

clang/lib/Basic/Targets.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,7 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
166166
}
167167

168168
case llvm::Triple::UEFI:
169-
return std::make_unique<UEFITargetInfo<AArch64leTargetInfo>>(Triple,
170-
Opts);
169+
return std::make_unique<UEFIAArch64TargetInfo>(Triple, Opts);
171170

172171
case llvm::Triple::NetBSD:
173172
return std::make_unique<NetBSDTargetInfo<AArch64leTargetInfo>>(Triple,

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1824,3 +1824,32 @@ TargetInfo::BuiltinVaListKind
18241824
DarwinAArch64TargetInfo::getBuiltinVaListKind() const {
18251825
return TargetInfo::CharPtrBuiltinVaList;
18261826
}
1827+
1828+
UEFIAArch64TargetInfo::UEFIAArch64TargetInfo(const llvm::Triple &Triple,
1829+
const TargetOptions &Opts)
1830+
: UEFITargetInfo<AArch64leTargetInfo>(Triple, Opts), Triple(Triple) {
1831+
1832+
// This is an LLP64 platform.
1833+
// int:4, long:4, long long:8, long double:8.
1834+
IntWidth = IntAlign = 32;
1835+
LongWidth = LongAlign = 32;
1836+
DoubleAlign = LongLongAlign = 64;
1837+
LongDoubleWidth = LongDoubleAlign = 64;
1838+
LongDoubleFormat = &llvm::APFloat::IEEEdouble();
1839+
IntMaxType = SignedLongLong;
1840+
Int64Type = SignedLongLong;
1841+
SizeType = UnsignedLongLong;
1842+
PtrDiffType = SignedLongLong;
1843+
IntPtrType = SignedLongLong;
1844+
}
1845+
1846+
void UEFIAArch64TargetInfo::setDataLayout() {
1847+
assert(Triple.isOSBinFormatCOFF());
1848+
resetDataLayout("e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:"
1849+
"32-i64:64-i128:128-n32:64-S128-Fn32");
1850+
}
1851+
1852+
TargetInfo::BuiltinVaListKind
1853+
UEFIAArch64TargetInfo::getBuiltinVaListKind() const {
1854+
return TargetInfo::CharPtrBuiltinVaList;
1855+
}

clang/lib/Basic/Targets/AArch64.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,18 @@ class LLVM_LIBRARY_VISIBILITY DarwinAArch64TargetInfo
341341
MacroBuilder &Builder) const override;
342342
};
343343

344+
class LLVM_LIBRARY_VISIBILITY UEFIAArch64TargetInfo
345+
: public UEFITargetInfo<AArch64leTargetInfo> {
346+
const llvm::Triple Triple;
347+
348+
public:
349+
UEFIAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
350+
351+
void setDataLayout() override;
352+
353+
BuiltinVaListKind getBuiltinVaListKind() const override;
354+
};
355+
344356
} // namespace targets
345357
} // namespace clang
346358

llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,8 @@ static MCAsmInfo *createAArch64MCAsmInfo(const MCRegisterInfo &MRI,
352352
MAI = new AArch64MCAsmInfoMicrosoftCOFF();
353353
else if (TheTriple.isOSBinFormatCOFF())
354354
MAI = new AArch64MCAsmInfoGNUCOFF();
355+
else if (TheTriple.isUEFI())
356+
MAI = new AArch64MCAsmInfoGNUCOFF();
355357
else {
356358
assert(TheTriple.isOSBinFormatELF() && "Invalid target");
357359
MAI = new AArch64MCAsmInfoELF(TheTriple);

llvm/unittests/IR/DataLayoutTest.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,11 @@ TEST(DataLayoutTest, UEFI) {
682682

683683
// Test UEFI X86_64 Mangling Component.
684684
EXPECT_STREQ(DataLayout::getManglingComponent(TT), "-m:w");
685+
686+
TT = Triple("aarch64-unknown-uefi");
687+
688+
// Test UEFI AArch64 Mangling Component.
689+
EXPECT_STREQ(DataLayout::getManglingComponent(TT), "-m:w");
685690
}
686691

687692
} // anonymous namespace

0 commit comments

Comments
 (0)