mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-28 22:24:28 +00:00
[stackprotector] Added intrinsic llvm.stackprotectorcheck.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188191 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -8641,14 +8641,52 @@ enough space to hold the value of the guard.
|
|||||||
Semantics:
|
Semantics:
|
||||||
""""""""""
|
""""""""""
|
||||||
|
|
||||||
This intrinsic causes the prologue/epilogue inserter to force the
|
This intrinsic causes the prologue/epilogue inserter to force the position of
|
||||||
position of the ``AllocaInst`` stack slot to be before local variables
|
the ``AllocaInst`` stack slot to be before local variables on the stack. This is
|
||||||
on the stack. This is to ensure that if a local variable on the stack is
|
to ensure that if a local variable on the stack is overwritten, it will destroy
|
||||||
overwritten, it will destroy the value of the guard. When the function
|
the value of the guard. When the function exits, the guard on the stack is
|
||||||
exits, the guard on the stack is checked against the original guard. If
|
checked against the original guard by ``llvm.stackprotectorcheck``. If they are
|
||||||
they are different, then the program aborts by calling the
|
different, then ``llvm.stackprotectorcheck`` causes the program to abort by
|
||||||
|
calling the ``__stack_chk_fail()`` function.
|
||||||
|
|
||||||
|
'``llvm.stackprotectorcheck``' Intrinsic
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Syntax:
|
||||||
|
"""""""
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
declare void @llvm.stackprotectorcheck(i8** <guard>)
|
||||||
|
|
||||||
|
Overview:
|
||||||
|
"""""""""
|
||||||
|
|
||||||
|
The ``llvm.stackprotectorcheck`` intrinsic compares ``guard`` against an already
|
||||||
|
created stack protector and if they do not equal calls the
|
||||||
``__stack_chk_fail()`` function.
|
``__stack_chk_fail()`` function.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
""""""""""
|
||||||
|
|
||||||
|
The ``llvm.stackprotectorcheck`` intrinsic requires one pointer argument, the
|
||||||
|
the variable ``@__stack_chk_guard``.
|
||||||
|
|
||||||
|
Semantics:
|
||||||
|
""""""""""
|
||||||
|
|
||||||
|
This intrinsic is provided to perform the stack protector check by comparing
|
||||||
|
``guard`` with the stack slot created by ``llvm.stackprotector`` and if the
|
||||||
|
values do not match call the ``__stack_chk_fail()`` function.
|
||||||
|
|
||||||
|
The reason to provide this as an IR level intrinsic instead of implementing it
|
||||||
|
via other IR operations is that in order to perform this operation at the IR
|
||||||
|
level without an intrinsic, one would need to create additional basic blocks to
|
||||||
|
handle the success/failure cases. This makes it difficult to stop the stack
|
||||||
|
protector check from disrupting sibling tail calls in Codegen. With this
|
||||||
|
intrinsic, we are able to generate the stack protector basic blocks late in
|
||||||
|
codegen after the tail call decision has occured.
|
||||||
|
|
||||||
'``llvm.objectsize``' Intrinsic
|
'``llvm.objectsize``' Intrinsic
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
@ -258,6 +258,8 @@ def int_readcyclecounter : Intrinsic<[llvm_i64_ty]>;
|
|||||||
// Stack Protector Intrinsic - The stackprotector intrinsic writes the stack
|
// Stack Protector Intrinsic - The stackprotector intrinsic writes the stack
|
||||||
// guard to the correct place on the stack frame.
|
// guard to the correct place on the stack frame.
|
||||||
def int_stackprotector : Intrinsic<[], [llvm_ptr_ty, llvm_ptrptr_ty], []>;
|
def int_stackprotector : Intrinsic<[], [llvm_ptr_ty, llvm_ptrptr_ty], []>;
|
||||||
|
def int_stackprotectorcheck : Intrinsic<[], [llvm_ptrptr_ty],
|
||||||
|
[IntrReadWriteArgMem]>;
|
||||||
|
|
||||||
//===------------------- Standard C Library Intrinsics --------------------===//
|
//===------------------- Standard C Library Intrinsics --------------------===//
|
||||||
//
|
//
|
||||||
|
Reference in New Issue
Block a user