Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion llvm/docs/LangRef.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we mention that noundef should match between call-site and function declarations/definitions when Memory Sanitizer is enabled?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added a note about this.


If an integer argument to a function is not marked signext/zeroext/noext, the
kind of extension used is target-specific. Some targets depend for
correctness on the kind of extension to be explicitly specified.
Expand Down Expand Up @@ -1500,6 +1518,9 @@ Currently, only the following parameter attributes are defined:
undefined. Note that this does not refer to padding introduced by the
type's storage representation.

If memory sanitizer is enabled, ``noundef`` becomes an ABI attribute and
must match between the call-site and the function definition.

.. _nofpclass:

``nofpclass(<test mask>)``
Expand Down
Loading