Index: llvm/lib/CodeGen/TargetLoweringBase.cpp =================================================================== --- llvm/lib/CodeGen/TargetLoweringBase.cpp +++ llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -1973,7 +1973,8 @@ auto *GV = new GlobalVariable(M, Type::getInt8PtrTy(M.getContext()), false, GlobalVariable::ExternalLinkage, nullptr, "__stack_chk_guard"); - if (getTargetMachine().getRelocationModel() == Reloc::Static) + if (TM.getRelocationModel() == Reloc::Static && + !TM.getTargetTriple().isWindowsGNUEnvironment()) GV->setDSOLocal(true); } } Index: llvm/test/CodeGen/ARM/win32-ssp.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/ARM/win32-ssp.ll @@ -0,0 +1,23 @@ +; RUN: llc -mtriple=thumbv7-w64-mingw32 < %s -o - | FileCheck --check-prefix=MINGW %s + +declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) +declare dso_local void @other(i8*) +declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) + +define dso_local void @func() sspstrong { +entry: +; MINGW-LABEL: func: +; MINGW: movw [[REG:r[0-9]+]], :lower16:.refptr.__stack_chk_guard +; MINGW: movt [[REG]], :upper16:.refptr.__stack_chk_guard +; MINGW: ldr [[REG2:r[0-9]+]], {{\[}}[[REG]]] +; MINGW: ldr {{r[0-9]+}}, {{\[}}[[REG2]]] +; MINGW: bl other +; MINGW: ldr {{r[0-9]+}}, {{\[}}[[REG2]]] +; MINGW: bl __stack_chk_fail + + %c = alloca i8, align 1 + call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull %c) + call void @other(i8* nonnull %c) + call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull %c) + ret void +} Index: llvm/test/CodeGen/X86/win32-ssp.ll =================================================================== --- llvm/test/CodeGen/X86/win32-ssp.ll +++ llvm/test/CodeGen/X86/win32-ssp.ll @@ -1,6 +1,7 @@ ; RUN: llc -mtriple=x86_64-w64-mingw32 < %s -o - | FileCheck --check-prefix=MINGW %s ; RUN: llc -mtriple=x86_64-pc-windows-itanium < %s -o - | FileCheck --check-prefix=MSVC %s ; RUN: llc -mtriple=x86_64-pc-windows-msvc < %s -o - | FileCheck --check-prefix=MSVC %s +; RUN: llc -mtriple=i686-w64-mingw32 < %s -o - | FileCheck --check-prefix=MINGW %s declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) declare dso_local void @other(i8*) @@ -9,12 +10,11 @@ define dso_local void @func() sspstrong { entry: ; MINGW-LABEL: func: -; MINGW: mov{{l|q}} .refptr.__stack_chk_guard(%rip), [[REG:%[a-z]+]] +; MINGW: mov{{l|q}} .refptr.[[PREFIX:_?]]__stack_chk_guard{{(\(%rip\))?}}, [[REG:%[a-z]+]] ; MINGW: mov{{l|q}} ([[REG]]) -; MINGW: callq other +; MINGW: call{{l|q}} [[PREFIX]]other ; MINGW: mov{{l|q}} ([[REG]]) -; MINGW: callq __stack_chk_fail -; MINGW: .seh_endproc +; MINGW: call{{l|q}} [[PREFIX]]__stack_chk_fail ; MSVC-LABEL: func: ; MSVC: mov{{l|q}} __security_cookie