forked from OSchip/llvm-project
[LangRef] Clarify !associated
Notably, a global variable with the metadata should generally not be referenced by a function function. E.g. -fstack-size-section usage is fine, but -fsanitize-coverage= used to have a linker GC problem (fixed by D97430). Reviewed By: eugenis Differential Revision: https://reviews.llvm.org/D104933
This commit is contained in:
parent
8cf60e61e7
commit
c34b0ab589
|
@ -6838,17 +6838,29 @@ See :doc:`TypeMetadata`.
|
||||||
'``associated``' Metadata
|
'``associated``' Metadata
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
The ``associated`` metadata may be attached to a global object
|
The ``associated`` metadata may be attached to a global variable definition with
|
||||||
declaration with a single argument that references another global object.
|
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 lowers to the ELF section flag ``SHF_LINK_INFO`` which prevents
|
||||||
unless the referenced object is also discarded. The linker support for
|
discarding of the global variable in linker GC unless the referenced object is
|
||||||
this feature is spotty. For best compatibility, globals carrying this
|
also discarded. The linker support for this feature is spotty. For best
|
||||||
metadata may also:
|
compatibility, globals carrying this metadata should:
|
||||||
|
|
||||||
- Be in a comdat with the referenced global.
|
- Be in ``@llvm.compiler.used``.
|
||||||
- Be in @llvm.compiler.used.
|
- If the referenced global variable is in a comdat, be in the same comdat.
|
||||||
- Have an explicit section with a name which is a valid C identifier.
|
|
||||||
|
``!associated`` can not express many-to-one relationship. A global variable with
|
||||||
|
the metadata should generally not be referenced by a function: the function may
|
||||||
|
be inlined into other functions, leading to more references to the metadata.
|
||||||
|
Ideally we would want to keep metadata alive as long as any inline location is
|
||||||
|
alive, but this many-to-one relationship is not representable. Moreover, if the
|
||||||
|
metadata is retained while the function is discarded, the linker will report an
|
||||||
|
error of a relocation referencing a discarded section.
|
||||||
|
|
||||||
|
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_<section_name>`` and
|
||||||
|
``__stop_<section_name>``.
|
||||||
|
|
||||||
It does not have any effect on non-ELF targets.
|
It does not have any effect on non-ELF targets.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue