mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-28 22:20:37 +00:00
ddbde80aae
This introduces the stack lowering emission of the stack probe function for Windows on ARM. The stack on Windows on ARM is a dynamically paged stack where any page allocation which crosses a page boundary of the following guard page will cause a page fault. This page fault must be handled by the kernel to ensure that the page is faulted in. If this does not occur and a write access any memory beyond that, the page fault will go unserviced, resulting in an abnormal program termination. The watermark for the stack probe appears to be at 4080 bytes (for accommodating the stack guard canaries and stack alignment) when SSP is enabled. Otherwise, the stack probe is emitted on the page size boundary of 4096 bytes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207615 91177308-0d34-0410-b5e6-96231b3b80d8
193 lines
4.3 KiB
ReStructuredText
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 accomodate
|
|
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
|
|
|