2013-04-10 23:28:17 +00:00
|
|
|
===============
|
|
|
|
LLVM Extensions
|
|
|
|
===============
|
|
|
|
|
|
|
|
.. contents::
|
|
|
|
:local:
|
|
|
|
|
|
|
|
.. toctree::
|
|
|
|
:hidden:
|
|
|
|
|
|
|
|
Introduction
|
|
|
|
============
|
|
|
|
|
|
|
|
This document describes extensions to tools and formats LLVM seeks compatibility
|
|
|
|
with.
|
|
|
|
|
2013-08-14 15:27:20 +00:00
|
|
|
General Assembly Syntax
|
|
|
|
===========================
|
|
|
|
|
|
|
|
C99-style Hexadecimal Floating-point Constants
|
|
|
|
----------------------------------------------
|
|
|
|
|
|
|
|
LLVM's assemblers allow floating-point constants to be written in C99's
|
|
|
|
hexadecimal format instead of decimal if desired.
|
|
|
|
|
|
|
|
.. code-block:: gas
|
2013-08-14 16:18:47 +00:00
|
|
|
|
2013-08-14 15:27:20 +00:00
|
|
|
.section .data
|
|
|
|
.float 0x1c2.2ap3
|
|
|
|
|
2013-04-10 23:28:17 +00:00
|
|
|
Machine-specific Assembly Syntax
|
|
|
|
================================
|
|
|
|
|
|
|
|
X86/COFF-Dependent
|
|
|
|
------------------
|
|
|
|
|
2013-07-06 12:13:10 +00:00
|
|
|
Relocations
|
|
|
|
^^^^^^^^^^^
|
|
|
|
|
2013-12-20 18:15:00 +00:00
|
|
|
The following additional relocation types are supported:
|
2013-04-10 23:28:17 +00:00
|
|
|
|
|
|
|
**@IMGREL** (AT&T syntax only) generates an image-relative relocation that
|
|
|
|
corresponds to the COFF relocation types ``IMAGE_REL_I386_DIR32NB`` (32-bit) or
|
|
|
|
``IMAGE_REL_AMD64_ADDR32NB`` (64-bit).
|
|
|
|
|
|
|
|
.. code-block:: gas
|
|
|
|
|
|
|
|
.text
|
|
|
|
fun:
|
|
|
|
mov foo@IMGREL(%ebx, %ecx, 4), %eax
|
|
|
|
|
|
|
|
.section .pdata
|
|
|
|
.long fun@IMGREL
|
|
|
|
.long (fun@imgrel + 0x3F)
|
|
|
|
.long $unwind$fun@imgrel
|
2013-07-06 12:13:10 +00:00
|
|
|
|
2013-12-20 18:15:00 +00:00
|
|
|
**.secrel32** generates a relocation that corresponds to the COFF relocation
|
|
|
|
types ``IMAGE_REL_I386_SECREL`` (32-bit) or ``IMAGE_REL_AMD64_SECREL`` (64-bit).
|
|
|
|
|
|
|
|
**.secidx** relocation generates an index of the section that contains
|
|
|
|
the target. It corresponds to the COFF relocation types
|
|
|
|
``IMAGE_REL_I386_SECTION`` (32-bit) or ``IMAGE_REL_AMD64_SECTION`` (64-bit).
|
|
|
|
|
|
|
|
.. code-block:: gas
|
|
|
|
|
|
|
|
.section .debug$S,"rn"
|
|
|
|
.long 4
|
|
|
|
.long 242
|
|
|
|
.long 40
|
|
|
|
.secrel32 _function_name
|
|
|
|
.secidx _function_name
|
|
|
|
...
|
2013-07-06 12:13:10 +00:00
|
|
|
|
|
|
|
``.linkonce`` Directive
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
Syntax:
|
|
|
|
|
2014-06-06 19:26:12 +00:00
|
|
|
``.linkonce [ comdat type ]``
|
2013-07-06 12:13:10 +00:00
|
|
|
|
|
|
|
Supported COMDAT types:
|
|
|
|
|
|
|
|
``discard``
|
|
|
|
Discards duplicate sections with the same COMDAT symbol. This is the default
|
|
|
|
if no type is specified.
|
|
|
|
|
|
|
|
``one_only``
|
|
|
|
If the symbol is defined multiple times, the linker issues an error.
|
|
|
|
|
|
|
|
``same_size``
|
|
|
|
Duplicates are discarded, but the linker issues an error if any have
|
|
|
|
different sizes.
|
|
|
|
|
|
|
|
``same_contents``
|
|
|
|
Duplicates are discarded, but the linker issues an error if any duplicates
|
|
|
|
do not have exactly the same content.
|
|
|
|
|
|
|
|
``largest``
|
|
|
|
Links the largest section from among the duplicates.
|
|
|
|
|
|
|
|
``newest``
|
|
|
|
Links the newest section from among the duplicates.
|
|
|
|
|
|
|
|
|
|
|
|
.. code-block:: gas
|
|
|
|
|
|
|
|
.section .text$foo
|
|
|
|
.linkonce
|
|
|
|
...
|
|
|
|
|
2013-11-19 19:52:52 +00:00
|
|
|
``.section`` Directive
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
MC supports passing the information in ``.linkonce`` at the end of
|
|
|
|
``.section``. For example, these two codes are equivalent
|
|
|
|
|
|
|
|
.. code-block:: gas
|
|
|
|
|
|
|
|
.section secName, "dr", discard, "Symbol1"
|
|
|
|
.globl Symbol1
|
|
|
|
Symbol1:
|
|
|
|
.long 1
|
|
|
|
|
|
|
|
.. code-block:: gas
|
|
|
|
|
|
|
|
.section secName, "dr"
|
|
|
|
.linkonce discard
|
|
|
|
.globl Symbol1
|
|
|
|
Symbol1:
|
|
|
|
.long 1
|
|
|
|
|
2013-12-20 10:32:12 +00:00
|
|
|
Note that in the combined form the COMDAT symbol is explicit. This
|
2014-02-15 06:02:36 +00:00
|
|
|
extension exists to support multiple sections with the same name in
|
|
|
|
different COMDATs:
|
2013-11-19 19:52:52 +00:00
|
|
|
|
|
|
|
|
|
|
|
.. code-block:: gas
|
|
|
|
|
|
|
|
.section secName, "dr", discard, "Symbol1"
|
|
|
|
.globl Symbol1
|
|
|
|
Symbol1:
|
|
|
|
.long 1
|
|
|
|
|
|
|
|
.section secName, "dr", discard, "Symbol2"
|
|
|
|
.globl Symbol2
|
|
|
|
Symbol2:
|
|
|
|
.long 1
|
2014-04-30 07:05:07 +00:00
|
|
|
|
2014-06-06 19:26:12 +00:00
|
|
|
In addition to the types allowed with ``.linkonce``, ``.section`` also accepts
|
|
|
|
``associative``. The meaning is that the section is linked if a certain other
|
|
|
|
COMDAT section is linked. This other section is indicated by the comdat symbol
|
|
|
|
in this directive. It can be any symbol defined in the associated section, but
|
|
|
|
is usually the associated section's comdat.
|
|
|
|
|
|
|
|
The following restrictions apply to the associated section:
|
|
|
|
|
|
|
|
1. It must be a COMDAT section.
|
|
|
|
2. It cannot be another associative COMDAT section.
|
|
|
|
|
|
|
|
In the following example the symobl ``sym`` is the comdat symbol of ``.foo``
|
|
|
|
and ``.bar`` is associated to ``.foo``.
|
|
|
|
|
|
|
|
.. code-block:: gas
|
|
|
|
|
|
|
|
.section .foo,"bw",discard, "sym"
|
|
|
|
.section .bar,"rd",associative, "sym"
|
|
|
|
|
2015-04-04 18:02:01 +00:00
|
|
|
|
|
|
|
ELF-Dependent
|
|
|
|
-------------
|
|
|
|
|
|
|
|
``.section`` Directive
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
In order to support creating multiple sections with the same name and comdat,
|
|
|
|
it is possible to add an unique number at the end of the ``.seciton`` directive.
|
|
|
|
For example, the following code creates two sections named ``.text``.
|
|
|
|
|
|
|
|
.. code-block:: gas
|
|
|
|
|
2015-04-06 16:34:41 +00:00
|
|
|
.section .text,"ax",@progbits,unique,1
|
2015-04-04 18:02:01 +00:00
|
|
|
nop
|
|
|
|
|
2015-04-06 16:34:41 +00:00
|
|
|
.section .text,"ax",@progbits,unique,2
|
2015-04-04 18:02:01 +00:00
|
|
|
nop
|
|
|
|
|
|
|
|
|
|
|
|
The unique number is not present in the resulting object at all. It is just used
|
|
|
|
in the assembler to differentiate the sections.
|
|
|
|
|
2014-04-30 07:05:07 +00:00
|
|
|
Target Specific Behaviour
|
|
|
|
=========================
|
|
|
|
|
|
|
|
Windows on ARM
|
|
|
|
--------------
|
|
|
|
|
|
|
|
Stack Probe Emission
|
|
|
|
^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
The reference implementation (Microsoft Visual Studio 2012) emits stack probes
|
|
|
|
in the following fashion:
|
|
|
|
|
|
|
|
.. code-block:: gas
|
|
|
|
|
|
|
|
movw r4, #constant
|
|
|
|
bl __chkstk
|
|
|
|
sub.w sp, sp, r4
|
|
|
|
|
2014-05-15 01:52:21 +00:00
|
|
|
However, this has the limitation of 32 MiB (±16MiB). In order to accommodate
|
2014-04-30 07:05:07 +00:00
|
|
|
larger binaries, LLVM supports the use of ``-mcode-model=large`` to allow a 4GiB
|
|
|
|
range via a slight deviation. It will generate an indirect jump as follows:
|
|
|
|
|
|
|
|
.. code-block:: gas
|
|
|
|
|
|
|
|
movw r4, #constant
|
|
|
|
movw r12, :lower16:__chkstk
|
|
|
|
movt r12, :upper16:__chkstk
|
|
|
|
blx r12
|
|
|
|
sub.w sp, sp, r4
|
|
|
|
|
2014-06-09 20:18:42 +00:00
|
|
|
Variable Length Arrays
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
The reference implementation (Microsoft Visual Studio 2012) does not permit the
|
|
|
|
emission of Variable Length Arrays (VLAs).
|
|
|
|
|
|
|
|
The Windows ARM Itanium ABI extends the base ABI by adding support for emitting
|
|
|
|
a dynamic stack allocation. When emitting a variable stack allocation, a call
|
|
|
|
to ``__chkstk`` is emitted unconditionally to ensure that guard pages are setup
|
|
|
|
properly. The emission of this stack probe emission is handled similar to the
|
|
|
|
standard stack probe emission.
|
|
|
|
|
|
|
|
The MSVC environment does not emit code for VLAs currently.
|
|
|
|
|