Skip to content

RuntimeLibcalls: Add entries for __security_check_cookie #151843

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions llvm/include/llvm/CodeGen/TargetLowering.h
Original file line number Diff line number Diff line change
Expand Up @@ -3553,6 +3553,11 @@ class LLVM_ABI TargetLoweringBase {
return Libcalls.getLibcallName(Call);
}

/// Get the libcall routine name for the specified libcall implementation
const char *getLibcallImplName(RTLIB::LibcallImpl Call) const {
return Libcalls.getLibcallImplName(Call);
}

const char *getMemcpyName() const { return Libcalls.getMemcpyName(); }

/// Get the comparison predicate that's to be used to test the result of the
Expand Down
21 changes: 18 additions & 3 deletions llvm/include/llvm/IR/RuntimeLibcalls.td
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ def isNotOSMSVCRT : RuntimeLibcallPredicate<"!TT.isOSMSVCRT()">;
def isPS : RuntimeLibcallPredicate<"TT.isPS()">;
def isNotOSWindowsOrIsCygwinMinGW
: RuntimeLibcallPredicate<"!TT.isOSWindows() || TT.isOSCygMing()">;

def isWindowsMSVCEnvironment : RuntimeLibcallPredicate<
[{TT.isWindowsMSVCEnvironment()}]>;

def isGNUEnvironment : RuntimeLibcallPredicate<"TT.isGNUEnvironment()">;
def darwinHasSinCosStret : RuntimeLibcallPredicate<"darwinHasSinCosStret(TT)">;
Expand Down Expand Up @@ -369,6 +370,8 @@ def STACK_SMASH_HANDLER : RuntimeLibcall;
// Safe stack
def SAFESTACK_POINTER_ADDRESS : RuntimeLibcall;

def SECURITY_CHECK_COOKIE : RuntimeLibcall;

// Deoptimization
def DEOPTIMIZE : RuntimeLibcall;

Expand Down Expand Up @@ -1009,6 +1012,10 @@ def __stack_smash_handler : RuntimeLibcallImpl<STACK_SMASH_HANDLER>;

def __riscv_flush_icache : RuntimeLibcallImpl<RISCV_FLUSH_ICACHE>;

def __security_check_cookie : RuntimeLibcallImpl<SECURITY_CHECK_COOKIE>;
def __security_check_cookie_arm64ec : RuntimeLibcallImpl<SECURITY_CHECK_COOKIE,
"#__security_check_cookie_arm64ec">;

//===----------------------------------------------------------------------===//
// F128 libm Runtime Libcalls
//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -1111,6 +1118,9 @@ defvar DarwinSinCosStret = LibcallImpls<(add __sincosf_stret, __sincos_stret),
darwinHasSinCosStret>;
defvar DarwinExp10 = LibcallImpls<(add __exp10f, __exp10), darwinHasExp10>;

defvar SecurityCheckCookieIfWinMSVC =
LibcallImpls<(add __security_check_cookie), isWindowsMSVCEnvironment>;

defvar LibmHasSinCosF32 = LibcallImpls<(add sincosf), hasSinCos>;
defvar LibmHasSinCosF64 = LibcallImpls<(add sincos), hasSinCos>;
defvar LibmHasSinCosF80 = LibcallImpls<(add sincos_f80), hasSinCos>;
Expand Down Expand Up @@ -1233,7 +1243,8 @@ def AArch64SystemLibrary : SystemRuntimeLibrary<
DarwinExp10, DarwinSinCosStret,
LibmHasSinCosF32, LibmHasSinCosF64, LibmHasSinCosF128,
DefaultLibmExp10,
DefaultStackProtector)
DefaultStackProtector,
SecurityCheckCookieIfWinMSVC)
>;

// Prepend a # to every name
Expand All @@ -1252,7 +1263,9 @@ def arm64ec___stack_chk_fail : DuplicateLibcallImplWithPrefix<__stack_chk_fail,
def WindowsARM64ECSystemLibrary
: SystemRuntimeLibrary<isWindowsArm64EC,
(add WinArm64ECDefaultRuntimeLibcallImpls,
arm64ec___stack_chk_fail)>;
arm64ec___stack_chk_fail,
LibcallImpls<(add __security_check_cookie_arm64ec),
isWindowsMSVCEnvironment>)>;

//===----------------------------------------------------------------------===//
// AMDGPU Runtime Libcalls
Expand Down Expand Up @@ -1500,6 +1513,7 @@ def ARMSystemLibrary
LibmHasFrexpF128, LibmHasLdexpF128,
WindowARMDivRemCalls,
WindowARMFPIntCasts,
SecurityCheckCookieIfWinMSVC,
AEABIDivRemCalls,
DarwinSinCosStret, DarwinExp10,
LibmHasSinCosF32, LibmHasSinCosF64, LibmHasSinCosF128,
Expand Down Expand Up @@ -2159,6 +2173,7 @@ defvar X86CommonLibcalls =
DefaultRuntimeLibcallImpls_f80,
LibmHasExp10F32, LibmHasExp10F64, LibmHasExp10F80,
LibcallImpls<(add MostPowI), isNotOSMSVCRT>,
SecurityCheckCookieIfWinMSVC,
// FIXME: MSVCRT doesn't have powi. The f128 case is added as a
// hack for one test relying on it.
__powitf2_f128,
Expand Down
12 changes: 8 additions & 4 deletions llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28609,14 +28609,16 @@ Value *AArch64TargetLowering::getIRStackGuard(IRBuilderBase &IRB) const {

void AArch64TargetLowering::insertSSPDeclarations(Module &M) const {
// MSVC CRT provides functionalities for stack protection.
if (Subtarget->getTargetTriple().isWindowsMSVCEnvironment()) {
RTLIB::LibcallImpl SecurityCheckCookieLibcall =
getLibcallImpl(RTLIB::SECURITY_CHECK_COOKIE);
if (SecurityCheckCookieLibcall != RTLIB::Unsupported) {
// MSVC CRT has a global variable holding security cookie.
M.getOrInsertGlobal("__security_cookie",
PointerType::getUnqual(M.getContext()));

// MSVC CRT has a function to validate security cookie.
FunctionCallee SecurityCheckCookie =
M.getOrInsertFunction(Subtarget->getSecurityCheckCookieName(),
M.getOrInsertFunction(getLibcallImplName(SecurityCheckCookieLibcall),
Type::getVoidTy(M.getContext()),
PointerType::getUnqual(M.getContext()));
if (Function *F = dyn_cast<Function>(SecurityCheckCookie.getCallee())) {
Expand All @@ -28637,8 +28639,10 @@ Value *AArch64TargetLowering::getSDagStackGuard(const Module &M) const {

Function *AArch64TargetLowering::getSSPStackGuardCheck(const Module &M) const {
// MSVC CRT has a function to validate security cookie.
if (Subtarget->getTargetTriple().isWindowsMSVCEnvironment())
return M.getFunction(Subtarget->getSecurityCheckCookieName());
RTLIB::LibcallImpl SecurityCheckCookieLibcall =
getLibcallImpl(RTLIB::SECURITY_CHECK_COOKIE);
if (SecurityCheckCookieLibcall != RTLIB::Unsupported)
return M.getFunction(getLibcallImplName(SecurityCheckCookieLibcall));
return TargetLowering::getSSPStackGuardCheck(M);
}

Expand Down
6 changes: 0 additions & 6 deletions llvm/lib/Target/AArch64/AArch64Subtarget.h
Original file line number Diff line number Diff line change
Expand Up @@ -451,12 +451,6 @@ class AArch64Subtarget final : public AArch64GenSubtargetInfo {
return "__chkstk";
}

const char* getSecurityCheckCookieName() const {
if (isWindowsArm64EC())
return "#__security_check_cookie_arm64ec";
return "__security_check_cookie";
}

/// Choose a method of checking LR before performing a tail call.
AArch64PAuth::AuthCheckMethod
getAuthenticatedLRCheckMethod(const MachineFunction &MF) const;
Expand Down
25 changes: 18 additions & 7 deletions llvm/lib/Target/ARM/ARMISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21359,7 +21359,9 @@ bool ARMTargetLowering::useLoadStackGuardNode(const Module &M) const {
}

void ARMTargetLowering::insertSSPDeclarations(Module &M) const {
if (!Subtarget->getTargetTriple().isWindowsMSVCEnvironment())
RTLIB::LibcallImpl SecurityCheckCookieLibcall =
getLibcallImpl(RTLIB::SECURITY_CHECK_COOKIE);
if (SecurityCheckCookieLibcall == RTLIB::Unsupported)
return TargetLowering::insertSSPDeclarations(M);

// MSVC CRT has a global variable holding security cookie.
Expand All @@ -21368,23 +21370,32 @@ void ARMTargetLowering::insertSSPDeclarations(Module &M) const {

// MSVC CRT has a function to validate security cookie.
FunctionCallee SecurityCheckCookie = M.getOrInsertFunction(
"__security_check_cookie", Type::getVoidTy(M.getContext()),
PointerType::getUnqual(M.getContext()));
getLibcallImplName(SecurityCheckCookieLibcall),
Type::getVoidTy(M.getContext()), PointerType::getUnqual(M.getContext()));
if (Function *F = dyn_cast<Function>(SecurityCheckCookie.getCallee()))
F->addParamAttr(0, Attribute::AttrKind::InReg);
}

Value *ARMTargetLowering::getSDagStackGuard(const Module &M) const {
// MSVC CRT has a global variable holding security cookie.
if (Subtarget->getTargetTriple().isWindowsMSVCEnvironment())
RTLIB::LibcallImpl SecurityCheckCookieLibcall =
getLibcallImpl(RTLIB::SECURITY_CHECK_COOKIE);
if (SecurityCheckCookieLibcall != RTLIB::Unsupported) {
// MSVC CRT has a global variable holding security cookie.
//
// FIXME: We have a libcall entry for the correlated check function, but not
// the global name.
return M.getGlobalVariable("__security_cookie");
}

return TargetLowering::getSDagStackGuard(M);
}

Function *ARMTargetLowering::getSSPStackGuardCheck(const Module &M) const {
// MSVC CRT has a function to validate security cookie.
if (Subtarget->getTargetTriple().isWindowsMSVCEnvironment())
return M.getFunction("__security_check_cookie");
RTLIB::LibcallImpl SecurityCheckCookie =
getLibcallImpl(RTLIB::SECURITY_CHECK_COOKIE);
if (SecurityCheckCookie != RTLIB::Unsupported)
return M.getFunction(getLibcallImplName(SecurityCheckCookie));
return TargetLowering::getSSPStackGuardCheck(M);
}

Expand Down
6 changes: 4 additions & 2 deletions llvm/test/CodeGen/AArch64/stacksmash-arm64ec.ll
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
; RUN: llc -mtriple=arm64ec-unknown-windows-gnu < %s | FileCheck %s
; RUN: llc -mtriple=arm64ec-unknown-windows < %s | FileCheck -check-prefixes=CHECK,NONGNU %s
; RUN: llc -mtriple=arm64ec-unknown-windows-gnu < %s | FileCheck -check-prefixes=CHECK,GNU %s

; CHECK-LABEL: func = "#func"
; CHECK: bl "#other"
; CHECK: bl "#__stack_chk_fail"
; NONGNU: bl "#__security_check_cookie_arm64ec"
; GNU: bl "#__stack_chk_fail"
define void @func() #0 {
entry:
%buf = alloca [10 x i8], align 1
Expand Down