Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions llvm/lib/CodeGen/SafeStack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ class SafeStack {
SafeStack(Function &F, const TargetLoweringBase &TL, const DataLayout &DL,
DomTreeUpdater *DTU, ScalarEvolution &SE)
: F(F), TL(TL), DL(DL), DTU(DTU), SE(SE),
StackPtrTy(PointerType::getUnqual(F.getContext())),
StackPtrTy(DL.getAllocaPtrType(F.getContext())),
IntPtrTy(DL.getIntPtrType(F.getContext())),
Int32Ty(Type::getInt32Ty(F.getContext())) {}

Expand Down Expand Up @@ -616,7 +616,8 @@ Value *SafeStack::moveStaticAllocasToUnsafeStack(
IRBuilder<> IRBUser(InsertBefore);
Value *Off =
IRBUser.CreatePtrAdd(BasePointer, ConstantInt::get(Int32Ty, -Offset));
Value *Replacement = IRBUser.CreateBitCast(Off, AI->getType(), Name);
Value *Replacement =
IRBUser.CreateAddrSpaceCast(Off, AI->getType(), Name);

if (auto *PHI = dyn_cast<PHINode>(User))
// PHI nodes may have multiple incoming edges from the same BB (why??),
Expand Down
5 changes: 4 additions & 1 deletion llvm/lib/CodeGen/TargetLoweringBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1849,7 +1849,8 @@ TargetLoweringBase::getDefaultSafeStackPointerLocation(IRBuilderBase &IRB,
auto UnsafeStackPtr =
dyn_cast_or_null<GlobalVariable>(M->getNamedValue(UnsafeStackPtrVar));

Type *StackPtrTy = PointerType::getUnqual(M->getContext());
const DataLayout &DL = M->getDataLayout();
PointerType *StackPtrTy = DL.getAllocaPtrType(M->getContext());

if (!UnsafeStackPtr) {
auto TLSModel = UseTLS ?
Expand All @@ -1863,6 +1864,8 @@ TargetLoweringBase::getDefaultSafeStackPointerLocation(IRBuilderBase &IRB,
UnsafeStackPtrVar, nullptr, TLSModel);
} else {
// The variable exists, check its type and attributes.
//
// FIXME: Move to IR verifier.
if (UnsafeStackPtr->getValueType() != StackPtrTy)
report_fatal_error(Twine(UnsafeStackPtrVar) + " must have void* type");
if (UseTLS != UnsafeStackPtr->isThreadLocal())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: not --crash opt -passes=safe-stack -mtriple=x86_64-pc-linux-gnu -disable-output %s 2>&1 | FileCheck %s

target datalayout = "A5"

; Declaration of __safestack_unsafe_stack_ptr already exists with wrong address space
@__safestack_unsafe_stack_ptr = external thread_local(initialexec) global ptr

; CHECK: LLVM ERROR: __safestack_unsafe_stack_ptr must have void* type

define void @alloca_addrspace() nounwind uwtable safestack {
%a = alloca i8, align 8, addrspace(5)
call void @Capture_as5(ptr addrspace(5) %a)
ret void
}

declare void @Capture_as5(ptr addrspace(5))
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -passes=safe-stack -mtriple=x86_64-pc-linux-gnu < %s -o - | FileCheck %s --check-prefix=TLS

target datalayout = "A5"

; Use has wrong address space for the alloca, addrspacecast is inserted.
define void @correct_alloca_addrspace() nounwind uwtable safestack {
; TLS-LABEL: define void @correct_alloca_addrspace(
; TLS-SAME: ) #[[ATTR0:[0-9]+]] !annotation [[META0:![0-9]+]] {
; TLS-NEXT: [[ENTRY:.*:]]
; TLS-NEXT: [[UNSAFE_STACK_PTR:%.*]] = load ptr addrspace(5), ptr @__safestack_unsafe_stack_ptr, align 8
; TLS-NEXT: [[UNSAFE_STACK_STATIC_TOP:%.*]] = getelementptr i8, ptr addrspace(5) [[UNSAFE_STACK_PTR]], i32 -16
; TLS-NEXT: store ptr addrspace(5) [[UNSAFE_STACK_STATIC_TOP]], ptr @__safestack_unsafe_stack_ptr, align 8
; TLS-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr addrspace(5) [[UNSAFE_STACK_PTR]], i32 -8
; TLS-NEXT: [[A_UNSAFE:%.*]] = addrspacecast ptr addrspace(5) [[TMP0]] to ptr
; TLS-NEXT: call void @Capture(ptr [[A_UNSAFE]])
; TLS-NEXT: store ptr addrspace(5) [[UNSAFE_STACK_PTR]], ptr @__safestack_unsafe_stack_ptr, align 8
; TLS-NEXT: ret void
;
entry:
%a = alloca i8, align 8
call void @Capture(ptr %a)
ret void
}

declare void @Capture(ptr)
;.
; TLS: [[META0]] = !{!"unsafe-stack-size", i32 16}
;.
27 changes: 27 additions & 0 deletions llvm/test/Transforms/SafeStack/X86/alloca-addrspace.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -passes=safe-stack -mtriple=x86_64-pc-linux-gnu < %s -o - | FileCheck %s --check-prefix=TLS

target datalayout = "A5"

define void @correct_alloca_addrspace() nounwind uwtable safestack {
; TLS-LABEL: define void @correct_alloca_addrspace(
; TLS-SAME: ) #[[ATTR0:[0-9]+]] !annotation [[META0:![0-9]+]] {
; TLS-NEXT: [[ENTRY:.*:]]
; TLS-NEXT: [[UNSAFE_STACK_PTR:%.*]] = load ptr addrspace(5), ptr @__safestack_unsafe_stack_ptr, align 8
; TLS-NEXT: [[UNSAFE_STACK_STATIC_TOP:%.*]] = getelementptr i8, ptr addrspace(5) [[UNSAFE_STACK_PTR]], i32 -16
; TLS-NEXT: store ptr addrspace(5) [[UNSAFE_STACK_STATIC_TOP]], ptr @__safestack_unsafe_stack_ptr, align 8
; TLS-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr addrspace(5) [[UNSAFE_STACK_PTR]], i32 -8
; TLS-NEXT: call void @Capture_as5(ptr addrspace(5) [[TMP0]])
; TLS-NEXT: store ptr addrspace(5) [[UNSAFE_STACK_PTR]], ptr @__safestack_unsafe_stack_ptr, align 8
; TLS-NEXT: ret void
;
entry:
%a = alloca i8, align 8, addrspace(5)
call void @Capture_as5(ptr addrspace(5) %a)
ret void
}

declare void @Capture_as5(ptr addrspace(5))
;.
; TLS: [[META0]] = !{!"unsafe-stack-size", i32 16}
;.
Loading