Skip to content

[LangRef] Try to formalize the definition of "odr" in LLVM IR. #92619

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 20, 2024
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
18 changes: 11 additions & 7 deletions llvm/docs/LangRef.rst
Original file line number Diff line number Diff line change
Expand Up @@ -290,13 +290,17 @@ linkage:
symbol is weak until linked, if not linked, the symbol becomes null
instead of being an undefined reference.
``linkonce_odr``, ``weak_odr``
Some languages allow differing globals to be merged, such as two
functions with different semantics. Other languages, such as
``C++``, ensure that only equivalent globals are ever merged (the
"one definition rule" --- "ODR"). Such languages can use the
``linkonce_odr`` and ``weak_odr`` linkage types to indicate that the
global will only be merged with equivalent globals. These linkage
types are otherwise the same as their non-``odr`` versions.
The ``odr`` suffix indicates that all globals defined with the given name
are equivalent, along the lines of the C++ "one definition rule" ("ODR").
Informally, this means we can inline functions and fold loads of constants.

Formally, use the following definition: when an ``odr`` function is
called, one of the definitions is non-deterministically chosen to run. For
``odr`` variables, if any byte in the value is not equal in all
initializers, that byte is a :ref:`poison value <poisonvalues>`. For
aliases and ifuncs, apply the rule for the underlying function or variable.

These linkage types are otherwise the same as their non-``odr`` versions.
``external``
If none of the above identifiers are used, the global is externally
visible, meaning that it participates in linkage and can be used to
Expand Down
Loading