[llvm] [LangRef] Add some documentation for ABI / call-site attributes (PR #121930)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 8 00:47:02 PST 2025
================
@@ -1160,22 +1160,40 @@ The return type and each parameter of a function type may have a set of
used to communicate additional information about the result or
parameters of a function. Parameter attributes are considered to be part
of the function, not of the function type, so functions with different
-parameter attributes can have the same function type.
+parameter attributes can have the same function type. Parameter attributes can
+be placed both on function declarations/definitions, and at call-sites.
Parameter attributes are either simple keywords or strings that follow the
specified type. Multiple parameter attributes, when required, are separated by
spaces. For example:
.. code-block:: llvm
+ ; On function declarations/definitions:
declare i32 @printf(ptr noalias nocapture, ...)
declare i32 @atoi(i8 zeroext)
declare signext i8 @returns_signed_char()
define void @baz(i32 "amdgpu-flat-work-group-size"="1,256" %x)
+ ; On call-sites:
+ call i32 @atoi(i8 zeroext %x)
+ call signext i8 @returns_signed_char()
+
Note that any attributes for the function result (``nonnull``,
``signext``) come before the result type.
+Parameter attributes can be broadly separated into two kinds: ABI attributes
+that affect how values are passed to/from functions, like ``zeroext``,
+``inreg``, ``byval``, or ``sret``. And optimization attributes, which provide
+additional optimization guarantees, like ``noalias``, ``nonnull`` and
+``dereferenceable``.
+
+ABI attributes must be specified *both* at the function declaration/definition
+and call-site, otherwise the behavior may be undefined. ABI attributes cannot
+be safely dropped. Optimization attributes do not have to match between
+call-site and function: The intersection of their implied semantics applies.
+Optimization attributes can also be freely dropped.
----------------
nikic wrote:
I added a note about this.
https://github.com/llvm/llvm-project/pull/121930
More information about the llvm-commits
mailing list