[llvm] 7113010 - [LangRef] Add a description of the semantics of call signatures. (#136189)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 18 09:24:58 PDT 2025
Author: Eli Friedman
Date: 2025-04-18T09:24:54-07:00
New Revision: 711301066c2e5a6842866baea50ea9346b837459
URL: https://github.com/llvm/llvm-project/commit/711301066c2e5a6842866baea50ea9346b837459
DIFF: https://github.com/llvm/llvm-project/commit/711301066c2e5a6842866baea50ea9346b837459.diff
LOG: [LangRef] Add a description of the semantics of call signatures. (#136189)
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.
Added:
Modified:
llvm/docs/LangRef.rst
Removed:
################################################################################
diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst
index 110c30e19220f..a5df82895d839 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.
+ 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 significant 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:
""""""""
More information about the llvm-commits
mailing list