mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +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:
parent
67d135ae40
commit
2a64a639e5
@ -8641,14 +8641,52 @@ enough space to hold the value of the guard.
|
||||
Semantics:
|
||||
""""""""""
|
||||
|
||||
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 are different, then the program aborts by calling the
|
||||
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 by ``llvm.stackprotectorcheck``. If they are
|
||||
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.
|
||||
|
||||
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
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
@ -258,6 +258,8 @@ def int_readcyclecounter : Intrinsic<[llvm_i64_ty]>;
|
||||
// Stack Protector Intrinsic - The stackprotector intrinsic writes the stack
|
||||
// guard to the correct place on the stack frame.
|
||||
def int_stackprotector : Intrinsic<[], [llvm_ptr_ty, llvm_ptrptr_ty], []>;
|
||||
def int_stackprotectorcheck : Intrinsic<[], [llvm_ptrptr_ty],
|
||||
[IntrReadWriteArgMem]>;
|
||||
|
||||
//===------------------- Standard C Library Intrinsics --------------------===//
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user