llvm-6502/docs/Extensions.rst
Alp Toker 727273b11c Fix typos
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208839 91177308-0d34-0410-b5e6-96231b3b80d8
2014-05-15 01:52:21 +00:00

193 lines
4.3 KiB
ReStructuredText

===============
LLVM Extensions
===============
.. contents::
:local:
.. toctree::
:hidden:
Introduction
============
This document describes extensions to tools and formats LLVM seeks compatibility
with.
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
.section .data
.float 0x1c2.2ap3
Machine-specific Assembly Syntax
================================
X86/COFF-Dependent
------------------
Relocations
^^^^^^^^^^^
The following additional relocation types are supported:
**@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
**.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
...
``.linkonce`` Directive
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Syntax:
``.linkonce [ comdat type [ section identifier ] ]``
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.
``associative``
Links the section if a certain other COMDAT section is linked. This other
section is indicated by its section identifier following the comdat type.
The following restrictions apply to the associated section:
1. It must be the name of a section already defined.
2. It must differ from the current section.
3. It must be a COMDAT section.
4. It cannot be another associative COMDAT section.
``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
...
.section .xdata$foo
.linkonce associative .text$foo
...
``.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
Note that in the combined form the COMDAT symbol is explicit. This
extension exists to support multiple sections with the same name in
different COMDATs:
.. code-block:: gas
.section secName, "dr", discard, "Symbol1"
.globl Symbol1
Symbol1:
.long 1
.section secName, "dr", discard, "Symbol2"
.globl Symbol2
Symbol2:
.long 1
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
However, this has the limitation of 32 MiB (±16MiB). In order to accommodate
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