[llvm] [LangRef] Add a description of the semantics of call signatures. (PR #136189)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 17 13:07:23 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-ir
Author: Eli Friedman (efriedma-quic)
<details>
<summary>Changes</summary>
This doesn't introduce anything new; it's just a reflection of the semantics we've already had for many years.
Per discussion on #<!-- -->63484.
---
Full diff: https://github.com/llvm/llvm-project/pull/136189.diff
1 Files Affected:
- (modified) llvm/docs/LangRef.rst (+20-7)
``````````diff
diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst
index 110c30e19220f..8f5e035c1d736 100644
--- a/llvm/docs/LangRef.rst
+++ b/llvm/docs/LangRef.rst
@@ -9475,10 +9475,11 @@ This instruction requires several arguments:
from the :ref:`datalayout string<langref_datalayout>` will be used.
#. '``ty``': the type of the call instruction itself which is also the
type of the return value. Functions that return no value are marked
- ``void``.
+ ``void``. The signature is computed based on the return type and argument
+ types.
#. '``fnty``': shall be the signature of the function being invoked. The
- argument types must match the types implied by this signature. This
- type can be omitted if the function is not varargs.
+ argument types must match the types implied by this signature. Thisa
+ is only required if the signature specifies a varargs type.
#. '``fnptrval``': An LLVM value containing a pointer to a function to
be invoked. In most cases, this is a direct function invocation, but
indirect ``invoke``'s are just as possible, calling an arbitrary pointer
@@ -9571,10 +9572,11 @@ This instruction requires several arguments:
from the :ref:`datalayout string<langref_datalayout>` will be used.
#. '``ty``': the type of the call instruction itself which is also the
type of the return value. Functions that return no value are marked
- ``void``.
+ ``void``. The signature is computed based on the return type and argument
+ types.
#. '``fnty``': shall be the signature of the function being called. The
argument types must match the types implied by this signature. This
- type can be omitted if the function is not varargs.
+ is only required if the signature specifies a varargs type.
#. '``fnptrval``': An LLVM value containing a pointer to a function to
be called. In most cases, this is a direct function call, but
other ``callbr``'s are just as possible, calling an arbitrary pointer
@@ -13127,10 +13129,11 @@ This instruction requires several arguments:
from the :ref:`datalayout string<langref_datalayout>` will be used.
#. '``ty``': the type of the call instruction itself which is also the
type of the return value. Functions that return no value are marked
- ``void``.
+ ``void``. The signature is computed based on the return type and argument
+ types.
#. '``fnty``': shall be the signature of the function being called. The
argument types must match the types implied by this signature. This
- type can be omitted if the function is not varargs.
+ is only required if the signature specifies a varargs type.
#. '``fnptrval``': An LLVM value containing a pointer to a function to
be called. In most cases, this is a direct function call, but
indirect ``call``'s are just as possible, calling an arbitrary pointer
@@ -13152,6 +13155,16 @@ values. Upon a '``ret``' instruction in the called function, control
flow continues with the instruction after the function call, and the
return value of the function is bound to the result argument.
+If the callee refers to an intrinsic function, the signature of the call must
+match the signature of the callee. Otherwise, if the signature of the call
+does not match the signature of the called function, the behavior is
+target-specific. For a signficant mismatch, this likely results in undefined
+behavior. LLVM interprocedural optimizations generally only optimize calls
+where the signature of the caller matches the signature of the callee.
+
+Note that it is possible for the signatures to mismatch even if a call appears
+to be a "direct" call, like ``call void @f()``.
+
Example:
""""""""
``````````
</details>
https://github.com/llvm/llvm-project/pull/136189
More information about the llvm-commits
mailing list