mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[FaultMaps][Docs] Document the ImplicitNullChecks pass.
llvm-svn: 241009
This commit is contained in:
parent
62aaec0b27
commit
7226bf4ba4
@ -52,3 +52,45 @@ The format of this section is
|
||||
uint32 : HandlerPCOffset
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
The ``ImplicitNullChecks`` pass
|
||||
===============================
|
||||
|
||||
The ``ImplicitNullChecks`` pass transforms explicit control flow for
|
||||
checking if a pointer is ``null``, like:
|
||||
|
||||
.. code-block:: llvm
|
||||
|
||||
%ptr = call i32* @get_ptr()
|
||||
%ptr_is_null = icmp i32* %ptr, null
|
||||
br i1 %ptr_is_null, label %is_null, label %not_null
|
||||
|
||||
not_null:
|
||||
%t = load i32, i32* %ptr
|
||||
br label %do_something_with_t
|
||||
|
||||
is_null:
|
||||
call void @HFC()
|
||||
unreachable
|
||||
|
||||
to control flow implicit in the instruction loading or storing through
|
||||
the pointer being null checked:
|
||||
|
||||
.. code-block:: llvm
|
||||
|
||||
%ptr = call i32* @get_ptr()
|
||||
%t = load i32, i32* %ptr ;; handler-pc = label %is_null
|
||||
br label %do_something_with_t
|
||||
|
||||
is_null:
|
||||
call void @HFC()
|
||||
unreachable
|
||||
|
||||
This transform happens at the ``MachineInstr`` level, not the LLVM IR
|
||||
level (so the above example is only representative, not literal). The
|
||||
``ImplicitNullChecks`` pass runs during codegen, if
|
||||
``-enable-implicit-null-checks`` is passed to ``llc``.
|
||||
|
||||
The ``ImplicitNullChecks`` pass adds entries to the
|
||||
``__llvm_faultmaps`` section described above as needed.
|
||||
|
Loading…
Reference in New Issue
Block a user