[llvm] [LangRef] Try to clarify some Metadata semantics (PR #81948)
Diana Picus via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 19 00:56:56 PST 2024
================
@@ -5574,34 +5574,106 @@ occurs on.
Metadata
========
-LLVM IR allows metadata to be attached to instructions and global objects in the
-program that can convey extra information about the code to the optimizers and
-code generator. One example application of metadata is source-level
-debug information. There are two metadata primitives: strings and nodes.
+LLVM IR allows metadata to be attached to instructions and global objects in
+the program that can convey extra information about the code to the optimizers
+and code generator.
-Metadata does not have a type, and is not a value. If referenced from a
-``call`` instruction, it uses the ``metadata`` type.
+There are two metadata primitives: strings and nodes. There are
+also specialized nodes which have a distinguished name and a set of named
+arguments.
+
+.. note::
+
+ One example application of metadata is source-level debug information,
+ which is currently the only user of specialized nodes.
+
+Metadata does not have a type, and is not a value.
+
+A value of non-\ ``metadata`` type can be used in a metadata context using the
+syntax '``<type> <value>``'.
+
+All other metadata is identified in syntax as starting with an exclamation
+point ('``!``').
+
+Metadata may be used in the following value contexts by using the ``metadata``
+type:
+
+- Arguments to certain intrinsic functions, as described in their specification.
+- Arguments to the ``catchpad``/``cleanuppad`` instructions.
+
+.. note::
+
+ Metadata can be "wrapped" in a ``MetadataAsValue`` so it can be referenced
+ in a value context: ``MetadataAsValue`` is-a ``Value``.
+
+ A typed value can be "wrapped" in ``ValueAsMetadata`` so it can be
+ referenced in a metadata context: ``ValueAsMetadata`` is-a ``Metadata``.
+
+ There is no explicit syntax for a ``ValueAsMetadata``, and instead
+ the fact that a type identifier cannot begin with an exclamation point
+ is used to resolve ambiguity.
+
+ A ``metadata`` type implies a ``MetadataAsValue``, and when followed with a
+ '``<type> <value>``' pair it wraps the typed value in a ``ValueAsMetadata``.
-All metadata are identified in syntax by an exclamation point ('``!``').
+ For example, the first argument
+ to this call is a ``MetadataAsValue(ValueAsMetadata(Value))``:
+
+ .. code-block:: llvm
+
+ call void @llvm.foo(metadata i32 1)
+
+ Whereas the first argument to this call is a ``MetadataAsValue(MDNode)``:
+
+ .. code-block:: llvm
+
+ call void @llvm.foo(metadata !0)
+
+ The first element of this ``MDTuple`` is a ``MDNode``:
+
+ .. code-block:: llvm
+
+ !{!0}
+
+ And the first element of this ``MDTuple`` is a ``ValueAsMetadata(Value)``:
+
+ .. code-block:: llvm
+
+ !{i32 1}
.. _metadata-string:
-Metadata Nodes and Metadata Strings
------------------------------------
+Metadata Strings (``MDString``)
+-------------------------------
+
+.. FIXME Either fix all references to "MDString" in the docs, or make that
+ identifier a formal part of the document.
A metadata string is a string surrounded by double quotes. It can
contain any character by escaping non-printable characters with
"``\xx``" where "``xx``" is the two digit hex code. For example:
"``!"test\00"``".
-Metadata nodes are represented with notation similar to structure
-constants (a comma separated list of elements, surrounded by braces and
-preceded by an exclamation point). Metadata nodes can have any values as
+.. note::
+
+ A metadata string is metadata, but is not a meatdata node.
----------------
rovka wrote:
Typo: meatdata
https://github.com/llvm/llvm-project/pull/81948
More information about the llvm-commits
mailing list