forked from OSchip/llvm-project
[ARM] Add support for MSVC stack cookie checking
Heavily based on the same for AArch64, from SVN r346469. Differential Revision: https://reviews.llvm.org/D64292 llvm-svn: 365283
This commit is contained in:
parent
842f55f3ef
commit
8d9d290d4c
|
@ -15237,6 +15237,36 @@ bool ARMTargetLowering::useLoadStackGuardNode() const {
|
||||||
return Subtarget->isTargetMachO();
|
return Subtarget->isTargetMachO();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ARMTargetLowering::insertSSPDeclarations(Module &M) const {
|
||||||
|
if (!Subtarget->getTargetTriple().isWindowsMSVCEnvironment())
|
||||||
|
return TargetLowering::insertSSPDeclarations(M);
|
||||||
|
|
||||||
|
// MSVC CRT has a global variable holding security cookie.
|
||||||
|
M.getOrInsertGlobal("__security_cookie",
|
||||||
|
Type::getInt8PtrTy(M.getContext()));
|
||||||
|
|
||||||
|
// MSVC CRT has a function to validate security cookie.
|
||||||
|
FunctionCallee SecurityCheckCookie = M.getOrInsertFunction(
|
||||||
|
"__security_check_cookie", Type::getVoidTy(M.getContext()),
|
||||||
|
Type::getInt8PtrTy(M.getContext()));
|
||||||
|
if (Function *F = dyn_cast<Function>(SecurityCheckCookie.getCallee()))
|
||||||
|
F->addAttribute(1, Attribute::AttrKind::InReg);
|
||||||
|
}
|
||||||
|
|
||||||
|
Value *ARMTargetLowering::getSDagStackGuard(const Module &M) const {
|
||||||
|
// MSVC CRT has a global variable holding security cookie.
|
||||||
|
if (Subtarget->getTargetTriple().isWindowsMSVCEnvironment())
|
||||||
|
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");
|
||||||
|
return TargetLowering::getSSPStackGuardCheck(M);
|
||||||
|
}
|
||||||
|
|
||||||
bool ARMTargetLowering::canCombineStoreAndExtract(Type *VectorTy, Value *Idx,
|
bool ARMTargetLowering::canCombineStoreAndExtract(Type *VectorTy, Value *Idx,
|
||||||
unsigned &Cost) const {
|
unsigned &Cost) const {
|
||||||
// If we do not have NEON, vector types are not natively supported.
|
// If we do not have NEON, vector types are not natively supported.
|
||||||
|
|
|
@ -555,6 +555,10 @@ class VectorType;
|
||||||
|
|
||||||
bool useLoadStackGuardNode() const override;
|
bool useLoadStackGuardNode() const override;
|
||||||
|
|
||||||
|
void insertSSPDeclarations(Module &M) const override;
|
||||||
|
Value *getSDagStackGuard(const Module &M) const override;
|
||||||
|
Function *getSSPStackGuardCheck(const Module &M) const override;
|
||||||
|
|
||||||
bool canCombineStoreAndExtract(Type *VectorTy, Value *Idx,
|
bool canCombineStoreAndExtract(Type *VectorTy, Value *Idx,
|
||||||
unsigned &Cost) const override;
|
unsigned &Cost) const override;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
; RUN: llc -mtriple=thumbv7-windows-msvc < %s -o - | FileCheck --check-prefix=MSVC %s
|
||||||
|
; RUN: llc -mtriple=thumbv7-windows-msvc -O0 < %s -o - | FileCheck --check-prefix=MSVC %s
|
||||||
|
|
||||||
|
define void @_Z1fv() sspreq {
|
||||||
|
entry:
|
||||||
|
%x = alloca i32, align 4
|
||||||
|
%0 = bitcast i32* %x to i8*
|
||||||
|
call void @_Z7CapturePi(i32* nonnull %x)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
declare void @_Z7CapturePi(i32*)
|
||||||
|
|
||||||
|
; MSVC: movw r0, :lower16:__security_cookie
|
||||||
|
; MSVC: movt r0, :upper16:__security_cookie
|
||||||
|
; MSVC: ldr r0, [r0]
|
||||||
|
; MSVC: str r0, [sp, #4]
|
||||||
|
; MSVC: bl _Z7CapturePi
|
||||||
|
; MSVC: ldr r0, [sp, #4]
|
||||||
|
; MSVC: bl __security_check_cookie
|
Loading…
Reference in New Issue