diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp @@ -445,7 +445,7 @@ // Force the use of an ELF container. MAI = new X86ELFMCAsmInfo(TheTriple); } else if (TheTriple.isWindowsMSVCEnvironment() || - TheTriple.isWindowsCoreCLREnvironment()) { + TheTriple.isWindowsCoreCLREnvironment() || TheTriple.isUEFI()) { if (Options.getAssemblyLanguage().equals_insensitive("masm")) MAI = new X86MCAsmInfoMicrosoftMASM(TheTriple); else @@ -453,8 +453,6 @@ } else if (TheTriple.isOSCygMing() || TheTriple.isWindowsItaniumEnvironment()) { MAI = new X86MCAsmInfoGNUCOFF(TheTriple); - } else if (TheTriple.isUEFI()) { - MAI = new X86MCAsmInfoGNUCOFF(TheTriple); } else { // The default is ELF. MAI = new X86ELFMCAsmInfo(TheTriple); diff --git a/llvm/lib/Target/X86/X86CallingConv.td b/llvm/lib/Target/X86/X86CallingConv.td --- a/llvm/lib/Target/X86/X86CallingConv.td +++ b/llvm/lib/Target/X86/X86CallingConv.td @@ -521,6 +521,9 @@ // Mingw64 and native Win64 use Win64 CC CCIfSubtarget<"isTargetWin64()", CCDelegateTo>, + // UEFI64 uses Win64 CC + CCIfSubtarget<"isTargetUEFI64()", CCDelegateTo>, + // Otherwise, drop to normal X86-64 CC CCDelegateTo ]>; @@ -1127,6 +1130,9 @@ // Mingw64 and native Win64 use Win64 CC CCIfSubtarget<"isTargetWin64()", CCDelegateTo>, + // UEFI64 uses Win64 CC + CCIfSubtarget<"isTargetUEFI64()", CCDelegateTo>, + // Otherwise, drop to normal X86-64 CC CCDelegateTo ]>; diff --git a/llvm/lib/Target/X86/X86RegisterInfo.h b/llvm/lib/Target/X86/X86RegisterInfo.h --- a/llvm/lib/Target/X86/X86RegisterInfo.h +++ b/llvm/lib/Target/X86/X86RegisterInfo.h @@ -27,10 +27,14 @@ /// bool Is64Bit; - /// IsWin64 - Is the target on of win64 flavours + /// IsWin64 - Is the target one of win64 flavours /// bool IsWin64; + /// IsUEFI64 - Is this UEFI 64 bit target + /// + bool IsUEFI64; + /// SlotSize - Stack slot size in bytes. /// unsigned SlotSize; diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp --- a/llvm/lib/Target/X86/X86RegisterInfo.cpp +++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp @@ -55,6 +55,7 @@ // Cache some information. Is64Bit = TT.isArch64Bit(); IsWin64 = Is64Bit && TT.isOSWindows(); + IsUEFI64 = Is64Bit && TT.isUEFI(); // Use a callee-saved register as the base pointer. These registers must // not conflict with any ABI requirements. For example, in 32-bit mode PIC @@ -232,7 +233,7 @@ const TargetRegisterClass * X86RegisterInfo::getGPRsForTailCall(const MachineFunction &MF) const { const Function &F = MF.getFunction(); - if (IsWin64 || (F.getCallingConv() == CallingConv::Win64)) + if (IsWin64 || IsUEFI64 || (F.getCallingConv() == CallingConv::Win64)) return &X86::GR64_TCW64RegClass; else if (Is64Bit) return &X86::GR64_TCRegClass; @@ -331,7 +332,7 @@ } case CallingConv::X86_RegCall: if (Is64Bit) { - if (IsWin64) { + if (IsWin64 || IsUEFI64) { return (HasSSE ? CSR_Win64_RegCall_SaveList : CSR_Win64_RegCall_NoSSE_SaveList); } else { @@ -391,7 +392,7 @@ return IsWin64 ? CSR_Win64_SwiftError_SaveList : CSR_64_SwiftError_SaveList; - if (IsWin64) + if (IsWin64 || IsUEFI64) return HasSSE ? CSR_Win64_SaveList : CSR_Win64_NoSSE_SaveList; if (CallsEHReturn) return CSR_64EHRet_SaveList; @@ -451,7 +452,7 @@ } case CallingConv::X86_RegCall: if (Is64Bit) { - if (IsWin64) { + if (IsWin64 || IsUEFI64) { return (HasSSE ? CSR_Win64_RegCall_RegMask : CSR_Win64_RegCall_NoSSE_RegMask); } else { @@ -509,7 +510,7 @@ if (IsSwiftCC) return IsWin64 ? CSR_Win64_SwiftError_RegMask : CSR_64_SwiftError_RegMask; - return IsWin64 ? CSR_Win64_RegMask : CSR_64_RegMask; + return (IsWin64 || IsUEFI64) ? CSR_Win64_RegMask : CSR_64_RegMask; } return CSR_32_RegMask; diff --git a/llvm/lib/Target/X86/X86Subtarget.h b/llvm/lib/Target/X86/X86Subtarget.h --- a/llvm/lib/Target/X86/X86Subtarget.h +++ b/llvm/lib/Target/X86/X86Subtarget.h @@ -334,6 +334,10 @@ bool isOSWindows() const { return TargetTriple.isOSWindows(); } + bool isUEFI() const { return TargetTriple.isUEFI(); } + + bool isTargetUEFI64() const { return Is64Bit && isUEFI(); } + bool isTargetWin64() const { return Is64Bit && isOSWindows(); } bool isTargetWin32() const { return !Is64Bit && isOSWindows(); } @@ -349,7 +353,8 @@ bool isCallingConvWin64(CallingConv::ID CC) const { switch (CC) { - // On Win64, all these conventions just use the default convention. + // On Win64 and UEFI64, all these conventions just use the default + // convention. case CallingConv::C: case CallingConv::Fast: case CallingConv::Tail: @@ -360,7 +365,7 @@ case CallingConv::X86_ThisCall: case CallingConv::X86_VectorCall: case CallingConv::Intel_OCL_BI: - return isTargetWin64(); + return isTargetWin64() || isTargetUEFI64(); // This convention allows using the Win64 convention on other targets. case CallingConv::Win64: return true;