diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -6824,17 +6824,27 @@ '``associated``' Metadata ^^^^^^^^^^^^^^^^^^^^^^^^^ -The ``associated`` metadata may be attached to a global object -declaration with a single argument that references another global object. +The ``associated`` metadata may be attached to a global variable +declaration with a single argument that references a global object +(optionally through an alias). -This metadata prevents discarding of the global object in linker GC +This metadata prevents discarding of the global variable in linker GC unless the referenced object is also discarded. The linker support for this feature is spotty. For best compatibility, globals carrying this -metadata may also: +metadata should: -- Be in a comdat with the referenced global. -- Be in @llvm.compiler.used. -- Have an explicit section with a name which is a valid C identifier. +- Be in ``@llvm.compiler.used``. +- If the referenced global variable is in a comdat, be in the same comdat. + +If the metadata references a function, the function should not reference +the metadata: the function may be inlined into other functions, leading +to more references to the metadata. If the metadata is retained while +the function is discarded, this will trigger a linker error. + +The metadata is often used with an explicit section consisting of valid +C identifiers so that the runtime can find the metadata section with +linker-defined encapsulation symbols ``__start_`` and +``__stop_``. It does not have any effect on non-ELF targets.