[llvm-dev] what are the rules about ssp function attributes?

Andrew Kelley via llvm-dev llvm-dev at lists.llvm.org
Wed Dec 16 13:43:07 PST 2020


Hello,

Zig is now tripping a new LLVM assert in recent main branch commits of LLVM:

Assertion failed: (!(!Caller.hasStackProtectorFnAttr() && 
Callee.hasStackProtectorFnAttr()) && "stack protected callee but caller 
requested no stack protector"), function adjustCallerSSPLevel, file 
/Users/kubkon/dev/llvm-project/llvm/lib/IR/Attributes.cpp, line 1951.

Caller is

; Function Attrs: nobuiltin nounwind
define internal fastcc void @std.math.big.int.llshl(%"[]usize"* nonnull 
readonly align 8 %0, %"[]usize"* nonnull readonly align 8 %1, i64 %2) 
unnamed_addr #2 !dbg !445894 {

Callee is

; Function Attrs: nobuiltin nounwind sspstrong
define internal fastcc i64 @std.math.shr.11603(i64 %0, i64 %1) 
unnamed_addr #1 !dbg !445958 {

So that's indeed a sspstrong function calling a non-sspstrong function. 
Why is that not allowed? The LLVM language reference makes it sound like 
you can have some functions protected and some functions not protected:

 > sspstrong
 >
 > This attribute indicates that the function should emit a stack 
smashing protector.
 > ...
 > If a function that has an sspstrong attribute is inlined into a
 > function that doesn’t have an sspstrong attribute, then the resulting
 > function will have an sspstrong attribute.

Can anyone shed some light on this?

Thanks in advance!
Andrew

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20201216/c697c214/attachment.sig>


More information about the llvm-dev mailing list