-166
@@ -1,166 +0,0 @@
|
||||
From d851495f2fe614c4c860bda1bd3c80bfbe48360b Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Paulsson <paulsson@linux.vnet.ibm.com>
|
||||
Date: Thu, 8 Oct 2020 13:18:29 +0200
|
||||
Subject: [PATCH] [SystemZ] Use LA instead of AGR in eliminateFrameIndex().
|
||||
|
||||
Since AGR clobbers CC it should not be used here.
|
||||
|
||||
Fixes https://bugs.llvm.org/show_bug.cgi?id=47736.
|
||||
|
||||
Review: Ulrich Weigand
|
||||
Differential Revision: https://reviews.llvm.org/D89034
|
||||
---
|
||||
.../Target/SystemZ/SystemZRegisterInfo.cpp | 4 +--
|
||||
llvm/test/CodeGen/SystemZ/frame-14.ll | 26 +++++++++----------
|
||||
llvm/test/CodeGen/SystemZ/frame-16.ll | 4 +--
|
||||
3 files changed, 17 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp b/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp
|
||||
index 53b06c6e7e6d..88212e52460f 100644
|
||||
--- a/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp
|
||||
+++ b/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp
|
||||
@@ -322,8 +322,8 @@ SystemZRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
|
||||
// Load the high offset into the scratch register and use it as
|
||||
// an index.
|
||||
TII->loadImmediate(MBB, MI, ScratchReg, HighOffset);
|
||||
- BuildMI(MBB, MI, DL, TII->get(SystemZ::AGR),ScratchReg)
|
||||
- .addReg(ScratchReg, RegState::Kill).addReg(BasePtr);
|
||||
+ BuildMI(MBB, MI, DL, TII->get(SystemZ::LA), ScratchReg)
|
||||
+ .addReg(BasePtr, RegState::Kill).addImm(0).addReg(ScratchReg);
|
||||
}
|
||||
|
||||
// Use the scratch register as the base. It then dies here.
|
||||
diff --git a/llvm/test/CodeGen/SystemZ/frame-14.ll b/llvm/test/CodeGen/SystemZ/frame-14.ll
|
||||
index e70731249b42..193ff81123c5 100644
|
||||
--- a/llvm/test/CodeGen/SystemZ/frame-14.ll
|
||||
+++ b/llvm/test/CodeGen/SystemZ/frame-14.ll
|
||||
@@ -85,13 +85,13 @@ define void @f3() {
|
||||
define void @f4() {
|
||||
; CHECK-NOFP-LABEL: f4:
|
||||
; CHECK-NOFP: llilh %r1, 8
|
||||
-; CHECK-NOFP: agr %r1, %r15
|
||||
+; CHECK-NOFP: la %r1, 0(%r1,%r15)
|
||||
; CHECK-NOFP: mvi 0(%r1), 42
|
||||
; CHECK-NOFP: br %r14
|
||||
;
|
||||
; CHECK-FP-LABEL: f4:
|
||||
; CHECK-FP: llilh %r1, 8
|
||||
-; CHECK-FP: agr %r1, %r11
|
||||
+; CHECK-FP: la %r1, 0(%r1,%r11)
|
||||
; CHECK-FP: mvi 0(%r1), 42
|
||||
; CHECK-FP: br %r14
|
||||
%region1 = alloca [524104 x i8], align 8
|
||||
@@ -108,13 +108,13 @@ define void @f4() {
|
||||
define void @f5() {
|
||||
; CHECK-NOFP-LABEL: f5:
|
||||
; CHECK-NOFP: llilh %r1, 8
|
||||
-; CHECK-NOFP: agr %r1, %r15
|
||||
+; CHECK-NOFP: la %r1, 0(%r1,%r15)
|
||||
; CHECK-NOFP: mvi 4095(%r1), 42
|
||||
; CHECK-NOFP: br %r14
|
||||
;
|
||||
; CHECK-FP-LABEL: f5:
|
||||
; CHECK-FP: llilh %r1, 8
|
||||
-; CHECK-FP: agr %r1, %r11
|
||||
+; CHECK-FP: la %r1, 0(%r1,%r11)
|
||||
; CHECK-FP: mvi 4095(%r1), 42
|
||||
; CHECK-FP: br %r14
|
||||
%region1 = alloca [524104 x i8], align 8
|
||||
@@ -130,13 +130,13 @@ define void @f5() {
|
||||
define void @f6() {
|
||||
; CHECK-NOFP-LABEL: f6:
|
||||
; CHECK-NOFP: llilh %r1, 8
|
||||
-; CHECK-NOFP: agr %r1, %r15
|
||||
+; CHECK-NOFP: la %r1, 0(%r1,%r15)
|
||||
; CHECK-NOFP: mviy 4096(%r1), 42
|
||||
; CHECK-NOFP: br %r14
|
||||
;
|
||||
; CHECK-FP-LABEL: f6:
|
||||
; CHECK-FP: llilh %r1, 8
|
||||
-; CHECK-FP: agr %r1, %r11
|
||||
+; CHECK-FP: la %r1, 0(%r1,%r11)
|
||||
; CHECK-FP: mviy 4096(%r1), 42
|
||||
; CHECK-FP: br %r14
|
||||
%region1 = alloca [524104 x i8], align 8
|
||||
@@ -155,13 +155,13 @@ define void @f6() {
|
||||
define void @f7() {
|
||||
; CHECK-NOFP-LABEL: f7:
|
||||
; CHECK-NOFP: llilh %r1, 23
|
||||
-; CHECK-NOFP: agr %r1, %r15
|
||||
+; CHECK-NOFP: la %r1, 0(%r1,%r15)
|
||||
; CHECK-NOFP: mviy 65535(%r1), 42
|
||||
; CHECK-NOFP: br %r14
|
||||
;
|
||||
; CHECK-FP-LABEL: f7:
|
||||
; CHECK-FP: llilh %r1, 23
|
||||
-; CHECK-FP: agr %r1, %r11
|
||||
+; CHECK-FP: la %r1, 0(%r1,%r11)
|
||||
; CHECK-FP: mviy 65535(%r1), 42
|
||||
; CHECK-FP: br %r14
|
||||
%region1 = alloca [1048400 x i8], align 8
|
||||
@@ -178,13 +178,13 @@ define void @f7() {
|
||||
define void @f8() {
|
||||
; CHECK-NOFP-LABEL: f8:
|
||||
; CHECK-NOFP: llilh %r1, 24
|
||||
-; CHECK-NOFP: agr %r1, %r15
|
||||
+; CHECK-NOFP: la %r1, 0(%r1,%r15)
|
||||
; CHECK-NOFP: mvi 7(%r1), 42
|
||||
; CHECK-NOFP: br %r14
|
||||
;
|
||||
; CHECK-FP-LABEL: f8:
|
||||
; CHECK-FP: llilh %r1, 24
|
||||
-; CHECK-FP: agr %r1, %r11
|
||||
+; CHECK-FP: la %r1, 0(%r1,%r11)
|
||||
; CHECK-FP: mvi 7(%r1), 42
|
||||
; CHECK-FP: br %r14
|
||||
%region1 = alloca [1048408 x i8], align 8
|
||||
@@ -233,7 +233,7 @@ define void @f10(i32 *%vptr) {
|
||||
; CHECK-NOFP-LABEL: f10:
|
||||
; CHECK-NOFP: stg [[REGISTER:%r[1-9][0-4]?]], [[OFFSET:160|168]](%r15)
|
||||
; CHECK-NOFP: llilh [[REGISTER]], 8
|
||||
-; CHECK-NOFP: agr [[REGISTER]], %r15
|
||||
+; CHECK-NOFP: la [[REGISTER]], 0([[REGISTER]],%r15)
|
||||
; CHECK-NOFP: mvi 0([[REGISTER]]), 42
|
||||
; CHECK-NOFP: lg [[REGISTER]], [[OFFSET]](%r15)
|
||||
; CHECK-NOFP: br %r14
|
||||
@@ -241,7 +241,7 @@ define void @f10(i32 *%vptr) {
|
||||
; CHECK-FP-LABEL: f10:
|
||||
; CHECK-FP: stg [[REGISTER:%r[1-9][0-4]?]], [[OFFSET:160|168]](%r11)
|
||||
; CHECK-FP: llilh [[REGISTER]], 8
|
||||
-; CHECK-FP: agr [[REGISTER]], %r11
|
||||
+; CHECK-FP: la [[REGISTER]], 0([[REGISTER]],%r11)
|
||||
; CHECK-FP: mvi 0([[REGISTER]]), 42
|
||||
; CHECK-FP: lg [[REGISTER]], [[OFFSET]](%r11)
|
||||
; CHECK-FP: br %r14
|
||||
@@ -273,7 +273,7 @@ define void @f11(i32 *%vptr) {
|
||||
; CHECK-NOFP: stmg %r6, %r15,
|
||||
; CHECK-NOFP: stg [[REGISTER:%r[1-9][0-4]?]], [[OFFSET:160|168]](%r15)
|
||||
; CHECK-NOFP: llilh [[REGISTER]], 8
|
||||
-; CHECK-NOFP: agr [[REGISTER]], %r15
|
||||
+; CHECK-NOFP: la [[REGISTER]], 0([[REGISTER]],%r15)
|
||||
; CHECK-NOFP: mvi 0([[REGISTER]]), 42
|
||||
; CHECK-NOFP: lg [[REGISTER]], [[OFFSET]](%r15)
|
||||
; CHECK-NOFP: lmg %r6, %r15,
|
||||
diff --git a/llvm/test/CodeGen/SystemZ/frame-16.ll b/llvm/test/CodeGen/SystemZ/frame-16.ll
|
||||
index ae8a041ae110..a95c58207afb 100644
|
||||
--- a/llvm/test/CodeGen/SystemZ/frame-16.ll
|
||||
+++ b/llvm/test/CodeGen/SystemZ/frame-16.ll
|
||||
@@ -311,13 +311,13 @@ define void @f11(i32 *%vptr, i8 %byte) {
|
||||
define void @f12(i8 %byte, i64 %index) {
|
||||
; CHECK-NOFP-LABEL: f12:
|
||||
; CHECK-NOFP: llilh %r1, 8
|
||||
-; CHECK-NOFP: agr %r1, %r15
|
||||
+; CHECK-NOFP: la %r1, 0(%r1,%r15)
|
||||
; CHECK-NOFP: stc %r2, 0(%r3,%r1)
|
||||
; CHECK-NOFP: br %r14
|
||||
;
|
||||
; CHECK-FP-LABEL: f12:
|
||||
; CHECK-FP: llilh %r1, 8
|
||||
-; CHECK-FP: agr %r1, %r11
|
||||
+; CHECK-FP: la %r1, 0(%r1,%r11)
|
||||
; CHECK-FP: stc %r2, 0(%r3,%r1)
|
||||
; CHECK-FP: br %r14
|
||||
%region1 = alloca [524104 x i8], align 8
|
||||
--
|
||||
2.26.2
|
||||
|
||||
-55
@@ -1,55 +0,0 @@
|
||||
From 8dcb88f7705fb3927938dd9bd103efcabafcefb0 Mon Sep 17 00:00:00 2001
|
||||
From: Georgy Yakovlev <gyakovlev@gentoo.org>
|
||||
Date: Tue, 27 Oct 2020 18:20:56 -0700
|
||||
Subject: [PATCH] backport D88371, guard `find_library(tensorflow_c_api ...)`
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D88371
|
||||
Signed-off-by: Georgy Yakovlev <gyakovlev@gentoo.org>
|
||||
---
|
||||
llvm/CMakeLists.txt | 15 +++++++--------
|
||||
1 file changed, 7 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
|
||||
index 1f137f0..4112def 100644
|
||||
--- a/llvm/CMakeLists.txt
|
||||
+++ b/llvm/CMakeLists.txt
|
||||
@@ -832,6 +832,11 @@ configure_file(
|
||||
${LLVM_INCLUDE_DIR}/llvm/Config/Targets.def
|
||||
)
|
||||
|
||||
+# They are not referenced. See set_output_directory().
|
||||
+set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/bin )
|
||||
+set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
|
||||
+set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
|
||||
+
|
||||
# For up-to-date instructions for installing the Tensorflow dependency, refer to
|
||||
# the bot setup script: https://github.com/google/ml-compiler-opt/blob/master/buildbot/buildbot_init.sh
|
||||
# In this case, the latest C API library is available for download from
|
||||
@@ -840,9 +845,9 @@ configure_file(
|
||||
# LLVM_HAVE_TF_API, through llvm-config.h, so that a user of the LLVM library may
|
||||
# also leverage the dependency.
|
||||
set(TENSORFLOW_C_LIB_PATH "" CACHE PATH "Path to TensorFlow C library install")
|
||||
-find_library(tensorflow_c_api tensorflow PATHS ${TENSORFLOW_C_LIB_PATH}/lib)
|
||||
|
||||
-if (tensorflow_c_api)
|
||||
+if (TENSORFLOW_C_LIB_PATH)
|
||||
+ find_library(tensorflow_c_api tensorflow PATHS ${TENSORFLOW_C_LIB_PATH}/lib NO_DEFAULT_PATH REQUIRED)
|
||||
set(LLVM_HAVE_TF_API "ON" CACHE BOOL "Full Tensorflow API available")
|
||||
include_directories(${TENSORFLOW_C_LIB_PATH}/include)
|
||||
endif()
|
||||
@@ -877,12 +882,6 @@ add_custom_target(srpm
|
||||
COMMAND rpmbuild -bs --define '_topdir ${LLVM_SRPM_DIR}' ${LLVM_SRPM_BINARY_SPECFILE})
|
||||
set_target_properties(srpm PROPERTIES FOLDER "Misc")
|
||||
|
||||
-
|
||||
-# They are not referenced. See set_output_directory().
|
||||
-set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/bin )
|
||||
-set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
|
||||
-set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
|
||||
-
|
||||
if(APPLE AND DARWIN_LTO_LIBRARY)
|
||||
set(CMAKE_EXE_LINKER_FLAGS
|
||||
"${CMAKE_EXE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
|
||||
--
|
||||
2.26.2
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
commit b08a140a8fe8d0b0d16a93042b4952d6e34ab913
|
||||
Author: Piotr Sobczak <Piotr.Sobczak@amd.com>
|
||||
Date: Wed Jan 27 16:02:49 2021 +0100
|
||||
|
||||
[AMDGPU] Avoid an illegal operand in si-shrink-instructions
|
||||
|
||||
Before the patch it was possible to trigger a constant bus
|
||||
violation when folding immediates into a shrunk instruction.
|
||||
|
||||
The patch adds a check to enforce the legality of the new operand.
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D95527
|
||||
|
||||
diff --git a/llvm/lib/Target/AMDGPU/SIShrinkInstructions.cpp b/llvm/lib/Target/AMDGPU/SIShrinkInstructions.cpp
|
||||
index 9c6833a7dab6..6c1b16eddc84 100644
|
||||
--- a/llvm/lib/Target/AMDGPU/SIShrinkInstructions.cpp
|
||||
+++ b/llvm/lib/Target/AMDGPU/SIShrinkInstructions.cpp
|
||||
@@ -84,21 +84,23 @@ static bool foldImmediates(MachineInstr &MI, const SIInstrInfo *TII,
|
||||
MachineOperand &MovSrc = Def->getOperand(1);
|
||||
bool ConstantFolded = false;
|
||||
|
||||
- if (MovSrc.isImm() && (isInt<32>(MovSrc.getImm()) ||
|
||||
- isUInt<32>(MovSrc.getImm()))) {
|
||||
- // It's possible to have only one component of a super-reg defined by
|
||||
- // a single mov, so we need to clear any subregister flag.
|
||||
- Src0.setSubReg(0);
|
||||
- Src0.ChangeToImmediate(MovSrc.getImm());
|
||||
- ConstantFolded = true;
|
||||
- } else if (MovSrc.isFI()) {
|
||||
- Src0.setSubReg(0);
|
||||
- Src0.ChangeToFrameIndex(MovSrc.getIndex());
|
||||
- ConstantFolded = true;
|
||||
- } else if (MovSrc.isGlobal()) {
|
||||
- Src0.ChangeToGA(MovSrc.getGlobal(), MovSrc.getOffset(),
|
||||
- MovSrc.getTargetFlags());
|
||||
- ConstantFolded = true;
|
||||
+ if (TII->isOperandLegal(MI, Src0Idx, &MovSrc)) {
|
||||
+ if (MovSrc.isImm() &&
|
||||
+ (isInt<32>(MovSrc.getImm()) || isUInt<32>(MovSrc.getImm()))) {
|
||||
+ // It's possible to have only one component of a super-reg defined
|
||||
+ // by a single mov, so we need to clear any subregister flag.
|
||||
+ Src0.setSubReg(0);
|
||||
+ Src0.ChangeToImmediate(MovSrc.getImm());
|
||||
+ ConstantFolded = true;
|
||||
+ } else if (MovSrc.isFI()) {
|
||||
+ Src0.setSubReg(0);
|
||||
+ Src0.ChangeToFrameIndex(MovSrc.getIndex());
|
||||
+ ConstantFolded = true;
|
||||
+ } else if (MovSrc.isGlobal()) {
|
||||
+ Src0.ChangeToGA(MovSrc.getGlobal(), MovSrc.getOffset(),
|
||||
+ MovSrc.getTargetFlags());
|
||||
+ ConstantFolded = true;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (ConstantFolded) {
|
||||
diff --git a/llvm/test/CodeGen/AMDGPU/shrink-instructions-illegal-fold.mir b/llvm/test/CodeGen/AMDGPU/shrink-instructions-illegal-fold.mir
|
||||
new file mode 100644
|
||||
index 000000000000..7889f437facf
|
||||
--- /dev/null
|
||||
+++ b/llvm/test/CodeGen/AMDGPU/shrink-instructions-illegal-fold.mir
|
||||
@@ -0,0 +1,23 @@
|
||||
+# RUN: llc -march=amdgcn -mcpu=gfx900 -run-pass=si-shrink-instructions --verify-machineinstrs %s -o - | FileCheck %s
|
||||
+
|
||||
+# Make sure immediate folding into V_CNDMASK respects constant bus restrictions.
|
||||
+---
|
||||
+
|
||||
+name: shrink_cndmask_illegal_imm_folding
|
||||
+tracksRegLiveness: true
|
||||
+body: |
|
||||
+ bb.0:
|
||||
+ liveins: $vgpr0, $vgpr1
|
||||
+ ; CHECK-LABEL: name: shrink_cndmask_illegal_imm_folding
|
||||
+ ; CHECK: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
|
||||
+ ; CHECK: [[MOV:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 32768, implicit $exec
|
||||
+ ; CHECK: V_CMP_EQ_U32_e32 0, [[COPY]], implicit-def $vcc, implicit $exec
|
||||
+ ; CHECK: V_CNDMASK_B32_e32 [[MOV]], killed [[COPY]], implicit $vcc, implicit $exec
|
||||
+
|
||||
+ %0:vgpr_32 = COPY $vgpr0
|
||||
+ %1:vgpr_32 = V_MOV_B32_e32 32768, implicit $exec
|
||||
+ V_CMP_EQ_U32_e32 0, %0:vgpr_32, implicit-def $vcc, implicit $exec
|
||||
+ %2:vgpr_32 = V_CNDMASK_B32_e64 0, %1:vgpr_32, 0, killed %0:vgpr_32, $vcc, implicit $exec
|
||||
+ S_NOP 0
|
||||
+
|
||||
+...
|
||||
@@ -1,336 +0,0 @@
|
||||
From 9641fc2459b07c806c1e4d2a2345213ee6c2bafd Mon Sep 17 00:00:00 2001
|
||||
From: Evangelos Foutras <evangelos@foutrelis.com>
|
||||
Date: Sat, 11 Apr 2020 06:52:09 +0300
|
||||
Subject: [PATCH] Enable SSP and PIE by default
|
||||
|
||||
This is a minimal set of changes needed to make clang use SSP and PIE by
|
||||
default on Arch Linux. Tests that were easy to adjust have been changed
|
||||
accordingly; only test/Driver/linux-ld.c has been marked as "expected
|
||||
failure" due to the number of changes it would require (mostly replacing
|
||||
crtbegin.o with crtbeginS.o).
|
||||
|
||||
Doing so is needed in order to align clang with the new default GCC
|
||||
behavior in Arch which generates PIE executables by default and also
|
||||
defaults to -fstack-protector-strong. It is not meant to be a long term
|
||||
solution, but a simple temporary fix.
|
||||
|
||||
Hopefully these changes will be obsoleted by the introduction upstream
|
||||
of a compile-time option (https://bugs.llvm.org/show_bug.cgi?id=13410)
|
||||
---
|
||||
clang/lib/Driver/ToolChains/Linux.cpp | 14 ++++++++++++--
|
||||
clang/lib/Driver/ToolChains/Linux.h | 1 +
|
||||
clang/test/Driver/cross-linux.c | 16 ++++++++--------
|
||||
clang/test/Driver/env.c | 2 +-
|
||||
clang/test/Driver/fsanitize.c | 14 +++++++-------
|
||||
clang/test/Driver/gcc-toolchain.cpp | 2 +-
|
||||
clang/test/Driver/hexagon-toolchain-elf.c | 2 +-
|
||||
clang/test/Driver/linux-as.c | 4 ++--
|
||||
clang/test/Driver/linux-ld.c | 2 ++
|
||||
clang/test/Driver/ppc-abi.c | 16 +++++++++-------
|
||||
clang/test/Driver/riscv32-toolchain.c | 4 ++--
|
||||
clang/test/Driver/riscv64-toolchain.c | 4 ++--
|
||||
clang/test/Driver/stack-protector.c | 4 ++--
|
||||
13 files changed, 50 insertions(+), 35 deletions(-)
|
||||
|
||||
diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp
|
||||
index bff1ab1009b..da54a08657d 100644
|
||||
--- a/clang/lib/Driver/ToolChains/Linux.cpp
|
||||
+++ b/clang/lib/Driver/ToolChains/Linux.cpp
|
||||
@@ -917,8 +917,18 @@ void Linux::AddIAMCUIncludeArgs(const ArgList &DriverArgs,
|
||||
}
|
||||
|
||||
bool Linux::isPIEDefault() const {
|
||||
- return (getTriple().isAndroid() && !getTriple().isAndroidVersionLT(16)) ||
|
||||
- getTriple().isMusl() || getSanitizerArgs().requiresPIE();
|
||||
+ const bool IsMips = getTriple().isMIPS();
|
||||
+ const bool IsAndroid = getTriple().isAndroid();
|
||||
+
|
||||
+ if (IsMips || IsAndroid)
|
||||
+ return (getTriple().isAndroid() && !getTriple().isAndroidVersionLT(16)) ||
|
||||
+ getTriple().isMusl() || getSanitizerArgs().requiresPIE();
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+unsigned Linux::GetDefaultStackProtectorLevel(bool KernelOrKext) const {
|
||||
+ return 2;
|
||||
}
|
||||
|
||||
bool Linux::isNoExecStackDefault() const {
|
||||
diff --git a/clang/lib/Driver/ToolChains/Linux.h b/clang/lib/Driver/ToolChains/Linux.h
|
||||
index f5518eac218..2d4973cf40c 100644
|
||||
--- a/clang/lib/Driver/ToolChains/Linux.h
|
||||
+++ b/clang/lib/Driver/ToolChains/Linux.h
|
||||
@@ -37,6 +37,7 @@ public:
|
||||
bool isPIEDefault() const override;
|
||||
bool isNoExecStackDefault() const override;
|
||||
bool IsMathErrnoDefault() const override;
|
||||
+ unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const override;
|
||||
SanitizerMask getSupportedSanitizers() const override;
|
||||
void addProfileRTLibs(const llvm::opt::ArgList &Args,
|
||||
llvm::opt::ArgStringList &CmdArgs) const override;
|
||||
diff --git a/clang/test/Driver/cross-linux.c b/clang/test/Driver/cross-linux.c
|
||||
index 6c2dab26069..c28c5653e34 100644
|
||||
--- a/clang/test/Driver/cross-linux.c
|
||||
+++ b/clang/test/Driver/cross-linux.c
|
||||
@@ -42,8 +42,8 @@
|
||||
// CHECK-MULTI32-I386: "{{.*}}/Inputs/multilib_32bit_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0/../../../../i386-unknown-linux/bin{{/|\\\\}}ld"
|
||||
// CHECK-MULTI32-I386: "--sysroot=[[sysroot:.*/Inputs/basic_linux_tree]]"
|
||||
// CHECK-MULTI32-I386: "-m" "elf_i386"
|
||||
-// CHECK-MULTI32-I386: "crti.o" "[[gcc_install:.*/Inputs/multilib_32bit_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0]]{{/|\\\\}}crtbegin.o"
|
||||
-// CHECK-MULTI32-I386: "-L[[gcc_install]]"
|
||||
+// CHECK-MULTI32-I386: "crti.o" "crtbeginS.o"
|
||||
+// CHECK-MULTI32-I386: "-L[[gcc_install:.*/Inputs/multilib_32bit_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0]]"
|
||||
// CHECK-MULTI32-I386: "-L[[gcc_install]]/../../../../i386-unknown-linux/lib/../lib32"
|
||||
// CHECK-MULTI32-I386: "-L[[gcc_install]]/../../../../i386-unknown-linux/lib"
|
||||
// CHECK-MULTI32-I386: "-L[[sysroot]]/lib"
|
||||
@@ -60,8 +60,8 @@
|
||||
// CHECK-MULTI32-X86-64: "{{.*}}/Inputs/multilib_32bit_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0/../../../../i386-unknown-linux/bin{{/|\\\\}}ld"
|
||||
// CHECK-MULTI32-X86-64: "--sysroot=[[sysroot:.*/Inputs/basic_linux_tree]]"
|
||||
// CHECK-MULTI32-X86-64: "-m" "elf_x86_64"
|
||||
-// CHECK-MULTI32-X86-64: "crti.o" "[[gcc_install:.*/Inputs/multilib_32bit_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0]]/64{{/|\\\\}}crtbegin.o"
|
||||
-// CHECK-MULTI32-X86-64: "-L[[gcc_install]]/64"
|
||||
+// CHECK-MULTI32-X86-64: "crti.o" "crtbeginS.o"
|
||||
+// CHECK-MULTI32-X86-64: "-L[[gcc_install:.*/Inputs/multilib_32bit_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0]]/64"
|
||||
// CHECK-MULTI32-X86-64: "-L[[gcc_install]]/../../../../i386-unknown-linux/lib/../lib64"
|
||||
// CHECK-MULTI32-X86-64: "-L[[gcc_install]]"
|
||||
// CHECK-MULTI32-X86-64: "-L[[gcc_install]]/../../../../i386-unknown-linux/lib"
|
||||
@@ -79,8 +79,8 @@
|
||||
// CHECK-MULTI64-I386: "{{.*}}/Inputs/multilib_64bit_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0/../../../../x86_64-unknown-linux/bin{{/|\\\\}}ld"
|
||||
// CHECK-MULTI64-I386: "--sysroot=[[sysroot:.*/Inputs/basic_linux_tree]]"
|
||||
// CHECK-MULTI64-I386: "-m" "elf_i386"
|
||||
-// CHECK-MULTI64-I386: "crti.o" "[[gcc_install:.*/Inputs/multilib_64bit_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0]]/32{{/|\\\\}}crtbegin.o"
|
||||
-// CHECK-MULTI64-I386: "-L[[gcc_install]]/32"
|
||||
+// CHECK-MULTI64-I386: "crti.o" "crtbeginS.o"
|
||||
+// CHECK-MULTI64-I386: "-L[[gcc_install:.*/Inputs/multilib_64bit_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0]]/32"
|
||||
// CHECK-MULTI64-I386: "-L[[gcc_install]]/../../../../x86_64-unknown-linux/lib/../lib32"
|
||||
// CHECK-MULTI64-I386: "-L[[gcc_install]]"
|
||||
// CHECK-MULTI64-I386: "-L[[gcc_install]]/../../../../x86_64-unknown-linux/lib"
|
||||
@@ -98,8 +98,8 @@
|
||||
// CHECK-MULTI64-X86-64: "{{.*}}/Inputs/multilib_64bit_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0/../../../../x86_64-unknown-linux/bin{{/|\\\\}}ld"
|
||||
// CHECK-MULTI64-X86-64: "--sysroot=[[sysroot:.*/Inputs/basic_linux_tree]]"
|
||||
// CHECK-MULTI64-X86-64: "-m" "elf_x86_64"
|
||||
-// CHECK-MULTI64-X86-64: "crti.o" "[[gcc_install:.*/Inputs/multilib_64bit_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0]]{{/|\\\\}}crtbegin.o"
|
||||
-// CHECK-MULTI64-X86-64: "-L[[gcc_install]]"
|
||||
+// CHECK-MULTI64-X86-64: "crti.o" "crtbeginS.o"
|
||||
+// CHECK-MULTI64-X86-64: "-L[[gcc_install:.*/Inputs/multilib_64bit_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0]]"
|
||||
// CHECK-MULTI64-X86-64: "-L[[gcc_install]]/../../../../x86_64-unknown-linux/lib/../lib64"
|
||||
// CHECK-MULTI64-X86-64: "-L[[gcc_install]]/../../../../x86_64-unknown-linux/lib"
|
||||
// CHECK-MULTI64-X86-64: "-L[[sysroot]]/lib"
|
||||
diff --git a/clang/test/Driver/env.c b/clang/test/Driver/env.c
|
||||
index 0371bc91c4a..ea89f525121 100644
|
||||
--- a/clang/test/Driver/env.c
|
||||
+++ b/clang/test/Driver/env.c
|
||||
@@ -20,7 +20,7 @@
|
||||
//
|
||||
// CHECK-LD-32-NOT: warning:
|
||||
// CHECK-LD-32: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
|
||||
-// CHECK-LD-32: "{{.*}}/usr/lib/gcc/i386-unknown-linux/4.6.0{{/|\\\\}}crtbegin.o"
|
||||
+// CHECK-LD-32: "crtbeginS.o"
|
||||
// CHECK-LD-32: "-L[[SYSROOT]]/usr/lib/gcc/i386-unknown-linux/4.6.0"
|
||||
// CHECK-LD-32: "-L[[SYSROOT]]/usr/lib/gcc/i386-unknown-linux/4.6.0/../../../../i386-unknown-linux/lib"
|
||||
// CHECK-LD-32: "-L[[SYSROOT]]/usr/lib/gcc/i386-unknown-linux/4.6.0/../../.."
|
||||
diff --git a/clang/test/Driver/fsanitize.c b/clang/test/Driver/fsanitize.c
|
||||
index f02f94d8c5a..358917588c7 100644
|
||||
--- a/clang/test/Driver/fsanitize.c
|
||||
+++ b/clang/test/Driver/fsanitize.c
|
||||
@@ -328,15 +328,15 @@
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=vptr -fno-sanitize=vptr -fsanitize=undefined,address %s -### 2>&1
|
||||
// OK
|
||||
|
||||
-// RUN: %clang -target x86_64-linux-gnu -fsanitize=thread %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-PIE
|
||||
-// RUN: %clang -target x86_64-linux-gnu -fsanitize=memory %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-PIE
|
||||
+// RUN: %clang -target x86_64-linux-gnu -fsanitize=thread %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
|
||||
+// RUN: %clang -target x86_64-linux-gnu -fsanitize=memory %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
|
||||
// RUN: %clang -target x86_64-unknown-freebsd -fsanitize=memory %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
|
||||
// RUN: %clang -target aarch64-linux-gnu -fsanitize=memory %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
|
||||
// RUN: %clang -target arm-linux-androideabi -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIC-NO-PIE
|
||||
// RUN: %clang -target arm-linux-androideabi24 -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
|
||||
// RUN: %clang -target aarch64-linux-android -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
|
||||
-// RUN: %clang -target x86_64-linux-gnu -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-PIE
|
||||
-// RUN: %clang -target i386-linux-gnu -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-PIE
|
||||
+// RUN: %clang -target x86_64-linux-gnu -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
|
||||
+// RUN: %clang -target i386-linux-gnu -fsanitize=address %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-PIE
|
||||
|
||||
// CHECK-NO-PIE-NOT: "-pie"
|
||||
// CHECK-NO-PIE: "-mrelocation-model" "static"
|
||||
@@ -661,12 +661,12 @@
|
||||
// RUN: %clang -fno-sanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NOSP
|
||||
// NOSP-NOT: "-fsanitize=safe-stack"
|
||||
|
||||
-// RUN: %clang -target x86_64-linux-gnu -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NO-SP
|
||||
+// RUN: %clang -target x86_64-linux-gnu -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=address,safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP-ASAN
|
||||
// RUN: %clang -target x86_64-linux-gnu -fstack-protector -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP
|
||||
// RUN: %clang -target x86_64-linux-gnu -fsanitize=safe-stack -fstack-protector-all -### %s 2>&1 | FileCheck %s -check-prefix=SP
|
||||
-// RUN: %clang -target arm-linux-androideabi -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NO-SP
|
||||
-// RUN: %clang -target aarch64-linux-android -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NO-SP
|
||||
+// RUN: %clang -target arm-linux-androideabi -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP
|
||||
+// RUN: %clang -target aarch64-linux-android -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=SP
|
||||
// RUN: %clang -target i386-contiki-unknown -fsanitize=safe-stack -### %s 2>&1 | FileCheck %s -check-prefix=NO-SP
|
||||
// NO-SP-NOT: stack-protector
|
||||
// NO-SP: "-fsanitize=safe-stack"
|
||||
diff --git a/clang/test/Driver/gcc-toolchain.cpp b/clang/test/Driver/gcc-toolchain.cpp
|
||||
index 6c872f4255c..f5006d1dd9a 100644
|
||||
--- a/clang/test/Driver/gcc-toolchain.cpp
|
||||
+++ b/clang/test/Driver/gcc-toolchain.cpp
|
||||
@@ -26,6 +26,6 @@
|
||||
// the same precise formatting of the path as the '-internal-system' flags
|
||||
// above, so we just blanket wildcard match the 'crtbegin.o'.
|
||||
// CHECK: "{{[^"]*}}ld{{(.exe)?}}"
|
||||
-// CHECK: "{{[^"]*}}/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5{{/|\\\\}}crtbegin.o"
|
||||
+// CHECK: "crtbeginS.o"
|
||||
// CHECK: "-L[[TOOLCHAIN]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5"
|
||||
// CHECK: "-L[[TOOLCHAIN]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../.."
|
||||
diff --git a/clang/test/Driver/hexagon-toolchain-elf.c b/clang/test/Driver/hexagon-toolchain-elf.c
|
||||
index 44bff6f703a..6575d032f5d 100644
|
||||
--- a/clang/test/Driver/hexagon-toolchain-elf.c
|
||||
+++ b/clang/test/Driver/hexagon-toolchain-elf.c
|
||||
@@ -470,7 +470,7 @@
|
||||
// RUN: %s 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=CHECK042 %s
|
||||
// CHECK042: "-cc1"
|
||||
-// CHECK042: "-mrelocation-model" "static"
|
||||
+// CHECK042: "-mrelocation-model" "pic"
|
||||
// CHECK042: "-mllvm" "-hexagon-small-data-threshold=8"
|
||||
// CHECK042-NEXT: llvm-mc
|
||||
// CHECK042: "-gpsize=8"
|
||||
diff --git a/clang/test/Driver/linux-as.c b/clang/test/Driver/linux-as.c
|
||||
index 77ac05f3094..cb474f32898 100644
|
||||
--- a/clang/test/Driver/linux-as.c
|
||||
+++ b/clang/test/Driver/linux-as.c
|
||||
@@ -164,7 +164,7 @@
|
||||
// CHECK-PPC-NO-MCPU-NOT: as{{.*}} "-mcpu=invalid-cpu"
|
||||
//
|
||||
// RUN: %clang -target sparc64-linux -mcpu=invalid-cpu -### \
|
||||
-// RUN: -no-integrated-as -c %s 2>&1 \
|
||||
+// RUN: -no-integrated-as -fno-pic -c %s 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=CHECK-SPARCV9 %s
|
||||
// CHECK-SPARCV9: as
|
||||
// CHECK-SPARCV9: -64
|
||||
@@ -173,7 +173,7 @@
|
||||
// CHECK-SPARCV9: -o
|
||||
//
|
||||
// RUN: %clang -target sparc64-linux -mcpu=invalid-cpu -### \
|
||||
-// RUN: -no-integrated-as -fpic -c %s 2>&1 \
|
||||
+// RUN: -no-integrated-as -c %s 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=CHECK-SPARCV9PIC %s
|
||||
// CHECK-SPARCV9PIC: as
|
||||
// CHECK-SPARCV9PIC: -64
|
||||
diff --git a/clang/test/Driver/linux-ld.c b/clang/test/Driver/linux-ld.c
|
||||
index 51227550b52..d01d6627131 100644
|
||||
--- a/clang/test/Driver/linux-ld.c
|
||||
+++ b/clang/test/Driver/linux-ld.c
|
||||
@@ -1,3 +1,5 @@
|
||||
+// XFAIL: linux
|
||||
+
|
||||
// General tests that ld invocations on Linux targets sane. Note that we use
|
||||
// sysroot to make these tests independent of the host system.
|
||||
//
|
||||
diff --git a/clang/test/Driver/ppc-abi.c b/clang/test/Driver/ppc-abi.c
|
||||
index acc4981a2ee..50c798912d3 100644
|
||||
--- a/clang/test/Driver/ppc-abi.c
|
||||
+++ b/clang/test/Driver/ppc-abi.c
|
||||
@@ -1,9 +1,9 @@
|
||||
// Check passing PowerPC ABI options to the backend.
|
||||
|
||||
// RUN: %clang -target powerpc64-unknown-linux-gnu %s -### -o %t.o 2>&1 \
|
||||
-// RUN: | FileCheck -check-prefix=CHECK-ELFv1 %s
|
||||
+// RUN: | FileCheck -check-prefix=CHECK-ELFv1-PIE %s
|
||||
// RUN: %clang -target powerpc64-unknown-linux-gnu %s -### -o %t.o 2>&1 \
|
||||
-// RUN: -mabi=elfv1 | FileCheck -check-prefix=CHECK-ELFv1 %s
|
||||
+// RUN: -mabi=elfv1 | FileCheck -check-prefix=CHECK-ELFv1-PIE %s
|
||||
// RUN: %clang -target powerpc64-unknown-linux-gnu %s -### -o %t.o 2>&1 \
|
||||
// RUN: -mabi=elfv1-qpx | FileCheck -check-prefix=CHECK-ELFv1-QPX %s
|
||||
// RUN: %clang -target powerpc64-unknown-linux-gnu %s -### -o %t.o 2>&1 \
|
||||
@@ -11,9 +11,9 @@
|
||||
// RUN: %clang -target powerpc64-unknown-linux-gnu %s -### -o %t.o 2>&1 \
|
||||
// RUN: -mcpu=a2 -mqpx | FileCheck -check-prefix=CHECK-ELFv1-QPX %s
|
||||
// RUN: %clang -target powerpc64-unknown-linux-gnu %s -### -o %t.o 2>&1 \
|
||||
-// RUN: -mcpu=a2q -mno-qpx | FileCheck -check-prefix=CHECK-ELFv1 %s
|
||||
+// RUN: -mcpu=a2q -mno-qpx | FileCheck -check-prefix=CHECK-ELFv1-PIE %s
|
||||
// RUN: %clang -target powerpc64-unknown-linux-gnu %s -### -o %t.o 2>&1 \
|
||||
-// RUN: -mabi=elfv2 | FileCheck -check-prefix=CHECK-ELFv2-BE %s
|
||||
+// RUN: -mabi=elfv2 | FileCheck -check-prefix=CHECK-ELFv2-BE-PIE %s
|
||||
|
||||
// RUN: %clang -target powerpc64le-unknown-linux-gnu %s -### -o %t.o 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=CHECK-ELFv2 %s
|
||||
@@ -32,11 +32,13 @@
|
||||
|
||||
// CHECK-ELFv1: "-mrelocation-model" "static"
|
||||
// CHECK-ELFv1: "-target-abi" "elfv1"
|
||||
-// CHECK-ELFv1-LE: "-mrelocation-model" "static"
|
||||
+// CHECK-ELFv1-PIE: "-mrelocation-model" "pic" "-pic-level" "2"
|
||||
+// CHECK-ELFv1-PIE: "-target-abi" "elfv1"
|
||||
+// CHECK-ELFv1-LE: "-mrelocation-model" "pic" "-pic-level" "2"
|
||||
// CHECK-ELFv1-LE: "-target-abi" "elfv1"
|
||||
-// CHECK-ELFv1-QPX: "-mrelocation-model" "static"
|
||||
+// CHECK-ELFv1-QPX: "-mrelocation-model" "pic" "-pic-level" "2"
|
||||
// CHECK-ELFv1-QPX: "-target-abi" "elfv1-qpx"
|
||||
-// CHECK-ELFv2: "-mrelocation-model" "static"
|
||||
+// CHECK-ELFv2: "-mrelocation-model" "pic" "-pic-level" "2"
|
||||
// CHECK-ELFv2: "-target-abi" "elfv2"
|
||||
// CHECK-ELFv2-BE: "-mrelocation-model" "static"
|
||||
// CHECK-ELFv2-BE: "-target-abi" "elfv2"
|
||||
diff --git a/clang/test/Driver/riscv32-toolchain.c b/clang/test/Driver/riscv32-toolchain.c
|
||||
index 2ff3a585bda..f923b728c0f 100644
|
||||
--- a/clang/test/Driver/riscv32-toolchain.c
|
||||
+++ b/clang/test/Driver/riscv32-toolchain.c
|
||||
@@ -76,7 +76,7 @@
|
||||
// C-RV32-LINUX-MULTI-ILP32: "--sysroot={{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot"
|
||||
// C-RV32-LINUX-MULTI-ILP32: "-m" "elf32lriscv"
|
||||
// C-RV32-LINUX-MULTI-ILP32: "-dynamic-linker" "/lib/ld-linux-riscv32-ilp32.so.1"
|
||||
-// C-RV32-LINUX-MULTI-ILP32: "{{.*}}/Inputs/multilib_riscv_linux_sdk/lib/gcc/riscv64-unknown-linux-gnu/7.2.0/lib32/ilp32{{/|\\\\}}crtbegin.o"
|
||||
+// C-RV32-LINUX-MULTI-ILP32: "crtbeginS.o"
|
||||
// C-RV32-LINUX-MULTI-ILP32: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/lib/gcc/riscv64-unknown-linux-gnu/7.2.0/lib32/ilp32"
|
||||
// C-RV32-LINUX-MULTI-ILP32: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot/lib32/ilp32"
|
||||
// C-RV32-LINUX-MULTI-ILP32: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot/usr/lib32/ilp32"
|
||||
@@ -91,7 +91,7 @@
|
||||
// C-RV32-LINUX-MULTI-ILP32D: "--sysroot={{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot"
|
||||
// C-RV32-LINUX-MULTI-ILP32D: "-m" "elf32lriscv"
|
||||
// C-RV32-LINUX-MULTI-ILP32D: "-dynamic-linker" "/lib/ld-linux-riscv32-ilp32d.so.1"
|
||||
-// C-RV32-LINUX-MULTI-ILP32D: "{{.*}}/Inputs/multilib_riscv_linux_sdk/lib/gcc/riscv64-unknown-linux-gnu/7.2.0/lib32/ilp32d{{/|\\\\}}crtbegin.o"
|
||||
+// C-RV32-LINUX-MULTI-ILP32D: "crtbeginS.o"
|
||||
// C-RV32-LINUX-MULTI-ILP32D: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/lib/gcc/riscv64-unknown-linux-gnu/7.2.0/lib32/ilp32d"
|
||||
// C-RV32-LINUX-MULTI-ILP32D: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot/lib32/ilp32d"
|
||||
// C-RV32-LINUX-MULTI-ILP32D: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot/usr/lib32/ilp32d"
|
||||
diff --git a/clang/test/Driver/riscv64-toolchain.c b/clang/test/Driver/riscv64-toolchain.c
|
||||
index 42cac51de59..42a05e02fcc 100644
|
||||
--- a/clang/test/Driver/riscv64-toolchain.c
|
||||
+++ b/clang/test/Driver/riscv64-toolchain.c
|
||||
@@ -76,7 +76,7 @@
|
||||
// C-RV64-LINUX-MULTI-LP64: "--sysroot={{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot"
|
||||
// C-RV64-LINUX-MULTI-LP64: "-m" "elf64lriscv"
|
||||
// C-RV64-LINUX-MULTI-LP64: "-dynamic-linker" "/lib/ld-linux-riscv64-lp64.so.1"
|
||||
-// C-RV64-LINUX-MULTI-LP64: "{{.*}}/Inputs/multilib_riscv_linux_sdk/lib/gcc/riscv64-unknown-linux-gnu/7.2.0/lib64/lp64{{/|\\\\}}crtbegin.o"
|
||||
+// C-RV64-LINUX-MULTI-LP64: "crtbeginS.o"
|
||||
// C-RV64-LINUX-MULTI-LP64: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/lib/gcc/riscv64-unknown-linux-gnu/7.2.0/lib64/lp64"
|
||||
// C-RV64-LINUX-MULTI-LP64: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot/lib64/lp64"
|
||||
// C-RV64-LINUX-MULTI-LP64: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot/usr/lib64/lp64"
|
||||
@@ -91,7 +91,7 @@
|
||||
// C-RV64-LINUX-MULTI-LP64D: "--sysroot={{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot"
|
||||
// C-RV64-LINUX-MULTI-LP64D: "-m" "elf64lriscv"
|
||||
// C-RV64-LINUX-MULTI-LP64D: "-dynamic-linker" "/lib/ld-linux-riscv64-lp64d.so.1"
|
||||
-// C-RV64-LINUX-MULTI-LP64D: "{{.*}}/Inputs/multilib_riscv_linux_sdk/lib/gcc/riscv64-unknown-linux-gnu/7.2.0/lib64/lp64d{{/|\\\\}}crtbegin.o"
|
||||
+// C-RV64-LINUX-MULTI-LP64D: "crtbeginS.o"
|
||||
// C-RV64-LINUX-MULTI-LP64D: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/lib/gcc/riscv64-unknown-linux-gnu/7.2.0/lib64/lp64d"
|
||||
// C-RV64-LINUX-MULTI-LP64D: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot/lib64/lp64d"
|
||||
// C-RV64-LINUX-MULTI-LP64D: "-L{{.*}}/Inputs/multilib_riscv_linux_sdk/sysroot/usr/lib64/lp64d"
|
||||
diff --git a/clang/test/Driver/stack-protector.c b/clang/test/Driver/stack-protector.c
|
||||
index a3e40b50eed..dfffe0d6cf8 100644
|
||||
--- a/clang/test/Driver/stack-protector.c
|
||||
+++ b/clang/test/Driver/stack-protector.c
|
||||
@@ -3,11 +3,11 @@
|
||||
// NOSSP-NOT: "-stack-protector-buffer-size"
|
||||
|
||||
// RUN: %clang -target i386-unknown-linux -fstack-protector -### %s 2>&1 | FileCheck %s -check-prefix=SSP
|
||||
-// SSP: "-stack-protector" "1"
|
||||
+// SSP: "-stack-protector" "2"
|
||||
// SSP-NOT: "-stack-protector-buffer-size"
|
||||
|
||||
// RUN: %clang -target i386-unknown-linux -fstack-protector --param ssp-buffer-size=16 -### %s 2>&1 | FileCheck %s -check-prefix=SSP-BUF
|
||||
-// SSP-BUF: "-stack-protector" "1"
|
||||
+// SSP-BUF: "-stack-protector" "2"
|
||||
// SSP-BUF: "-stack-protector-buffer-size" "16"
|
||||
|
||||
// RUN: %clang -target i386-pc-openbsd -### %s 2>&1 | FileCheck %s -check-prefix=OPENBSD
|
||||
@@ -1,42 +0,0 @@
|
||||
From 3d3abc22b3ef189813a3b9061c2a90ba86a32f44 Mon Sep 17 00:00:00 2001
|
||||
From: serge-sans-paille <sguelton@redhat.com>
|
||||
Date: Tue, 11 May 2021 20:46:58 +0200
|
||||
Subject: [PATCH] Force visibility of llvm::Any to external
|
||||
|
||||
llvm::Any::TypeId::Id relies on the uniqueness of the address of a static
|
||||
variable defined in a template function. hidden visibility implies vague linkage
|
||||
for that variable, which does not guarantee the uniqueness of the address across
|
||||
a binary and a shared library. This totally breaks the implementation of
|
||||
llvm::Any.
|
||||
|
||||
Ideally, setting visibility to llvm::Any::TypeId::Id should be enough,
|
||||
unfortunately this doesn't work as expected and we lack time (before 12.0.1
|
||||
release) to understand why setting the visibility to llvm::Any does work.
|
||||
|
||||
See https://gcc.gnu.org/wiki/Visibility and
|
||||
https://gcc.gnu.org/onlinedocs/gcc/Vague-Linkage.html
|
||||
for more information on that topic.
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D101972
|
||||
---
|
||||
llvm/include/llvm/ADT/Any.h | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/llvm/include/llvm/ADT/Any.h b/llvm/include/llvm/ADT/Any.h
|
||||
index 15b114f7932d..e513586845a1 100644
|
||||
--- a/llvm/include/llvm/ADT/Any.h
|
||||
+++ b/llvm/include/llvm/ADT/Any.h
|
||||
@@ -23,7 +23,12 @@
|
||||
|
||||
namespace llvm {
|
||||
|
||||
-class Any {
|
||||
+class LLVM_EXTERNAL_VISIBILITY Any {
|
||||
+
|
||||
+ // The `Typeid<T>::Id` static data member below is a globally unique
|
||||
+ // identifier for the type `T`. It is explicitly marked with default
|
||||
+ // visibility so that when `-fvisibility=hidden` is used, the loader still
|
||||
+ // merges duplicate definitions across DSO boundaries.
|
||||
template <typename T> struct TypeId { static const char Id; };
|
||||
|
||||
struct StorageBase {
|
||||
@@ -1,21 +0,0 @@
|
||||
diff -Nuar a/lld/test/ELF/shared.s b/lld/test/ELF/shared.s
|
||||
--- a/lld/test/ELF/shared.s 2020-10-07 13:10:48.000000000 +0300
|
||||
+++ b/lld/test/ELF/shared.s 2020-11-24 11:22:37.683751304 +0300
|
||||
@@ -3,7 +3,7 @@
|
||||
// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %p/Inputs/shared.s -o %t2.o
|
||||
// RUN: ld.lld --hash-style=sysv -shared %t2.o -soname=t2.so -o %t2.so
|
||||
// RUN: llvm-readobj -S %t2.so | FileCheck --check-prefix=SO %s
|
||||
-// RUN: ld.lld --hash-style=sysv -dynamic-linker /lib64/ld-linux-x86-64.so.2 -rpath foo -rpath bar --export-dynamic %t.o %t2.so -o %t
|
||||
+// RUN: ld.lld --hash-style=sysv -dynamic-linker /lib/ld-linux-x86-64.so.2 -rpath foo -rpath bar --export-dynamic %t.o %t2.so -o %t
|
||||
// RUN: llvm-readobj -S -l --dynamic-table --symbols --dyn-syms --section-data --hash-table %t | FileCheck %s
|
||||
// RUN: ld.lld --hash-style=sysv %t.o %t2.so %t2.so -o %t2
|
||||
// RUN: llvm-readobj --dyn-syms %t2 | FileCheck --check-prefix=DONT_EXPORT %s
|
||||
@@ -33,7 +33,7 @@
|
||||
// CHECK-NEXT: AddressAlignment: 1
|
||||
// CHECK-NEXT: EntrySize: 0
|
||||
// CHECK-NEXT: SectionData (
|
||||
-// CHECK-NEXT: 0000: 2F6C6962 36342F6C 642D6C69 6E75782D |/lib64/ld-linux-|
|
||||
+// CHECK-NEXT: 0000: 2F6C6962 36342F6C 642D6C69 6E75782D |/lib/ld-linux-|
|
||||
// CHECK-NEXT: 0010: 7838362D 36342E73 6F2E3200 |x86-64.so.2.|
|
||||
// CHECK-NEXT: )
|
||||
// CHECK-NEXT: }
|
||||
@@ -1,870 +0,0 @@
|
||||
From a1e0363c7402f7aa58e24e0e6dfa447ebabc1910 Mon Sep 17 00:00:00 2001
|
||||
From: serge-sans-paille <sguelton@redhat.com>
|
||||
Date: Wed, 30 Sep 2020 11:35:00 +0200
|
||||
Subject: [PATCH 1/3] Fix limit behavior of dynamic alloca
|
||||
|
||||
When the allocation size is 0, we shouldn't probe. Within [1, PAGE_SIZE], we
|
||||
should probe once etc.
|
||||
|
||||
This fixes https://bugs.llvm.org/show_bug.cgi?id=47657
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D88548
|
||||
|
||||
(cherry picked from commit 9573c9f2a363da71b2c07a3add4e52721e6028a0)
|
||||
---
|
||||
llvm/lib/Target/X86/X86ISelLowering.cpp | 2 +-
|
||||
llvm/test/CodeGen/X86/stack-clash-dynamic-alloca.ll | 8 ++++----
|
||||
2 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
|
||||
index fd1e6517dfac..f68ae4461fe3 100644
|
||||
--- a/lib/Target/X86/X86ISelLowering.cpp
|
||||
+++ b/lib/Target/X86/X86ISelLowering.cpp
|
||||
@@ -31876,7 +31876,7 @@ X86TargetLowering::EmitLoweredProbedAlloca(MachineInstr &MI,
|
||||
|
||||
BuildMI(testMBB, DL, TII->get(X86::JCC_1))
|
||||
.addMBB(tailMBB)
|
||||
- .addImm(X86::COND_L);
|
||||
+ .addImm(X86::COND_LE);
|
||||
testMBB->addSuccessor(blockMBB);
|
||||
testMBB->addSuccessor(tailMBB);
|
||||
|
||||
diff --git a/test/CodeGen/X86/stack-clash-dynamic-alloca.ll b/test/CodeGen/X86/stack-clash-dynamic-alloca.ll
|
||||
index bc4678564083..82fd67842c8a 100644
|
||||
--- a/test/CodeGen/X86/stack-clash-dynamic-alloca.ll
|
||||
+++ b/test/CodeGen/X86/stack-clash-dynamic-alloca.ll
|
||||
@@ -24,12 +24,12 @@ attributes #0 = {"probe-stack"="inline-asm"}
|
||||
; CHECK-X86-64-NEXT: andq $-16, %rcx
|
||||
; CHECK-X86-64-NEXT: subq %rcx, %rax
|
||||
; CHECK-X86-64-NEXT: cmpq %rsp, %rax
|
||||
-; CHECK-X86-64-NEXT: jl .LBB0_3
|
||||
+; CHECK-X86-64-NEXT: jle .LBB0_3
|
||||
; CHECK-X86-64-NEXT: .LBB0_2: # =>This Inner Loop Header: Depth=1
|
||||
; CHECK-X86-64-NEXT: movq $0, (%rsp)
|
||||
; CHECK-X86-64-NEXT: subq $4096, %rsp # imm = 0x1000
|
||||
; CHECK-X86-64-NEXT: cmpq %rsp, %rax
|
||||
-; CHECK-X86-64-NEXT: jge .LBB0_2
|
||||
+; CHECK-X86-64-NEXT: jg .LBB0_2
|
||||
; CHECK-X86-64-NEXT: .LBB0_3:
|
||||
; CHECK-X86-64-NEXT: movq %rax, %rsp
|
||||
; CHECK-X86-64-NEXT: movl $1, 4792(%rax)
|
||||
@@ -54,12 +54,12 @@ attributes #0 = {"probe-stack"="inline-asm"}
|
||||
; CHECK-X86-32-NEXT: andl $-16, %ecx
|
||||
; CHECK-X86-32-NEXT: subl %ecx, %eax
|
||||
; CHECK-X86-32-NEXT: cmpl %esp, %eax
|
||||
-; CHECK-X86-32-NEXT: jl .LBB0_3
|
||||
+; CHECK-X86-32-NEXT: jle .LBB0_3
|
||||
; CHECK-X86-32-NEXT: .LBB0_2: # =>This Inner Loop Header: Depth=1
|
||||
; CHECK-X86-32-NEXT: movl $0, (%esp)
|
||||
; CHECK-X86-32-NEXT: subl $4096, %esp # imm = 0x1000
|
||||
; CHECK-X86-32-NEXT: cmpl %esp, %eax
|
||||
-; CHECK-X86-32-NEXT: jge .LBB0_2
|
||||
+; CHECK-X86-32-NEXT: jg .LBB0_2
|
||||
; CHECK-X86-32-NEXT: .LBB0_3:
|
||||
; CHECK-X86-32-NEXT: movl %eax, %esp
|
||||
; CHECK-X86-32-NEXT: movl $1, 4792(%eax)
|
||||
|
||||
From aac36687f7978f33751daf2870b5c812124ebfaf Mon Sep 17 00:00:00 2001
|
||||
From: serge-sans-paille <sguelton@redhat.com>
|
||||
Date: Thu, 23 Jul 2020 16:22:48 +0200
|
||||
Subject: [PATCH 2/3] Fix interaction between stack alignment and inline-asm
|
||||
stack clash protection
|
||||
|
||||
As reported in https://github.com/rust-lang/rust/issues/70143 alignment is not
|
||||
taken into account when doing the probing. Fix that by adjusting the first probe
|
||||
if the stack align is small, or by extending the dynamic probing if the
|
||||
alignment is large.
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D84419
|
||||
|
||||
(cherry picked from commit f2c6bfa350de142e4d63808d03335f69bd136d6a)
|
||||
---
|
||||
llvm/lib/Target/X86/X86FrameLowering.cpp | 222 ++++++++++++++++--
|
||||
llvm/lib/Target/X86/X86FrameLowering.h | 8 +-
|
||||
.../X86/stack-clash-large-large-align.ll | 88 +++++++
|
||||
.../CodeGen/X86/stack-clash-no-free-probe.ll | 27 ---
|
||||
.../stack-clash-small-alloc-medium-align.ll | 135 +++++++++++
|
||||
.../X86/stack-clash-small-large-align.ll | 83 +++++++
|
||||
6 files changed, 512 insertions(+), 51 deletions(-)
|
||||
create mode 100644 llvm/test/CodeGen/X86/stack-clash-large-large-align.ll
|
||||
delete mode 100644 llvm/test/CodeGen/X86/stack-clash-no-free-probe.ll
|
||||
create mode 100644 llvm/test/CodeGen/X86/stack-clash-small-alloc-medium-align.ll
|
||||
create mode 100644 llvm/test/CodeGen/X86/stack-clash-small-large-align.ll
|
||||
|
||||
diff --git a/lib/Target/X86/X86FrameLowering.cpp b/lib/Target/X86/X86FrameLowering.cpp
|
||||
index c7ca6fb2a4fc..db6b68659493 100644
|
||||
--- a/lib/Target/X86/X86FrameLowering.cpp
|
||||
+++ b/lib/Target/X86/X86FrameLowering.cpp
|
||||
@@ -586,29 +586,55 @@ void X86FrameLowering::emitStackProbeInlineGeneric(
|
||||
const uint64_t StackProbeSize = TLI.getStackProbeSize(MF);
|
||||
uint64_t ProbeChunk = StackProbeSize * 8;
|
||||
|
||||
+ uint64_t MaxAlign =
|
||||
+ TRI->needsStackRealignment(MF) ? calculateMaxStackAlign(MF) : 0;
|
||||
+
|
||||
// Synthesize a loop or unroll it, depending on the number of iterations.
|
||||
+ // BuildStackAlignAND ensures that only MaxAlign % StackProbeSize bits left
|
||||
+ // between the unaligned rsp and current rsp.
|
||||
if (Offset > ProbeChunk) {
|
||||
- emitStackProbeInlineGenericLoop(MF, MBB, MBBI, DL, Offset);
|
||||
+ emitStackProbeInlineGenericLoop(MF, MBB, MBBI, DL, Offset,
|
||||
+ MaxAlign % StackProbeSize);
|
||||
} else {
|
||||
- emitStackProbeInlineGenericBlock(MF, MBB, MBBI, DL, Offset);
|
||||
+ emitStackProbeInlineGenericBlock(MF, MBB, MBBI, DL, Offset,
|
||||
+ MaxAlign % StackProbeSize);
|
||||
}
|
||||
}
|
||||
|
||||
void X86FrameLowering::emitStackProbeInlineGenericBlock(
|
||||
MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
- MachineBasicBlock::iterator MBBI, const DebugLoc &DL,
|
||||
- uint64_t Offset) const {
|
||||
+ MachineBasicBlock::iterator MBBI, const DebugLoc &DL, uint64_t Offset,
|
||||
+ uint64_t AlignOffset) const {
|
||||
|
||||
const X86Subtarget &STI = MF.getSubtarget<X86Subtarget>();
|
||||
const X86TargetLowering &TLI = *STI.getTargetLowering();
|
||||
const unsigned Opc = getSUBriOpcode(Uses64BitFramePtr, Offset);
|
||||
const unsigned MovMIOpc = Is64Bit ? X86::MOV64mi32 : X86::MOV32mi;
|
||||
const uint64_t StackProbeSize = TLI.getStackProbeSize(MF);
|
||||
+
|
||||
uint64_t CurrentOffset = 0;
|
||||
- // 0 Thanks to return address being saved on the stack
|
||||
- uint64_t CurrentProbeOffset = 0;
|
||||
|
||||
- // For the first N - 1 pages, just probe. I tried to take advantage of
|
||||
+ assert(AlignOffset < StackProbeSize);
|
||||
+
|
||||
+ // If the offset is so small it fits within a page, there's nothing to do.
|
||||
+ if (StackProbeSize < Offset + AlignOffset) {
|
||||
+
|
||||
+ MachineInstr *MI = BuildMI(MBB, MBBI, DL, TII.get(Opc), StackPtr)
|
||||
+ .addReg(StackPtr)
|
||||
+ .addImm(StackProbeSize - AlignOffset)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+ MI->getOperand(3).setIsDead(); // The EFLAGS implicit def is dead.
|
||||
+
|
||||
+ addRegOffset(BuildMI(MBB, MBBI, DL, TII.get(MovMIOpc))
|
||||
+ .setMIFlag(MachineInstr::FrameSetup),
|
||||
+ StackPtr, false, 0)
|
||||
+ .addImm(0)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+ NumFrameExtraProbe++;
|
||||
+ CurrentOffset = StackProbeSize - AlignOffset;
|
||||
+ }
|
||||
+
|
||||
+ // For the next N - 1 pages, just probe. I tried to take advantage of
|
||||
// natural probes but it implies much more logic and there was very few
|
||||
// interesting natural probes to interleave.
|
||||
while (CurrentOffset + StackProbeSize < Offset) {
|
||||
@@ -626,9 +652,9 @@ void X86FrameLowering::emitStackProbeInlineGenericBlock(
|
||||
.setMIFlag(MachineInstr::FrameSetup);
|
||||
NumFrameExtraProbe++;
|
||||
CurrentOffset += StackProbeSize;
|
||||
- CurrentProbeOffset += StackProbeSize;
|
||||
}
|
||||
|
||||
+ // No need to probe the tail, it is smaller than a Page.
|
||||
uint64_t ChunkSize = Offset - CurrentOffset;
|
||||
MachineInstr *MI = BuildMI(MBB, MBBI, DL, TII.get(Opc), StackPtr)
|
||||
.addReg(StackPtr)
|
||||
@@ -639,8 +665,8 @@ void X86FrameLowering::emitStackProbeInlineGenericBlock(
|
||||
|
||||
void X86FrameLowering::emitStackProbeInlineGenericLoop(
|
||||
MachineFunction &MF, MachineBasicBlock &MBB,
|
||||
- MachineBasicBlock::iterator MBBI, const DebugLoc &DL,
|
||||
- uint64_t Offset) const {
|
||||
+ MachineBasicBlock::iterator MBBI, const DebugLoc &DL, uint64_t Offset,
|
||||
+ uint64_t AlignOffset) const {
|
||||
assert(Offset && "null offset");
|
||||
|
||||
const X86Subtarget &STI = MF.getSubtarget<X86Subtarget>();
|
||||
@@ -648,6 +674,26 @@ void X86FrameLowering::emitStackProbeInlineGenericLoop(
|
||||
const unsigned MovMIOpc = Is64Bit ? X86::MOV64mi32 : X86::MOV32mi;
|
||||
const uint64_t StackProbeSize = TLI.getStackProbeSize(MF);
|
||||
|
||||
+ if (AlignOffset) {
|
||||
+ if (AlignOffset < StackProbeSize) {
|
||||
+ // Perform a first smaller allocation followed by a probe.
|
||||
+ const unsigned SUBOpc = getSUBriOpcode(Uses64BitFramePtr, AlignOffset);
|
||||
+ MachineInstr *MI = BuildMI(MBB, MBBI, DL, TII.get(SUBOpc), StackPtr)
|
||||
+ .addReg(StackPtr)
|
||||
+ .addImm(AlignOffset)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+ MI->getOperand(3).setIsDead(); // The EFLAGS implicit def is dead.
|
||||
+
|
||||
+ addRegOffset(BuildMI(MBB, MBBI, DL, TII.get(MovMIOpc))
|
||||
+ .setMIFlag(MachineInstr::FrameSetup),
|
||||
+ StackPtr, false, 0)
|
||||
+ .addImm(0)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+ NumFrameExtraProbe++;
|
||||
+ Offset -= AlignOffset;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
// Synthesize a loop
|
||||
NumFrameLoopProbe++;
|
||||
const BasicBlock *LLVM_BB = MBB.getBasicBlock();
|
||||
@@ -666,8 +712,8 @@ void X86FrameLowering::emitStackProbeInlineGenericLoop(
|
||||
|
||||
// save loop bound
|
||||
{
|
||||
- const unsigned Opc = getSUBriOpcode(Uses64BitFramePtr, Offset);
|
||||
- BuildMI(MBB, MBBI, DL, TII.get(Opc), FinalStackProbed)
|
||||
+ const unsigned SUBOpc = getSUBriOpcode(Uses64BitFramePtr, Offset);
|
||||
+ BuildMI(MBB, MBBI, DL, TII.get(SUBOpc), FinalStackProbed)
|
||||
.addReg(FinalStackProbed)
|
||||
.addImm(Offset / StackProbeSize * StackProbeSize)
|
||||
.setMIFlag(MachineInstr::FrameSetup);
|
||||
@@ -675,8 +721,8 @@ void X86FrameLowering::emitStackProbeInlineGenericLoop(
|
||||
|
||||
// allocate a page
|
||||
{
|
||||
- const unsigned Opc = getSUBriOpcode(Uses64BitFramePtr, StackProbeSize);
|
||||
- BuildMI(testMBB, DL, TII.get(Opc), StackPtr)
|
||||
+ const unsigned SUBOpc = getSUBriOpcode(Uses64BitFramePtr, StackProbeSize);
|
||||
+ BuildMI(testMBB, DL, TII.get(SUBOpc), StackPtr)
|
||||
.addReg(StackPtr)
|
||||
.addImm(StackProbeSize)
|
||||
.setMIFlag(MachineInstr::FrameSetup);
|
||||
@@ -1052,13 +1098,149 @@ void X86FrameLowering::BuildStackAlignAND(MachineBasicBlock &MBB,
|
||||
uint64_t MaxAlign) const {
|
||||
uint64_t Val = -MaxAlign;
|
||||
unsigned AndOp = getANDriOpcode(Uses64BitFramePtr, Val);
|
||||
- MachineInstr *MI = BuildMI(MBB, MBBI, DL, TII.get(AndOp), Reg)
|
||||
- .addReg(Reg)
|
||||
- .addImm(Val)
|
||||
- .setMIFlag(MachineInstr::FrameSetup);
|
||||
|
||||
- // The EFLAGS implicit def is dead.
|
||||
- MI->getOperand(3).setIsDead();
|
||||
+ MachineFunction &MF = *MBB.getParent();
|
||||
+ const X86Subtarget &STI = MF.getSubtarget<X86Subtarget>();
|
||||
+ const X86TargetLowering &TLI = *STI.getTargetLowering();
|
||||
+ const uint64_t StackProbeSize = TLI.getStackProbeSize(MF);
|
||||
+ const bool EmitInlineStackProbe = TLI.hasInlineStackProbe(MF);
|
||||
+
|
||||
+ // We want to make sure that (in worst case) less than StackProbeSize bytes
|
||||
+ // are not probed after the AND. This assumption is used in
|
||||
+ // emitStackProbeInlineGeneric.
|
||||
+ if (Reg == StackPtr && EmitInlineStackProbe && MaxAlign >= StackProbeSize) {
|
||||
+ {
|
||||
+ NumFrameLoopProbe++;
|
||||
+ MachineBasicBlock *entryMBB =
|
||||
+ MF.CreateMachineBasicBlock(MBB.getBasicBlock());
|
||||
+ MachineBasicBlock *headMBB =
|
||||
+ MF.CreateMachineBasicBlock(MBB.getBasicBlock());
|
||||
+ MachineBasicBlock *bodyMBB =
|
||||
+ MF.CreateMachineBasicBlock(MBB.getBasicBlock());
|
||||
+ MachineBasicBlock *footMBB =
|
||||
+ MF.CreateMachineBasicBlock(MBB.getBasicBlock());
|
||||
+
|
||||
+ MachineFunction::iterator MBBIter = MBB.getIterator();
|
||||
+ MF.insert(MBBIter, entryMBB);
|
||||
+ MF.insert(MBBIter, headMBB);
|
||||
+ MF.insert(MBBIter, bodyMBB);
|
||||
+ MF.insert(MBBIter, footMBB);
|
||||
+ const unsigned MovMIOpc = Is64Bit ? X86::MOV64mi32 : X86::MOV32mi;
|
||||
+ Register FinalStackProbed = Uses64BitFramePtr ? X86::R11 : X86::R11D;
|
||||
+
|
||||
+ // Setup entry block
|
||||
+ {
|
||||
+
|
||||
+ entryMBB->splice(entryMBB->end(), &MBB, MBB.begin(), MBBI);
|
||||
+ BuildMI(entryMBB, DL, TII.get(TargetOpcode::COPY), FinalStackProbed)
|
||||
+ .addReg(StackPtr)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+ MachineInstr *MI =
|
||||
+ BuildMI(entryMBB, DL, TII.get(AndOp), FinalStackProbed)
|
||||
+ .addReg(FinalStackProbed)
|
||||
+ .addImm(Val)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+
|
||||
+ // The EFLAGS implicit def is dead.
|
||||
+ MI->getOperand(3).setIsDead();
|
||||
+
|
||||
+ BuildMI(entryMBB, DL,
|
||||
+ TII.get(Uses64BitFramePtr ? X86::CMP64rr : X86::CMP32rr))
|
||||
+ .addReg(FinalStackProbed)
|
||||
+ .addReg(StackPtr)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+ BuildMI(entryMBB, DL, TII.get(X86::JCC_1))
|
||||
+ .addMBB(&MBB)
|
||||
+ .addImm(X86::COND_E)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+ entryMBB->addSuccessor(headMBB);
|
||||
+ entryMBB->addSuccessor(&MBB);
|
||||
+ }
|
||||
+
|
||||
+ // Loop entry block
|
||||
+
|
||||
+ {
|
||||
+ const unsigned SUBOpc =
|
||||
+ getSUBriOpcode(Uses64BitFramePtr, StackProbeSize);
|
||||
+ BuildMI(headMBB, DL, TII.get(SUBOpc), StackPtr)
|
||||
+ .addReg(StackPtr)
|
||||
+ .addImm(StackProbeSize)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+
|
||||
+ BuildMI(headMBB, DL,
|
||||
+ TII.get(Uses64BitFramePtr ? X86::CMP64rr : X86::CMP32rr))
|
||||
+ .addReg(FinalStackProbed)
|
||||
+ .addReg(StackPtr)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+
|
||||
+ // jump
|
||||
+ BuildMI(headMBB, DL, TII.get(X86::JCC_1))
|
||||
+ .addMBB(footMBB)
|
||||
+ .addImm(X86::COND_B)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+
|
||||
+ headMBB->addSuccessor(bodyMBB);
|
||||
+ headMBB->addSuccessor(footMBB);
|
||||
+ }
|
||||
+
|
||||
+ // setup loop body
|
||||
+ {
|
||||
+ addRegOffset(BuildMI(bodyMBB, DL, TII.get(MovMIOpc))
|
||||
+ .setMIFlag(MachineInstr::FrameSetup),
|
||||
+ StackPtr, false, 0)
|
||||
+ .addImm(0)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+
|
||||
+ const unsigned SUBOpc =
|
||||
+ getSUBriOpcode(Uses64BitFramePtr, StackProbeSize);
|
||||
+ BuildMI(bodyMBB, DL, TII.get(SUBOpc), StackPtr)
|
||||
+ .addReg(StackPtr)
|
||||
+ .addImm(StackProbeSize)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+
|
||||
+ // cmp with stack pointer bound
|
||||
+ BuildMI(bodyMBB, DL,
|
||||
+ TII.get(Uses64BitFramePtr ? X86::CMP64rr : X86::CMP32rr))
|
||||
+ .addReg(FinalStackProbed)
|
||||
+ .addReg(StackPtr)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+
|
||||
+ // jump
|
||||
+ BuildMI(bodyMBB, DL, TII.get(X86::JCC_1))
|
||||
+ .addMBB(bodyMBB)
|
||||
+ .addImm(X86::COND_B)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+ bodyMBB->addSuccessor(bodyMBB);
|
||||
+ bodyMBB->addSuccessor(footMBB);
|
||||
+ }
|
||||
+
|
||||
+ // setup loop footer
|
||||
+ {
|
||||
+ BuildMI(footMBB, DL, TII.get(TargetOpcode::COPY), StackPtr)
|
||||
+ .addReg(FinalStackProbed)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+ addRegOffset(BuildMI(footMBB, DL, TII.get(MovMIOpc))
|
||||
+ .setMIFlag(MachineInstr::FrameSetup),
|
||||
+ StackPtr, false, 0)
|
||||
+ .addImm(0)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+ footMBB->addSuccessor(&MBB);
|
||||
+ }
|
||||
+
|
||||
+ recomputeLiveIns(*headMBB);
|
||||
+ recomputeLiveIns(*bodyMBB);
|
||||
+ recomputeLiveIns(*footMBB);
|
||||
+ recomputeLiveIns(MBB);
|
||||
+ }
|
||||
+ } else {
|
||||
+ MachineInstr *MI = BuildMI(MBB, MBBI, DL, TII.get(AndOp), Reg)
|
||||
+ .addReg(Reg)
|
||||
+ .addImm(Val)
|
||||
+ .setMIFlag(MachineInstr::FrameSetup);
|
||||
+
|
||||
+ // The EFLAGS implicit def is dead.
|
||||
+ MI->getOperand(3).setIsDead();
|
||||
+ }
|
||||
}
|
||||
|
||||
bool X86FrameLowering::has128ByteRedZone(const MachineFunction& MF) const {
|
||||
diff --git a/lib/Target/X86/X86FrameLowering.h b/lib/Target/X86/X86FrameLowering.h
|
||||
index c0b4be95f88d..bb2e83205e71 100644
|
||||
--- a/lib/Target/X86/X86FrameLowering.h
|
||||
+++ b/lib/Target/X86/X86FrameLowering.h
|
||||
@@ -213,14 +213,14 @@ private:
|
||||
void emitStackProbeInlineGenericBlock(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MBBI,
|
||||
- const DebugLoc &DL,
|
||||
- uint64_t Offset) const;
|
||||
+ const DebugLoc &DL, uint64_t Offset,
|
||||
+ uint64_t Align) const;
|
||||
|
||||
void emitStackProbeInlineGenericLoop(MachineFunction &MF,
|
||||
MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MBBI,
|
||||
- const DebugLoc &DL,
|
||||
- uint64_t Offset) const;
|
||||
+ const DebugLoc &DL, uint64_t Offset,
|
||||
+ uint64_t Align) const;
|
||||
|
||||
/// Emit a stub to later inline the target stack probe.
|
||||
MachineInstr *emitStackProbeInlineStub(MachineFunction &MF,
|
||||
diff --git a/test/CodeGen/X86/stack-clash-large-large-align.ll b/test/CodeGen/X86/stack-clash-large-large-align.ll
|
||||
new file mode 100644
|
||||
index 000000000000..6c981cb4ac91
|
||||
--- /dev/null
|
||||
+++ b/test/CodeGen/X86/stack-clash-large-large-align.ll
|
||||
@@ -0,0 +1,88 @@
|
||||
+; RUN: llc < %s | FileCheck %s
|
||||
+
|
||||
+
|
||||
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
+target triple = "x86_64-unknown-linux-gnu"
|
||||
+
|
||||
+define i32 @foo_noprotect() local_unnamed_addr {
|
||||
+; CHECK-LABEL: foo_noprotect:
|
||||
+; CHECK: # %bb.0:
|
||||
+; CHECK-NEXT: pushq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_offset 16
|
||||
+; CHECK-NEXT: .cfi_offset %rbp, -16
|
||||
+; CHECK-NEXT: movq %rsp, %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_register %rbp
|
||||
+; CHECK-NEXT: andq $-4096, %rsp # imm = 0xF000
|
||||
+; CHECK-NEXT: subq $73728, %rsp # imm = 0x12000
|
||||
+; CHECK-NEXT: movl $1, 392(%rsp)
|
||||
+; CHECK-NEXT: movl $1, 28792(%rsp)
|
||||
+; CHECK-NEXT: movl (%rsp), %eax
|
||||
+; CHECK-NEXT: movq %rbp, %rsp
|
||||
+; CHECK-NEXT: popq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa %rsp, 8
|
||||
+; CHECK-NEXT: retq
|
||||
+
|
||||
+
|
||||
+ %a = alloca i32, i64 18000, align 4096
|
||||
+ %b0 = getelementptr inbounds i32, i32* %a, i64 98
|
||||
+ %b1 = getelementptr inbounds i32, i32* %a, i64 7198
|
||||
+ store volatile i32 1, i32* %b0
|
||||
+ store volatile i32 1, i32* %b1
|
||||
+ %c = load volatile i32, i32* %a
|
||||
+ ret i32 %c
|
||||
+}
|
||||
+
|
||||
+define i32 @foo_protect() local_unnamed_addr #0 {
|
||||
+; CHECK-LABEL: foo_protect:
|
||||
+; CHECK: # %bb.0:
|
||||
+; CHECK-NEXT: pushq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_offset 16
|
||||
+; CHECK-NEXT: .cfi_offset %rbp, -16
|
||||
+; CHECK-NEXT: movq %rsp, %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_register %rbp
|
||||
+; CHECK-NEXT: movq %rsp, %r11
|
||||
+; CHECK-NEXT: andq $-4096, %r11 # imm = 0xF000
|
||||
+; CHECK-NEXT: cmpq %rsp, %r11
|
||||
+; CHECK-NEXT: je .LBB1_4
|
||||
+; CHECK-NEXT:# %bb.1:
|
||||
+; CHECK-NEXT: subq $4096, %rsp # imm = 0x1000
|
||||
+; CHECK-NEXT: cmpq %rsp, %r11
|
||||
+; CHECK-NEXT: jb .LBB1_3
|
||||
+; CHECK-NEXT:.LBB1_2: # =>This Inner Loop Header: Depth=1
|
||||
+; CHECK-NEXT: movq $0, (%rsp)
|
||||
+; CHECK-NEXT: subq $4096, %rsp # imm = 0x1000
|
||||
+; CHECK-NEXT: cmpq %rsp, %r11
|
||||
+; CHECK-NEXT: jb .LBB1_2
|
||||
+; CHECK-NEXT:.LBB1_3:
|
||||
+; CHECK-NEXT: movq %r11, %rsp
|
||||
+; CHECK-NEXT: movq $0, (%rsp)
|
||||
+; CHECK-NEXT:.LBB1_4:
|
||||
+; CHECK-NEXT: movq %rsp, %r11
|
||||
+; CHECK-NEXT: subq $73728, %r11 # imm = 0x12000
|
||||
+; CHECK-NEXT:.LBB1_5: # =>This Inner Loop Header: Depth=1
|
||||
+; CHECK-NEXT: subq $4096, %rsp # imm = 0x1000
|
||||
+; CHECK-NEXT: movq $0, (%rsp)
|
||||
+; CHECK-NEXT: cmpq %r11, %rsp
|
||||
+; CHECK-NEXT: jne .LBB1_5
|
||||
+; CHECK-NEXT:# %bb.6:
|
||||
+; CHECK-NEXT: movl $1, 392(%rsp)
|
||||
+; CHECK-NEXT: movl $1, 28792(%rsp)
|
||||
+; CHECK-NEXT: movl (%rsp), %eax
|
||||
+; CHECK-NEXT: movq %rbp, %rsp
|
||||
+; CHECK-NEXT: popq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa %rsp, 8
|
||||
+; CHECK-NEXT: retq
|
||||
+
|
||||
+
|
||||
+
|
||||
+
|
||||
+ %a = alloca i32, i64 18000, align 4096
|
||||
+ %b0 = getelementptr inbounds i32, i32* %a, i64 98
|
||||
+ %b1 = getelementptr inbounds i32, i32* %a, i64 7198
|
||||
+ store volatile i32 1, i32* %b0
|
||||
+ store volatile i32 1, i32* %b1
|
||||
+ %c = load volatile i32, i32* %a
|
||||
+ ret i32 %c
|
||||
+}
|
||||
+
|
||||
+attributes #0 = {"probe-stack"="inline-asm"}
|
||||
diff --git a/test/CodeGen/X86/stack-clash-no-free-probe.ll b/test/CodeGen/X86/stack-clash-no-free-probe.ll
|
||||
deleted file mode 100644
|
||||
index 652acbdf00ba..000000000000
|
||||
--- a/test/CodeGen/X86/stack-clash-no-free-probe.ll
|
||||
+++ /dev/null
|
||||
@@ -1,27 +0,0 @@
|
||||
-; RUN: llc < %s | FileCheck %s
|
||||
-
|
||||
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
-target triple = "x86_64-unknown-linux-gnu"
|
||||
-
|
||||
-define i32 @foo(i64 %i) local_unnamed_addr #0 {
|
||||
-; CHECK-LABEL: foo:
|
||||
-; CHECK: # %bb.0:
|
||||
-; CHECK-NEXT: subq $4096, %rsp # imm = 0x1000
|
||||
-; CHECK-NEXT: movq $0, (%rsp)
|
||||
-; CHECK-NEXT: subq $3784, %rsp # imm = 0xEC8
|
||||
-; CHECK-NEXT: .cfi_def_cfa_offset 7888
|
||||
-; CHECK-NEXT: movl $1, -128(%rsp,%rdi,4)
|
||||
-; CHECK-NEXT: movl -128(%rsp), %eax
|
||||
-; CHECK-NEXT: addq $7880, %rsp # imm = 0x1EC8
|
||||
-; CHECK-NEXT: .cfi_def_cfa_offset 8
|
||||
-; CHECK-NEXT: retq
|
||||
-
|
||||
- %a = alloca i32, i32 2000, align 16
|
||||
- %b = getelementptr inbounds i32, i32* %a, i64 %i
|
||||
- store volatile i32 1, i32* %b
|
||||
- %c = load volatile i32, i32* %a
|
||||
- ret i32 %c
|
||||
-}
|
||||
-
|
||||
-attributes #0 = {"probe-stack"="inline-asm"}
|
||||
-
|
||||
diff --git a/test/CodeGen/X86/stack-clash-small-alloc-medium-align.ll b/test/CodeGen/X86/stack-clash-small-alloc-medium-align.ll
|
||||
new file mode 100644
|
||||
index 000000000000..eafa86f1eba9
|
||||
--- /dev/null
|
||||
+++ b/test/CodeGen/X86/stack-clash-small-alloc-medium-align.ll
|
||||
@@ -0,0 +1,135 @@
|
||||
+; RUN: llc < %s | FileCheck %s
|
||||
+
|
||||
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
+target triple = "x86_64-unknown-linux-gnu"
|
||||
+
|
||||
+; | case1 | alloca + align < probe_size
|
||||
+define i32 @foo1(i64 %i) local_unnamed_addr #0 {
|
||||
+; CHECK-LABEL: foo1:
|
||||
+; CHECK: # %bb.0:
|
||||
+; CHECK-NEXT: pushq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_offset 16
|
||||
+; CHECK-NEXT: .cfi_offset %rbp, -16
|
||||
+; CHECK-NEXT: movq %rsp, %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_register %rbp
|
||||
+; CHECK-NEXT: andq $-64, %rsp
|
||||
+; CHECK-NEXT: subq $832, %rsp # imm = 0x340
|
||||
+; CHECK-NEXT: movl $1, (%rsp,%rdi,4)
|
||||
+; CHECK-NEXT: movl (%rsp), %eax
|
||||
+; CHECK-NEXT: movq %rbp, %rsp
|
||||
+; CHECK-NEXT: popq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa %rsp, 8
|
||||
+; CHECK-NEXT: retq
|
||||
+
|
||||
+ %a = alloca i32, i32 200, align 64
|
||||
+ %b = getelementptr inbounds i32, i32* %a, i64 %i
|
||||
+ store volatile i32 1, i32* %b
|
||||
+ %c = load volatile i32, i32* %a
|
||||
+ ret i32 %c
|
||||
+}
|
||||
+
|
||||
+; | case2 | alloca > probe_size, align > probe_size
|
||||
+define i32 @foo2(i64 %i) local_unnamed_addr #0 {
|
||||
+; CHECK-LABEL: foo2:
|
||||
+; CHECK: # %bb.0:
|
||||
+; CHECK-NEXT: pushq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_offset 16
|
||||
+; CHECK-NEXT: .cfi_offset %rbp, -16
|
||||
+; CHECK-NEXT: movq %rsp, %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_register %rbp
|
||||
+; CHECK-NEXT: andq $-2048, %rsp # imm = 0xF800
|
||||
+; CHECK-NEXT: subq $2048, %rsp # imm = 0x800
|
||||
+; CHECK-NEXT: movq $0, (%rsp)
|
||||
+; CHECK-NEXT: subq $4096, %rsp # imm = 0x1000
|
||||
+; CHECK-NEXT: movq $0, (%rsp)
|
||||
+; CHECK-NEXT: subq $2048, %rsp # imm = 0x800
|
||||
+; CHECK-NEXT: movl $1, (%rsp,%rdi,4)
|
||||
+; CHECK-NEXT: movl (%rsp), %eax
|
||||
+; CHECK-NEXT: movq %rbp, %rsp
|
||||
+; CHECK-NEXT: popq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa %rsp, 8
|
||||
+; CHECK-NEXT: retq
|
||||
+
|
||||
+ %a = alloca i32, i32 2000, align 2048
|
||||
+ %b = getelementptr inbounds i32, i32* %a, i64 %i
|
||||
+ store volatile i32 1, i32* %b
|
||||
+ %c = load volatile i32, i32* %a
|
||||
+ ret i32 %c
|
||||
+}
|
||||
+
|
||||
+; | case3 | alloca < probe_size, align < probe_size, alloca + align > probe_size
|
||||
+define i32 @foo3(i64 %i) local_unnamed_addr #0 {
|
||||
+; CHECK-LABEL: foo3:
|
||||
+; CHECK: # %bb.0:
|
||||
+; CHECK-NEXT: pushq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_offset 16
|
||||
+; CHECK-NEXT: .cfi_offset %rbp, -16
|
||||
+; CHECK-NEXT: movq %rsp, %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_register %rbp
|
||||
+; CHECK-NEXT: andq $-1024, %rsp # imm = 0xFC00
|
||||
+; CHECK-NEXT: subq $3072, %rsp # imm = 0xC00
|
||||
+; CHECK-NEXT: movq $0, (%rsp)
|
||||
+; CHECK-NEXT: subq $1024, %rsp # imm = 0x400
|
||||
+; CHECK-NEXT: movl $1, (%rsp,%rdi,4)
|
||||
+; CHECK-NEXT: movl (%rsp), %eax
|
||||
+; CHECK-NEXT: movq %rbp, %rsp
|
||||
+; CHECK-NEXT: popq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa %rsp, 8
|
||||
+; CHECK-NEXT: retq
|
||||
+
|
||||
+
|
||||
+ %a = alloca i32, i32 1000, align 1024
|
||||
+ %b = getelementptr inbounds i32, i32* %a, i64 %i
|
||||
+ store volatile i32 1, i32* %b
|
||||
+ %c = load volatile i32, i32* %a
|
||||
+ ret i32 %c
|
||||
+}
|
||||
+
|
||||
+; | case4 | alloca + probe_size < probe_size, followed by dynamic alloca
|
||||
+define i32 @foo4(i64 %i) local_unnamed_addr #0 {
|
||||
+; CHECK-LABEL: foo4:
|
||||
+; CHECK: # %bb.0:
|
||||
+; CHECK-NEXT: pushq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_offset 16
|
||||
+; CHECK-NEXT: .cfi_offset %rbp, -16
|
||||
+; CHECK-NEXT: movq %rsp, %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_register %rbp
|
||||
+; CHECK-NEXT: pushq %rbx
|
||||
+; CHECK-NEXT: andq $-64, %rsp
|
||||
+; CHECK-NEXT: subq $896, %rsp # imm = 0x380
|
||||
+; CHECK-NEXT: movq %rsp, %rbx
|
||||
+; CHECK-NEXT: .cfi_offset %rbx, -24
|
||||
+; CHECK-NEXT: movl $1, (%rbx,%rdi,4)
|
||||
+; CHECK-NEXT: movl (%rbx), %ecx
|
||||
+; CHECK-NEXT: movq %rsp, %rax
|
||||
+; CHECK-NEXT: leaq 15(,%rcx,4), %rcx
|
||||
+; CHECK-NEXT: andq $-16, %rcx
|
||||
+; CHECK-NEXT: subq %rcx, %rax
|
||||
+; CHECK-NEXT: cmpq %rsp, %rax
|
||||
+; CHECK-NEXT: jle .LBB3_3
|
||||
+; CHECK-NEXT:.LBB3_2: # =>This Inner Loop Header: Depth=1
|
||||
+; CHECK-NEXT: movq $0, (%rsp)
|
||||
+; CHECK-NEXT: subq $4096, %rsp # imm = 0x1000
|
||||
+; CHECK-NEXT: cmpq %rsp, %rax
|
||||
+; CHECK-NEXT: jg .LBB3_2
|
||||
+; CHECK-NEXT:.LBB3_3:
|
||||
+; CHECK-NEXT: andq $-64, %rax
|
||||
+; CHECK-NEXT: movq %rax, %rsp
|
||||
+; CHECK-NEXT: movl (%rax), %eax
|
||||
+; CHECK-NEXT: leaq -8(%rbp), %rsp
|
||||
+; CHECK-NEXT: popq %rbx
|
||||
+; CHECK-NEXT: popq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa %rsp, 8
|
||||
+; CHECK-NEXT: retq
|
||||
+
|
||||
+ %a = alloca i32, i32 200, align 64
|
||||
+ %b = getelementptr inbounds i32, i32* %a, i64 %i
|
||||
+ store volatile i32 1, i32* %b
|
||||
+ %c = load volatile i32, i32* %a
|
||||
+ %d = alloca i32, i32 %c, align 64
|
||||
+ %e = load volatile i32, i32* %d
|
||||
+ ret i32 %e
|
||||
+}
|
||||
+
|
||||
+attributes #0 = {"probe-stack"="inline-asm"}
|
||||
+
|
||||
diff --git a/test/CodeGen/X86/stack-clash-small-large-align.ll b/test/CodeGen/X86/stack-clash-small-large-align.ll
|
||||
new file mode 100644
|
||||
index 000000000000..e608bab90415
|
||||
--- /dev/null
|
||||
+++ b/test/CodeGen/X86/stack-clash-small-large-align.ll
|
||||
@@ -0,0 +1,83 @@
|
||||
+; RUN: llc < %s | FileCheck %s
|
||||
+
|
||||
+
|
||||
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
+target triple = "x86_64-unknown-linux-gnu"
|
||||
+
|
||||
+define i32 @foo_noprotect() local_unnamed_addr {
|
||||
+; CHECK-LABEL: foo_noprotect:
|
||||
+; CHECK: # %bb.0:
|
||||
+; CHECK-NEXT: pushq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_offset 16
|
||||
+; CHECK-NEXT: .cfi_offset %rbp, -16
|
||||
+; CHECK-NEXT: movq %rsp, %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_register %rbp
|
||||
+; CHECK-NEXT: andq $-65536, %rsp
|
||||
+; CHECK-NEXT: subq $65536, %rsp
|
||||
+; CHECK-NEXT: movl $1, 392(%rsp)
|
||||
+; CHECK-NEXT: movl (%rsp), %eax
|
||||
+; CHECK-NEXT: movq %rbp, %rsp
|
||||
+; CHECK-NEXT: popq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa %rsp, 8
|
||||
+; CHECK-NEXT: retq
|
||||
+
|
||||
+
|
||||
+
|
||||
+ %a = alloca i32, i64 100, align 65536
|
||||
+ %b = getelementptr inbounds i32, i32* %a, i64 98
|
||||
+ store volatile i32 1, i32* %b
|
||||
+ %c = load volatile i32, i32* %a
|
||||
+ ret i32 %c
|
||||
+}
|
||||
+
|
||||
+define i32 @foo_protect() local_unnamed_addr #0 {
|
||||
+; CHECK-LABEL: foo_protect:
|
||||
+; CHECK: # %bb.0:
|
||||
+; CHECK-NEXT: pushq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_offset 16
|
||||
+; CHECK-NEXT: .cfi_offset %rbp, -16
|
||||
+; CHECK-NEXT: movq %rsp, %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa_register %rbp
|
||||
+; CHECK-NEXT: movq %rsp, %r11
|
||||
+; CHECK-NEXT: andq $-65536, %r11 # imm = 0xFFFF0000
|
||||
+; CHECK-NEXT: cmpq %rsp, %r11
|
||||
+; CHECK-NEXT: je .LBB1_4
|
||||
+; CHECK-NEXT:# %bb.1:
|
||||
+; CHECK-NEXT: subq $4096, %rsp # imm = 0x1000
|
||||
+; CHECK-NEXT: cmpq %rsp, %r11
|
||||
+; CHECK-NEXT: jb .LBB1_3
|
||||
+; CHECK-NEXT:.LBB1_2: # =>This Inner Loop Header: Depth=1
|
||||
+; CHECK-NEXT: movq $0, (%rsp)
|
||||
+; CHECK-NEXT: subq $4096, %rsp # imm = 0x1000
|
||||
+; CHECK-NEXT: cmpq %rsp, %r11
|
||||
+; CHECK-NEXT: jb .LBB1_2
|
||||
+; CHECK-NEXT:.LBB1_3:
|
||||
+; CHECK-NEXT: movq %r11, %rsp
|
||||
+; CHECK-NEXT: movq $0, (%rsp)
|
||||
+; CHECK-NEXT:.LBB1_4:
|
||||
+; CHECK-NEXT: movq %rsp, %r11
|
||||
+; CHECK-NEXT: subq $65536, %r11 # imm = 0x10000
|
||||
+; CHECK-NEXT:.LBB1_5: # =>This Inner Loop Header: Depth=1
|
||||
+; CHECK-NEXT: subq $4096, %rsp # imm = 0x1000
|
||||
+; CHECK-NEXT: movq $0, (%rsp)
|
||||
+; CHECK-NEXT: cmpq %r11, %rsp
|
||||
+; CHECK-NEXT: jne .LBB1_5
|
||||
+; CHECK-NEXT:# %bb.6:
|
||||
+; CHECK-NEXT: movl $1, 392(%rsp)
|
||||
+; CHECK-NEXT: movl (%rsp), %eax
|
||||
+; CHECK-NEXT: movq %rbp, %rsp
|
||||
+; CHECK-NEXT: popq %rbp
|
||||
+; CHECK-NEXT: .cfi_def_cfa %rsp, 8
|
||||
+; CHECK-NEXT: retq
|
||||
+
|
||||
+
|
||||
+
|
||||
+
|
||||
+ %a = alloca i32, i64 100, align 65536
|
||||
+ %b = getelementptr inbounds i32, i32* %a, i64 98
|
||||
+ store volatile i32 1, i32* %b
|
||||
+ %c = load volatile i32, i32* %a
|
||||
+ ret i32 %c
|
||||
+}
|
||||
+
|
||||
+attributes #0 = {"probe-stack"="inline-asm"}
|
||||
|
||||
From bbe6cbbed8c7460a7e8477373b9250543362e771 Mon Sep 17 00:00:00 2001
|
||||
From: serge-sans-paille <sguelton@redhat.com>
|
||||
Date: Tue, 27 Oct 2020 10:59:42 +0100
|
||||
Subject: [PATCH 3/3] [stack-clash] Fix probing of dynamic alloca
|
||||
|
||||
- Perform the probing in the correct direction.
|
||||
Related to https://github.com/rust-lang/rust/pull/77885#issuecomment-711062924
|
||||
|
||||
- The first touch on a dynamic alloca cannot use a mov because it clobbers
|
||||
existing space. Use a xor 0 instead
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D90216
|
||||
|
||||
(cherry picked from commit 0f60bcc36c34522618bd1425a45f8c6006568fb6)
|
||||
---
|
||||
llvm/lib/Target/X86/X86ISelLowering.cpp | 8 ++++----
|
||||
llvm/test/CodeGen/X86/stack-clash-dynamic-alloca.ll | 12 ++++++------
|
||||
.../X86/stack-clash-small-alloc-medium-align.ll | 6 +++---
|
||||
3 files changed, 13 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
|
||||
index f68ae4461fe3..afe470cc6e0b 100644
|
||||
--- a/lib/Target/X86/X86ISelLowering.cpp
|
||||
+++ b/lib/Target/X86/X86ISelLowering.cpp
|
||||
@@ -31876,7 +31876,7 @@ X86TargetLowering::EmitLoweredProbedAlloca(MachineInstr &MI,
|
||||
|
||||
BuildMI(testMBB, DL, TII->get(X86::JCC_1))
|
||||
.addMBB(tailMBB)
|
||||
- .addImm(X86::COND_LE);
|
||||
+ .addImm(X86::COND_GE);
|
||||
testMBB->addSuccessor(blockMBB);
|
||||
testMBB->addSuccessor(tailMBB);
|
||||
|
||||
@@ -31892,9 +31892,9 @@ X86TargetLowering::EmitLoweredProbedAlloca(MachineInstr &MI,
|
||||
//
|
||||
// The property we want to enforce is to never have more than [page alloc] between two probes.
|
||||
|
||||
- const unsigned MovMIOpc =
|
||||
- TFI.Uses64BitFramePtr ? X86::MOV64mi32 : X86::MOV32mi;
|
||||
- addRegOffset(BuildMI(blockMBB, DL, TII->get(MovMIOpc)), physSPReg, false, 0)
|
||||
+ const unsigned XORMIOpc =
|
||||
+ TFI.Uses64BitFramePtr ? X86::XOR64mi8 : X86::XOR32mi8;
|
||||
+ addRegOffset(BuildMI(blockMBB, DL, TII->get(XORMIOpc)), physSPReg, false, 0)
|
||||
.addImm(0);
|
||||
|
||||
BuildMI(blockMBB, DL,
|
||||
diff --git a/test/CodeGen/X86/stack-clash-dynamic-alloca.ll b/test/CodeGen/X86/stack-clash-dynamic-alloca.ll
|
||||
index 82fd67842c8a..6dd8b6ab5897 100644
|
||||
--- a/test/CodeGen/X86/stack-clash-dynamic-alloca.ll
|
||||
+++ b/test/CodeGen/X86/stack-clash-dynamic-alloca.ll
|
||||
@@ -24,12 +24,12 @@ attributes #0 = {"probe-stack"="inline-asm"}
|
||||
; CHECK-X86-64-NEXT: andq $-16, %rcx
|
||||
; CHECK-X86-64-NEXT: subq %rcx, %rax
|
||||
; CHECK-X86-64-NEXT: cmpq %rsp, %rax
|
||||
-; CHECK-X86-64-NEXT: jle .LBB0_3
|
||||
+; CHECK-X86-64-NEXT: jge .LBB0_3
|
||||
; CHECK-X86-64-NEXT: .LBB0_2: # =>This Inner Loop Header: Depth=1
|
||||
-; CHECK-X86-64-NEXT: movq $0, (%rsp)
|
||||
+; CHECK-X86-64-NEXT: xorq $0, (%rsp)
|
||||
; CHECK-X86-64-NEXT: subq $4096, %rsp # imm = 0x1000
|
||||
; CHECK-X86-64-NEXT: cmpq %rsp, %rax
|
||||
-; CHECK-X86-64-NEXT: jg .LBB0_2
|
||||
+; CHECK-X86-64-NEXT: jl .LBB0_2
|
||||
; CHECK-X86-64-NEXT: .LBB0_3:
|
||||
; CHECK-X86-64-NEXT: movq %rax, %rsp
|
||||
; CHECK-X86-64-NEXT: movl $1, 4792(%rax)
|
||||
@@ -54,12 +54,12 @@ attributes #0 = {"probe-stack"="inline-asm"}
|
||||
; CHECK-X86-32-NEXT: andl $-16, %ecx
|
||||
; CHECK-X86-32-NEXT: subl %ecx, %eax
|
||||
; CHECK-X86-32-NEXT: cmpl %esp, %eax
|
||||
-; CHECK-X86-32-NEXT: jle .LBB0_3
|
||||
+; CHECK-X86-32-NEXT: jge .LBB0_3
|
||||
; CHECK-X86-32-NEXT: .LBB0_2: # =>This Inner Loop Header: Depth=1
|
||||
-; CHECK-X86-32-NEXT: movl $0, (%esp)
|
||||
+; CHECK-X86-32-NEXT: xorl $0, (%esp)
|
||||
; CHECK-X86-32-NEXT: subl $4096, %esp # imm = 0x1000
|
||||
; CHECK-X86-32-NEXT: cmpl %esp, %eax
|
||||
-; CHECK-X86-32-NEXT: jg .LBB0_2
|
||||
+; CHECK-X86-32-NEXT: jl .LBB0_2
|
||||
; CHECK-X86-32-NEXT: .LBB0_3:
|
||||
; CHECK-X86-32-NEXT: movl %eax, %esp
|
||||
; CHECK-X86-32-NEXT: movl $1, 4792(%eax)
|
||||
diff --git a/test/CodeGen/X86/stack-clash-small-alloc-medium-align.ll b/test/CodeGen/X86/stack-clash-small-alloc-medium-align.ll
|
||||
index eafa86f1eba9..39b6c3640a60 100644
|
||||
--- a/test/CodeGen/X86/stack-clash-small-alloc-medium-align.ll
|
||||
+++ b/test/CodeGen/X86/stack-clash-small-alloc-medium-align.ll
|
||||
@@ -106,12 +106,12 @@ define i32 @foo4(i64 %i) local_unnamed_addr #0 {
|
||||
; CHECK-NEXT: andq $-16, %rcx
|
||||
; CHECK-NEXT: subq %rcx, %rax
|
||||
; CHECK-NEXT: cmpq %rsp, %rax
|
||||
-; CHECK-NEXT: jle .LBB3_3
|
||||
+; CHECK-NEXT: jge .LBB3_3
|
||||
; CHECK-NEXT:.LBB3_2: # =>This Inner Loop Header: Depth=1
|
||||
-; CHECK-NEXT: movq $0, (%rsp)
|
||||
+; CHECK-NEXT: xorq $0, (%rsp)
|
||||
; CHECK-NEXT: subq $4096, %rsp # imm = 0x1000
|
||||
; CHECK-NEXT: cmpq %rsp, %rax
|
||||
-; CHECK-NEXT: jg .LBB3_2
|
||||
+; CHECK-NEXT: jl .LBB3_2
|
||||
; CHECK-NEXT:.LBB3_3:
|
||||
; CHECK-NEXT: andq $-64, %rax
|
||||
; CHECK-NEXT: movq %rax, %rsp
|
||||
@@ -1,28 +0,0 @@
|
||||
From 96b02808afa7eb043b9968b07424cc96bc8d94a6 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
|
||||
Date: Wed, 5 Aug 2020 10:22:32 +0200
|
||||
Subject: [PATCH] [Polly] Support linking ScopPassManager against LLVM dylib
|
||||
|
||||
Link ScopPassManager to LLVM dylib target if LLVM_LINK_LLVM_DYLIB
|
||||
is enabled. This fixes build failures on systems where static LLVM
|
||||
libraries are not installed.
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D85281
|
||||
---
|
||||
polly/unittests/ScopPassManager/CMakeLists.txt | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/polly/unittests/ScopPassManager/CMakeLists.txt b/polly/unittests/ScopPassManager/CMakeLists.txt
|
||||
index ed3bbd6dcef..88300144af3 100644
|
||||
--- a/polly/unittests/ScopPassManager/CMakeLists.txt
|
||||
+++ b/polly/unittests/ScopPassManager/CMakeLists.txt
|
||||
@@ -1,5 +1,7 @@
|
||||
-llvm_map_components_to_libnames(llvm_libs Passes Core Analysis)
|
||||
add_polly_unittest(ScopPassManagerTests
|
||||
PassManagerTest.cpp
|
||||
)
|
||||
-target_link_libraries(ScopPassManagerTests PRIVATE ${llvm_libs})
|
||||
+if (NOT LLVM_LINK_LLVM_DYLIB)
|
||||
+ llvm_map_components_to_libnames(llvm_libs Passes Core Analysis)
|
||||
+ target_link_libraries(ScopPassManagerTests PRIVATE ${llvm_libs})
|
||||
+endif()
|
||||
@@ -36,8 +36,7 @@
|
||||
<AdditionalFile owner="root" permission="0644" target="../support-linking-ScopPassManager-against-LLVM-dylib.patch">support-linking-ScopPassManager-against-LLVM-dylib.patch</AdditionalFile>
|
||||
</AdditionalFiles>-->
|
||||
<Patches>
|
||||
<!-- <Patch level="2">add-fno-semantic-interposition.patch</Patch> -->
|
||||
<!-- <Patch level="2">force-visibility-of-llvm-Any-to-external.patch</Patch> -->
|
||||
<Patch level="2">add-fno-semantic-interposition.patch</Patch>
|
||||
<Patch level="2">llvm-link-with-Bsymbolic-functions.patch</Patch>
|
||||
<Patch level="2">no-strict-aliasing-DwarfCompileUnit.patch</Patch>
|
||||
</Patches>
|
||||
|
||||
Reference in New Issue
Block a user