From 3c44f5bec91dd4e8b7e1c011ec0a5f77c93c2f28 Mon Sep 17 00:00:00 2001
From: Bill Wendling
+ This intrinsic is used when stack protectors are required. LLVM generates a + call to load the randomized stack protector guard's value. The intrinsic is + used so that LLVM can ensure that the stack guard is placed onto the stack in + the appropriate place—before local variables are allocated on the stack. +
++declare void @llvm.stackprotector( i8* <guard>, i8** <slot> ) + ++
+ The llvm.stackprotector intrinsic takes the guard and stores + it onto the stack at slot. The stack slot is adjusted to ensure that + it's before local variables are allocated on the stack. +
++ The llvm.stackprotector intrinsic requires two pointer arguments. The + first argument is the value loaded from the stack guard + @__stack_chk_guard. The second variable is an alloca that + has enough space to hold the value of the guard. +
++ This intrinsic causes the prologue/epilogue inserter to force the position of + the AllocaInst stack slot to be before local variables on the + stack. This is to ensure that if a local variable on the stack is overwritten, + it will destroy the value of the guard. When the function exits, the guard on + the stack is checked against the original guard. If they're different, then + the program aborts by calling the __stack_chk_fail() function. +
+