From: Saleem Abdulrasool Date: Fri, 30 Jan 2015 23:29:19 +0000 (+0000) Subject: CodeGen: create a WindowsARMTargetCodeGenInfo X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f7fea13c22d5354854e94970682be7526d26fbd6;p=clang CodeGen: create a WindowsARMTargetCodeGenInfo Create a new TargetCodeGenInfo for Windows on ARM to permit annotating the functions with stack-probe-size (for /Gs and -mstack-probe-support) for generating the stack probe necessary for Windows targets. This will be used by the backend when lowering the frame to generate the stack probe appropriately. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@227641 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index ebac376d7c..d067821419 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -4462,9 +4462,37 @@ public: llvm::AttributeSet::FunctionIndex, B)); } +}; + +class WindowsARMTargetCodeGenInfo : public ARMTargetCodeGenInfo { + void addStackProbeSizeTargetAttribute(const Decl *D, llvm::GlobalValue *GV, + CodeGen::CodeGenModule &CGM) const; + +public: + WindowsARMTargetCodeGenInfo(CodeGenTypes &CGT, ARMABIInfo::ABIKind K) + : ARMTargetCodeGenInfo(CGT, K) {} + void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV, + CodeGen::CodeGenModule &CGM) const override; }; +void WindowsARMTargetCodeGenInfo::addStackProbeSizeTargetAttribute( + const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const { + if (!isa(D)) + return; + if (CGM.getCodeGenOpts().StackProbeSize == 4096) + return; + + llvm::Function *F = cast(GV); + F->addFnAttr("stack-probe-size", + llvm::utostr(CGM.getCodeGenOpts().StackProbeSize)); +} + +void WindowsARMTargetCodeGenInfo::SetTargetAttributes( + const Decl *D, llvm::GlobalValue *GV, CodeGen::CodeGenModule &CGM) const { + ARMTargetCodeGenInfo::SetTargetAttributes(D, GV, CGM); + addStackProbeSizeTargetAttribute(D, GV, CGM); +} } void ARMABIInfo::computeInfo(CGFunctionInfo &FI) const { @@ -7075,6 +7103,12 @@ const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() { case llvm::Triple::thumb: case llvm::Triple::thumbeb: { + if (Triple.getOS() == llvm::Triple::Win32) { + TheTargetCodeGenInfo = + new WindowsARMTargetCodeGenInfo(Types, ARMABIInfo::AAPCS_VFP); + return *TheTargetCodeGenInfo; + } + ARMABIInfo::ABIKind Kind = ARMABIInfo::AAPCS; if (getTarget().getABI() == "apcs-gnu") Kind = ARMABIInfo::APCS; diff --git a/test/CodeGen/windows-on-arm-stack-probe-size.c b/test/CodeGen/windows-on-arm-stack-probe-size.c new file mode 100644 index 0000000000..d25e15d8f5 --- /dev/null +++ b/test/CodeGen/windows-on-arm-stack-probe-size.c @@ -0,0 +1,28 @@ +// RUN: %clang_cc1 -triple thumbv7-windows-itanium -mstack-probe-size=8096 -O2 -emit-llvm %s -o - \ +// RUN: | FileCheck %s -check-prefix CHECK-8096 + +// RUN: %clang_cc1 -triple thumbv7-windows-itanium -mstack-probe-size=4096 -O2 -emit-llvm %s -o - \ +// RUN: | FileCheck %s -check-prefix CHECK-4096 + +// RUN: %clang_cc1 -triple thumbv7-windows-itanium -O2 -emit-llvm %s -o - \ +// RUN: | FileCheck %s -check-prefix CHECK + +__declspec(dllimport) void initialise(signed char buffer[4096]); + +__declspec(dllexport) signed char function(unsigned index) { + signed char buffer[4096]; + initialise(buffer); + return buffer[index]; +} + +// CHECK-8096: attributes #0 = { +// CHECK-8096: "stack-probe-size"="8096" +// CHECK-8096: } + +// CHECK-4096: attributes #0 = { +// CHECK-4096-NOT: "stack-probe-size"= +// CHECK-4096: } + +// CHECK: attributes #0 = { +// CHECK-NOT: "stack-probe-size"= +// CHECK: }