1===============
2LLVM Extensions
3===============
4
5.. contents::
6   :local:
7
8.. toctree::
9   :hidden:
10
11Introduction
12============
13
14This document describes extensions to tools and formats LLVM seeks compatibility
15with.
16
17General Assembly Syntax
18===========================
19
20C99-style Hexadecimal Floating-point Constants
21----------------------------------------------
22
23LLVM's assemblers allow floating-point constants to be written in C99's
24hexadecimal format instead of decimal if desired.
25
26.. code-block:: gas
27
28  .section .data
29  .float 0x1c2.2ap3
30
31Machine-specific Assembly Syntax
32================================
33
34X86/COFF-Dependent
35------------------
36
37Relocations
38^^^^^^^^^^^
39
40The following additional relocation types are supported:
41
42**@IMGREL** (AT&T syntax only) generates an image-relative relocation that
43corresponds to the COFF relocation types ``IMAGE_REL_I386_DIR32NB`` (32-bit) or
44``IMAGE_REL_AMD64_ADDR32NB`` (64-bit).
45
46.. code-block:: gas
47
48  .text
49  fun:
50    mov foo@IMGREL(%ebx, %ecx, 4), %eax
51
52  .section .pdata
53    .long fun@IMGREL
54    .long (fun@imgrel + 0x3F)
55    .long $unwind$fun@imgrel
56
57**.secrel32** generates a relocation that corresponds to the COFF relocation
58types ``IMAGE_REL_I386_SECREL`` (32-bit) or ``IMAGE_REL_AMD64_SECREL`` (64-bit).
59
60**.secidx** relocation generates an index of the section that contains
61the target.  It corresponds to the COFF relocation types
62``IMAGE_REL_I386_SECTION`` (32-bit) or ``IMAGE_REL_AMD64_SECTION`` (64-bit).
63
64.. code-block:: gas
65
66  .section .debug$S,"rn"
67    .long 4
68    .long 242
69    .long 40
70    .secrel32 _function_name
71    .secidx   _function_name
72    ...
73
74``.linkonce`` Directive
75^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
76
77Syntax:
78
79   ``.linkonce [ comdat type [ section identifier ] ]``
80
81Supported COMDAT types:
82
83``discard``
84   Discards duplicate sections with the same COMDAT symbol. This is the default
85   if no type is specified.
86
87``one_only``
88   If the symbol is defined multiple times, the linker issues an error.
89
90``same_size``
91   Duplicates are discarded, but the linker issues an error if any have
92   different sizes.
93
94``same_contents``
95   Duplicates are discarded, but the linker issues an error if any duplicates
96   do not have exactly the same content.
97
98``associative``
99   Links the section if a certain other COMDAT section is linked. This other
100   section is indicated by its section identifier following the comdat type.
101   The following restrictions apply to the associated section:
102
103   1. It must be the name of a section already defined.
104   2. It must differ from the current section.
105   3. It must be a COMDAT section.
106   4. It cannot be another associative COMDAT section.
107
108``largest``
109   Links the largest section from among the duplicates.
110
111``newest``
112   Links the newest section from among the duplicates.
113
114
115.. code-block:: gas
116
117  .section .text$foo
118  .linkonce
119    ...
120
121  .section .xdata$foo
122  .linkonce associative .text$foo
123    ...
124
125``.section`` Directive
126^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
127
128MC supports passing the information in ``.linkonce`` at the end of
129``.section``. For example,  these two codes are equivalent
130
131.. code-block:: gas
132
133  .section secName, "dr", discard, "Symbol1"
134  .globl Symbol1
135  Symbol1:
136  .long 1
137
138.. code-block:: gas
139
140  .section secName, "dr"
141  .linkonce discard
142  .globl Symbol1
143  Symbol1:
144  .long 1
145
146Note that in the combined form the COMDAT symbol is explicit. This
147extension exists to support multiple sections with the same name in
148different COMDATs:
149
150
151.. code-block:: gas
152
153  .section secName, "dr", discard, "Symbol1"
154  .globl Symbol1
155  Symbol1:
156  .long 1
157
158  .section secName, "dr", discard, "Symbol2"
159  .globl Symbol2
160  Symbol2:
161  .long 1
162