1*9880d681SAndroid Build Coastguard Worker=============== 2*9880d681SAndroid Build Coastguard WorkerLLVM Extensions 3*9880d681SAndroid Build Coastguard Worker=============== 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker.. contents:: 6*9880d681SAndroid Build Coastguard Worker :local: 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker.. toctree:: 9*9880d681SAndroid Build Coastguard Worker :hidden: 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard WorkerIntroduction 12*9880d681SAndroid Build Coastguard Worker============ 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard WorkerThis document describes extensions to tools and formats LLVM seeks compatibility 15*9880d681SAndroid Build Coastguard Workerwith. 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard WorkerGeneral Assembly Syntax 18*9880d681SAndroid Build Coastguard Worker=========================== 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard WorkerC99-style Hexadecimal Floating-point Constants 21*9880d681SAndroid Build Coastguard Worker---------------------------------------------- 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard WorkerLLVM's assemblers allow floating-point constants to be written in C99's 24*9880d681SAndroid Build Coastguard Workerhexadecimal format instead of decimal if desired. 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Worker.. code-block:: gas 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker .section .data 29*9880d681SAndroid Build Coastguard Worker .float 0x1c2.2ap3 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard WorkerMachine-specific Assembly Syntax 32*9880d681SAndroid Build Coastguard Worker================================ 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard WorkerX86/COFF-Dependent 35*9880d681SAndroid Build Coastguard Worker------------------ 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard WorkerRelocations 38*9880d681SAndroid Build Coastguard Worker^^^^^^^^^^^ 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard WorkerThe following additional relocation types are supported: 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker**@IMGREL** (AT&T syntax only) generates an image-relative relocation that 43*9880d681SAndroid Build Coastguard Workercorresponds to the COFF relocation types ``IMAGE_REL_I386_DIR32NB`` (32-bit) or 44*9880d681SAndroid Build Coastguard Worker``IMAGE_REL_AMD64_ADDR32NB`` (64-bit). 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker.. code-block:: gas 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker .text 49*9880d681SAndroid Build Coastguard Worker fun: 50*9880d681SAndroid Build Coastguard Worker mov foo@IMGREL(%ebx, %ecx, 4), %eax 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker .section .pdata 53*9880d681SAndroid Build Coastguard Worker .long fun@IMGREL 54*9880d681SAndroid Build Coastguard Worker .long (fun@imgrel + 0x3F) 55*9880d681SAndroid Build Coastguard Worker .long $unwind$fun@imgrel 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker**.secrel32** generates a relocation that corresponds to the COFF relocation 58*9880d681SAndroid Build Coastguard Workertypes ``IMAGE_REL_I386_SECREL`` (32-bit) or ``IMAGE_REL_AMD64_SECREL`` (64-bit). 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker**.secidx** relocation generates an index of the section that contains 61*9880d681SAndroid Build Coastguard Workerthe target. It corresponds to the COFF relocation types 62*9880d681SAndroid Build Coastguard Worker``IMAGE_REL_I386_SECTION`` (32-bit) or ``IMAGE_REL_AMD64_SECTION`` (64-bit). 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker.. code-block:: gas 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker .section .debug$S,"rn" 67*9880d681SAndroid Build Coastguard Worker .long 4 68*9880d681SAndroid Build Coastguard Worker .long 242 69*9880d681SAndroid Build Coastguard Worker .long 40 70*9880d681SAndroid Build Coastguard Worker .secrel32 _function_name 71*9880d681SAndroid Build Coastguard Worker .secidx _function_name 72*9880d681SAndroid Build Coastguard Worker ... 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker``.linkonce`` Directive 75*9880d681SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard WorkerSyntax: 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker ``.linkonce [ comdat type ]`` 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard WorkerSupported COMDAT types: 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker``discard`` 84*9880d681SAndroid Build Coastguard Worker Discards duplicate sections with the same COMDAT symbol. This is the default 85*9880d681SAndroid Build Coastguard Worker if no type is specified. 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker``one_only`` 88*9880d681SAndroid Build Coastguard Worker If the symbol is defined multiple times, the linker issues an error. 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker``same_size`` 91*9880d681SAndroid Build Coastguard Worker Duplicates are discarded, but the linker issues an error if any have 92*9880d681SAndroid Build Coastguard Worker different sizes. 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker``same_contents`` 95*9880d681SAndroid Build Coastguard Worker Duplicates are discarded, but the linker issues an error if any duplicates 96*9880d681SAndroid Build Coastguard Worker do not have exactly the same content. 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker``largest`` 99*9880d681SAndroid Build Coastguard Worker Links the largest section from among the duplicates. 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker``newest`` 102*9880d681SAndroid Build Coastguard Worker Links the newest section from among the duplicates. 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker.. code-block:: gas 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker .section .text$foo 108*9880d681SAndroid Build Coastguard Worker .linkonce 109*9880d681SAndroid Build Coastguard Worker ... 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker``.section`` Directive 112*9880d681SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard WorkerMC supports passing the information in ``.linkonce`` at the end of 115*9880d681SAndroid Build Coastguard Worker``.section``. For example, these two codes are equivalent 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker.. code-block:: gas 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker .section secName, "dr", discard, "Symbol1" 120*9880d681SAndroid Build Coastguard Worker .globl Symbol1 121*9880d681SAndroid Build Coastguard Worker Symbol1: 122*9880d681SAndroid Build Coastguard Worker .long 1 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker.. code-block:: gas 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker .section secName, "dr" 127*9880d681SAndroid Build Coastguard Worker .linkonce discard 128*9880d681SAndroid Build Coastguard Worker .globl Symbol1 129*9880d681SAndroid Build Coastguard Worker Symbol1: 130*9880d681SAndroid Build Coastguard Worker .long 1 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard WorkerNote that in the combined form the COMDAT symbol is explicit. This 133*9880d681SAndroid Build Coastguard Workerextension exists to support multiple sections with the same name in 134*9880d681SAndroid Build Coastguard Workerdifferent COMDATs: 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker.. code-block:: gas 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker .section secName, "dr", discard, "Symbol1" 140*9880d681SAndroid Build Coastguard Worker .globl Symbol1 141*9880d681SAndroid Build Coastguard Worker Symbol1: 142*9880d681SAndroid Build Coastguard Worker .long 1 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker .section secName, "dr", discard, "Symbol2" 145*9880d681SAndroid Build Coastguard Worker .globl Symbol2 146*9880d681SAndroid Build Coastguard Worker Symbol2: 147*9880d681SAndroid Build Coastguard Worker .long 1 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard WorkerIn addition to the types allowed with ``.linkonce``, ``.section`` also accepts 150*9880d681SAndroid Build Coastguard Worker``associative``. The meaning is that the section is linked if a certain other 151*9880d681SAndroid Build Coastguard WorkerCOMDAT section is linked. This other section is indicated by the comdat symbol 152*9880d681SAndroid Build Coastguard Workerin this directive. It can be any symbol defined in the associated section, but 153*9880d681SAndroid Build Coastguard Workeris usually the associated section's comdat. 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker The following restrictions apply to the associated section: 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker 1. It must be a COMDAT section. 158*9880d681SAndroid Build Coastguard Worker 2. It cannot be another associative COMDAT section. 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard WorkerIn the following example the symobl ``sym`` is the comdat symbol of ``.foo`` 161*9880d681SAndroid Build Coastguard Workerand ``.bar`` is associated to ``.foo``. 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker.. code-block:: gas 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker .section .foo,"bw",discard, "sym" 166*9880d681SAndroid Build Coastguard Worker .section .bar,"rd",associative, "sym" 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard WorkerELF-Dependent 170*9880d681SAndroid Build Coastguard Worker------------- 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker``.section`` Directive 173*9880d681SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^^^^^ 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard WorkerIn order to support creating multiple sections with the same name and comdat, 176*9880d681SAndroid Build Coastguard Workerit is possible to add an unique number at the end of the ``.seciton`` directive. 177*9880d681SAndroid Build Coastguard WorkerFor example, the following code creates two sections named ``.text``. 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker.. code-block:: gas 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker .section .text,"ax",@progbits,unique,1 182*9880d681SAndroid Build Coastguard Worker nop 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Worker .section .text,"ax",@progbits,unique,2 185*9880d681SAndroid Build Coastguard Worker nop 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard WorkerThe unique number is not present in the resulting object at all. It is just used 189*9880d681SAndroid Build Coastguard Workerin the assembler to differentiate the sections. 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard WorkerTarget Specific Behaviour 192*9880d681SAndroid Build Coastguard Worker========================= 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard WorkerWindows on ARM 195*9880d681SAndroid Build Coastguard Worker-------------- 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard WorkerStack Probe Emission 198*9880d681SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^^^ 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard WorkerThe reference implementation (Microsoft Visual Studio 2012) emits stack probes 201*9880d681SAndroid Build Coastguard Workerin the following fashion: 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker.. code-block:: gas 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker movw r4, #constant 206*9880d681SAndroid Build Coastguard Worker bl __chkstk 207*9880d681SAndroid Build Coastguard Worker sub.w sp, sp, r4 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard WorkerHowever, this has the limitation of 32 MiB (±16MiB). In order to accommodate 210*9880d681SAndroid Build Coastguard Workerlarger binaries, LLVM supports the use of ``-mcode-model=large`` to allow a 4GiB 211*9880d681SAndroid Build Coastguard Workerrange via a slight deviation. It will generate an indirect jump as follows: 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Worker.. code-block:: gas 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Worker movw r4, #constant 216*9880d681SAndroid Build Coastguard Worker movw r12, :lower16:__chkstk 217*9880d681SAndroid Build Coastguard Worker movt r12, :upper16:__chkstk 218*9880d681SAndroid Build Coastguard Worker blx r12 219*9880d681SAndroid Build Coastguard Worker sub.w sp, sp, r4 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard WorkerVariable Length Arrays 222*9880d681SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^^^^^ 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard WorkerThe reference implementation (Microsoft Visual Studio 2012) does not permit the 225*9880d681SAndroid Build Coastguard Workeremission of Variable Length Arrays (VLAs). 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard WorkerThe Windows ARM Itanium ABI extends the base ABI by adding support for emitting 228*9880d681SAndroid Build Coastguard Workera dynamic stack allocation. When emitting a variable stack allocation, a call 229*9880d681SAndroid Build Coastguard Workerto ``__chkstk`` is emitted unconditionally to ensure that guard pages are setup 230*9880d681SAndroid Build Coastguard Workerproperly. The emission of this stack probe emission is handled similar to the 231*9880d681SAndroid Build Coastguard Workerstandard stack probe emission. 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard WorkerThe MSVC environment does not emit code for VLAs currently. 234*9880d681SAndroid Build Coastguard Worker 235