diff options
Diffstat (limited to 'docs/LangRef.rst')
-rw-r--r-- | docs/LangRef.rst | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/docs/LangRef.rst b/docs/LangRef.rst index 650012e7f9..d76fc0d3af 100644 --- a/docs/LangRef.rst +++ b/docs/LangRef.rst @@ -679,11 +679,15 @@ Syntax:: Aliases ------- -Aliases act as "second name" for the aliasee value (which can be either -function, global variable, another alias or bitcast of global value). +Aliases, unlike function or variables, don't create any new data. They +are just a new symbol and metadata for an existing position. + +Aliases have a name and an aliasee that is either a global value or a +constant expression. + Aliases may have an optional :ref:`linkage type <linkage>`, an optional -:ref:`visibility style <visibility>`, and an optional :ref:`DLL storage class -<dllstorageclass>`. +:ref:`visibility style <visibility>`, an optional :ref:`DLL storage class +<dllstorageclass>` and an optional :ref:`tls model <tls_model>`. Syntax:: @@ -691,17 +695,23 @@ Syntax:: The linkage must be one of ``private``, ``internal``, ``linkonce``, ``weak``, ``linkonce_odr``, ``weak_odr``, ``external``. Note that some system linkers -might not correctly handle dropping a weak symbol that is aliased by a non-weak -alias. +might not correctly handle dropping a weak symbol that is aliased. Alias that are not ``unnamed_addr`` are guaranteed to have the same address as the aliasee. -The aliasee must be a definition. +Since aliases are only a second name, some restrictions apply, of which +some can only be checked when producing an object file: + +* The expression defining the aliasee must be computable at assembly + time. Since it is just a name, no relocations can be used. + +* No alias in the expression can be weak as the possibility of the + intermediate alias being overridden cannot be represented in an + object file. -Aliases are not allowed to point to aliases with linkages that can be -overridden. Since they are only a second name, the possibility of the -intermediate alias being overridden cannot be represented in an object file. +* No global value in the expression can be a declaration, since that + would require a relocation, which is not possible. .. _namedmetadatastructure: |