Skip to content

Commit 30198bd

Browse files
committed
[Triple] Add triple for UEFI
Target triple to support "x86_64-unknown-uefi" Reviewed By: phosek Differential Revision: https://reviews.llvm.org/D131594
1 parent 4faa6c6 commit 30198bd

File tree

9 files changed

+29
-4
lines changed

9 files changed

+29
-4
lines changed

llvm/include/llvm/MC/TargetRegistry.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,8 @@ class Target {
564564
case Triple::UnknownObjectFormat:
565565
llvm_unreachable("Unknown object format");
566566
case Triple::COFF:
567-
assert(T.isOSWindows() && "only Windows COFF is supported");
567+
assert((T.isOSWindows() || T.isUEFI()) &&
568+
"only Windows and UEFI COFF are supported");
568569
S = COFFStreamerCtorFn(Ctx, std::move(TAB), std::move(OW),
569570
std::move(Emitter), RelaxAll,
570571
IncrementalLinkerCompatible);

llvm/include/llvm/TargetParser/Triple.h

+6
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ class Triple {
199199
NetBSD,
200200
OpenBSD,
201201
Solaris,
202+
UEFI,
202203
Win32,
203204
ZOS,
204205
Haiku,
@@ -580,6 +581,11 @@ class Triple {
580581
return getOS() == Triple::Haiku;
581582
}
582583

584+
/// Tests whether the OS is UEFI.
585+
bool isUEFI() const {
586+
return getOS() == Triple::UEFI;
587+
}
588+
583589
/// Tests whether the OS is Windows.
584590
bool isOSWindows() const {
585591
return getOS() == Triple::Win32;

llvm/lib/MC/MCContext.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ MCContext::MCContext(const Triple &TheTriple, const MCAsmInfo *mai,
8585
Env = IsMachO;
8686
break;
8787
case Triple::COFF:
88-
if (!TheTriple.isOSWindows())
88+
if (!TheTriple.isOSWindows() && !TheTriple.isUEFI())
8989
report_fatal_error(
9090
"Cannot initialize MC for non-Windows COFF object files.");
9191

llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -1516,6 +1516,12 @@ MCAsmBackend *llvm::createX86_64AsmBackend(const Target &T,
15161516
if (TheTriple.isOSWindows() && TheTriple.isOSBinFormatCOFF())
15171517
return new WindowsX86AsmBackend(T, true, STI);
15181518

1519+
if (TheTriple.isUEFI()) {
1520+
assert(TheTriple.isOSBinFormatCOFF() &&
1521+
"Only COFF format is supported in UEFI environment.");
1522+
return new WindowsX86AsmBackend(T, true, STI);
1523+
}
1524+
15191525
uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());
15201526

15211527
if (TheTriple.isX32())

llvm/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@ X86MCAsmInfoMicrosoftMASM::X86MCAsmInfoMicrosoftMASM(const Triple &Triple)
153153
void X86MCAsmInfoGNUCOFF::anchor() { }
154154

155155
X86MCAsmInfoGNUCOFF::X86MCAsmInfoGNUCOFF(const Triple &Triple) {
156-
assert(Triple.isOSWindows() && "Windows is the only supported COFF target");
156+
assert((Triple.isOSWindows() || Triple.isUEFI()) &&
157+
"Windows and UEFI are the only supported COFF targets");
157158
if (Triple.getArch() == Triple::x86_64) {
158159
PrivateGlobalPrefix = ".L";
159160
PrivateLabelPrefix = ".L";

llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,8 @@ static MCAsmInfo *createX86MCAsmInfo(const MCRegisterInfo &MRI,
441441
} else if (TheTriple.isOSCygMing() ||
442442
TheTriple.isWindowsItaniumEnvironment()) {
443443
MAI = new X86MCAsmInfoGNUCOFF(TheTriple);
444+
} else if (TheTriple.isUEFI()) {
445+
MAI = new X86MCAsmInfoGNUCOFF(TheTriple);
444446
} else {
445447
// The default is ELF.
446448
MAI = new X86ELFMCAsmInfo(TheTriple);

llvm/lib/Target/X86/X86MCInstLower.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -1555,7 +1555,8 @@ static void printConstant(const Constant *COp, unsigned BitWidth,
15551555

15561556
void X86AsmPrinter::EmitSEHInstruction(const MachineInstr *MI) {
15571557
assert(MF->hasWinCFI() && "SEH_ instruction in function without WinCFI?");
1558-
assert(getSubtarget().isOSWindows() && "SEH_ instruction Windows only");
1558+
assert((getSubtarget().isOSWindows() || TM.getTargetTriple().isUEFI()) &&
1559+
"SEH_ instruction Windows and UEFI only");
15591560

15601561
// Use the .cv_fpo directives if we're emitting CodeView on 32-bit x86.
15611562
if (EmitFPOData) {

llvm/lib/TargetParser/Triple.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ StringRef Triple::getOSTypeName(OSType Kind) {
238238
case RTEMS: return "rtems";
239239
case Solaris: return "solaris";
240240
case TvOS: return "tvos";
241+
case UEFI: return "uefi";
241242
case WASI: return "wasi";
242243
case WatchOS: return "watchos";
243244
case Win32: return "windows";
@@ -588,6 +589,7 @@ static Triple::OSType parseOS(StringRef OSName) {
588589
.StartsWith("netbsd", Triple::NetBSD)
589590
.StartsWith("openbsd", Triple::OpenBSD)
590591
.StartsWith("solaris", Triple::Solaris)
592+
.StartsWith("uefi", Triple::UEFI)
591593
.StartsWith("win32", Triple::Win32)
592594
.StartsWith("windows", Triple::Win32)
593595
.StartsWith("zos", Triple::ZOS)

llvm/unittests/TargetParser/TripleTest.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,12 @@ TEST(TripleTest, ParsedIDs) {
349349
EXPECT_EQ(Triple::HermitCore, T.getOS());
350350
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
351351

352+
T = Triple("x86_64-unknown-uefi");
353+
EXPECT_EQ(Triple::x86_64, T.getArch());
354+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
355+
EXPECT_EQ(Triple::UEFI, T.getOS());
356+
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
357+
352358
T = Triple("wasm32-unknown-unknown");
353359
EXPECT_EQ(Triple::wasm32, T.getArch());
354360
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());

0 commit comments

Comments
 (0)