Author: Martin Storsjö Date: 2020-12-07T09:35:12+02:00 New Revision: 78a57069b53a08d5aef98a8472fcfa73dbbc8771
URL: https://github.com/llvm/llvm-project/commit/78a57069b53a08d5aef98a8472fcfa73dbbc8771 DIFF: https://github.com/llvm/llvm-project/commit/78a57069b53a08d5aef98a8472fcfa73dbbc8771.diff LOG: [CodeGen] Restore accessing __stack_chk_guard via a .refptr stub on mingw after 2518433f861fcb87 Add tests for this particular detail for x86 and arm (similar tests already existed for x86_64 and aarch64). The libssp implementation may be located in a separate DLL, and in those cases, the references need to be in a .refptr stub, to avoid needing to touch up code in the text section at runtime (which is supported but inefficient for x86, and unsupported for arm). Differential Revision: https://reviews.llvm.org/D92738 Added: llvm/test/CodeGen/ARM/win32-ssp.ll Modified: llvm/lib/CodeGen/TargetLoweringBase.cpp llvm/test/CodeGen/X86/win32-ssp.ll Removed: ################################################################################ diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp index 61a2de711af8..7dfd76ce5de0 100644 --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -1973,7 +1973,8 @@ void TargetLoweringBase::insertSSPDeclarations(Module &M) const { 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); } } diff --git a/llvm/test/CodeGen/ARM/win32-ssp.ll b/llvm/test/CodeGen/ARM/win32-ssp.ll new file mode 100644 index 000000000000..292ef9f65df1 --- /dev/null +++ b/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 +} diff --git a/llvm/test/CodeGen/X86/win32-ssp.ll b/llvm/test/CodeGen/X86/win32-ssp.ll index b3e6333000ad..0626bd98a3e3 100644 --- a/llvm/test/CodeGen/X86/win32-ssp.ll +++ b/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 @@ declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) 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 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits