Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -2053,7 +2053,12 @@ if (Subtarget.getTargetTriple().isOSContiki()) return getDefaultSafeStackPointerLocation(IRB, false); - if (!Subtarget.isTargetAndroid()) + bool MuslSeparateStack = + Subtarget.getTargetTriple().isMusl() && + Subtarget.isTargetLinux() && + Subtarget.useSeparateStackSeg(); + + if (!(MuslSeparateStack || Subtarget.isTargetAndroid())) return TargetLowering::getSafeStackPointerLocation(IRB); // Android provides a fixed TLS slot for the SafeStack pointer. See the Index: test/Transforms/SafeStack/X86/addr-taken.ll =================================================================== --- test/Transforms/SafeStack/X86/addr-taken.ll +++ test/Transforms/SafeStack/X86/addr-taken.ll @@ -1,5 +1,6 @@ ; RUN: opt -safe-stack -S -mtriple=i386-pc-linux-gnu < %s -o - | FileCheck %s ; RUN: opt -safe-stack -S -mtriple=x86_64-pc-linux-gnu < %s -o - | FileCheck %s +; RUN: opt -safe-stack -S -mtriple=i386-pc-linux-musl -mattr=+separate-stack-seg < %s -o - | FileCheck --check-prefix TCB %s @.str = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1 @@ -9,6 +10,9 @@ define void @foo() nounwind uwtable safestack { entry: ; CHECK: __safestack_unsafe_stack_ptr + ; TCB: %unsafe_stack_ptr = load i8*, i8* addrspace(256)* inttoptr (i32 36 to i8* addrspace(256)*) + ; TCB-NEXT: %unsafe_stack_static_top = getelementptr i8, i8* %unsafe_stack_ptr, i32 -16 + ; TCB-NEXT: store i8* %unsafe_stack_static_top, i8* addrspace(256)* inttoptr (i32 36 to i8* addrspace(256)*) %retval = alloca i32, align 4 %a = alloca i32, align 4 %j = alloca i32*, align 8 @@ -17,6 +21,7 @@ %add = add nsw i32 %0, 1 store i32 %add, i32* %a, align 4 store i32* %a, i32** %j, align 8 + ; TCB: store i8* %unsafe_stack_ptr, i8* addrspace(256)* inttoptr (i32 36 to i8* addrspace(256)*) ret void }