xref: /aosp_15_r20/external/llvm/docs/Extensions.rst (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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