1 // RUN: llvm-mc -n -triple x86_64-apple-darwin9 %s -filetype=obj -o - | llvm-readobj -r --expand-relocs | FileCheck %s 2 3 // These examples are taken from <mach-o/x86_64/reloc.h>. 4 5 .data 6 .long 0 7 8 .text 9 _foo: 10 ret 11 12 _baz: 13 call _foo 14 call _foo+4 15 movq _foo@GOTPCREL(%rip), %rax 16 pushq _foo@GOTPCREL(%rip) 17 movl _foo(%rip), %eax 18 movl _foo+4(%rip), %eax 19 movb $0x12, _foo(%rip) 20 movl $0x12345678, _foo(%rip) 21 .quad _foo 22 _bar: 23 .quad _foo+4 24 .quad _foo - _bar 25 .quad _foo - _bar + 4 26 .long _foo - _bar 27 leaq L1(%rip), %rax 28 leaq L0(%rip), %rax 29 addl $6,L0(%rip) 30 addw $500,L0(%rip) 31 addl $500,L0(%rip) 32 33 _prev: 34 .space 12,0x90 35 .quad L1 36 L0: 37 .quad L0 38 L_pc: 39 .quad _foo - L_pc 40 .quad _foo - L1 41 L1: 42 .quad L1 - _prev 43 44 .data 45 .long _foobar@GOTPCREL+4 46 .long _foo@GOTPCREL+4 47 48 .section __DWARF,__debug_frame,regular,debug 49 .quad L1 50 .quad _ext_foo 51 52 // Make sure local label which overlaps with non-local one is assigned to the 53 // right atom. 54 .text 55 _f2: 56 L2_0: 57 addl $0, %eax 58 L2_1: 59 _f3: 60 addl L2_1 - L2_0, %eax 61 62 .data 63 L4: 64 .long 0 65 .text 66 movl L4(%rip), %eax 67 68 .section __TEXT,__literal8,8byte_literals 69 .quad 0 70 L5: 71 .quad 0 72 f6: 73 .quad 0 74 L6: 75 .quad 0 76 77 .text 78 movl L5(%rip), %eax 79 movl f6(%rip), %eax 80 movl L6(%rip), %eax 81 82 .data 83 .quad L5 84 .quad f6 85 .quad L6 86 87 .text 88 cmpq $0, _foo@GOTPCREL(%rip) 89 90 // CHECK: Relocations [ 91 // CHECK-NEXT: Section __data { 92 // CHECK-NEXT: Relocation { 93 // CHECK-NEXT: Offset: 0x20 94 // CHECK-NEXT: PCRel: 0 95 // CHECK-NEXT: Length: 3 96 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 97 // CHECK-NEXT: Section: __literal8 98 // CHECK-NEXT: } 99 // CHECK-NEXT: Relocation { 100 // CHECK-NEXT: Offset: 0x18 101 // CHECK-NEXT: PCRel: 0 102 // CHECK-NEXT: Length: 3 103 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 104 // CHECK-NEXT: Symbol: f6 105 // CHECK-NEXT: } 106 // CHECK-NEXT: Relocation { 107 // CHECK-NEXT: Offset: 0x10 108 // CHECK-NEXT: PCRel: 0 109 // CHECK-NEXT: Length: 3 110 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 111 // CHECK-NEXT: Section: __literal8 112 // CHECK-NEXT: } 113 // CHECK-NEXT: Relocation { 114 // CHECK-NEXT: Offset: 0x8 115 // CHECK-NEXT: PCRel: 1 116 // CHECK-NEXT: Length: 2 117 // CHECK-NEXT: Type: X86_64_RELOC_GOT (4) 118 // CHECK-NEXT: Symbol: _foo 119 // CHECK-NEXT: } 120 // CHECK-NEXT: Relocation { 121 // CHECK-NEXT: Offset: 0x4 122 // CHECK-NEXT: PCRel: 1 123 // CHECK-NEXT: Length: 2 124 // CHECK-NEXT: Type: X86_64_RELOC_GOT (4) 125 // CHECK-NEXT: Symbol: _foobar 126 // CHECK-NEXT: } 127 // CHECK-NEXT: } 128 // CHECK-NEXT: Section __text { 129 // CHECK-NEXT: Relocation { 130 // CHECK-NEXT: Offset: 0xDA 131 // CHECK-NEXT: PCRel: 1 132 // CHECK-NEXT: Length: 2 133 // CHECK-NEXT: Type: X86_64_RELOC_GOT (4) 134 // CHECK-NEXT: Symbol: _foo 135 // CHECK-NEXT: } 136 // CHECK-NEXT: Relocation { 137 // CHECK-NEXT: Offset: 0xD3 138 // CHECK-NEXT: PCRel: 1 139 // CHECK-NEXT: Length: 2 140 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) 141 // CHECK-NEXT: Section: __literal8 142 // CHECK-NEXT: } 143 // CHECK-NEXT: Relocation { 144 // CHECK-NEXT: Offset: 0xCD 145 // CHECK-NEXT: PCRel: 1 146 // CHECK-NEXT: Length: 2 147 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) 148 // CHECK-NEXT: Symbol: f6 149 // CHECK-NEXT: } 150 // CHECK-NEXT: Relocation { 151 // CHECK-NEXT: Offset: 0xC7 152 // CHECK-NEXT: PCRel: 1 153 // CHECK-NEXT: Length: 2 154 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) 155 // CHECK-NEXT: Section: __literal8 156 // CHECK-NEXT: } 157 // CHECK-NEXT: Relocation { 158 // CHECK-NEXT: Offset: 0xC1 159 // CHECK-NEXT: PCRel: 1 160 // CHECK-NEXT: Length: 2 161 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) 162 // CHECK-NEXT: Section: __data 163 // CHECK-NEXT: } 164 // CHECK-NEXT: Relocation { 165 // CHECK-NEXT: Offset: 0xA5 166 // CHECK-NEXT: PCRel: 0 167 // CHECK-NEXT: Length: 3 168 // CHECK-NEXT: Type: X86_64_RELOC_SUBTRACTOR (5) 169 // CHECK-NEXT: Symbol: _prev 170 // CHECK-NEXT: } 171 // CHECK-NEXT: Relocation { 172 // CHECK-NEXT: Offset: 0xA5 173 // CHECK-NEXT: PCRel: 0 174 // CHECK-NEXT: Length: 3 175 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 176 // CHECK-NEXT: Symbol: _foo 177 // CHECK-NEXT: } 178 // CHECK-NEXT: Relocation { 179 // CHECK-NEXT: Offset: 0x9D 180 // CHECK-NEXT: PCRel: 0 181 // CHECK-NEXT: Length: 3 182 // CHECK-NEXT: Type: X86_64_RELOC_SUBTRACTOR (5) 183 // CHECK-NEXT: Symbol: _prev 184 // CHECK-NEXT: } 185 // CHECK-NEXT: Relocation { 186 // CHECK-NEXT: Offset: 0x9D 187 // CHECK-NEXT: PCRel: 0 188 // CHECK-NEXT: Length: 3 189 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 190 // CHECK-NEXT: Symbol: _foo 191 // CHECK-NEXT: } 192 // CHECK-NEXT: Relocation { 193 // CHECK-NEXT: Offset: 0x95 194 // CHECK-NEXT: PCRel: 0 195 // CHECK-NEXT: Length: 3 196 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 197 // CHECK-NEXT: Symbol: _prev 198 // CHECK-NEXT: } 199 // CHECK-NEXT: Relocation { 200 // CHECK-NEXT: Offset: 0x8D 201 // CHECK-NEXT: PCRel: 0 202 // CHECK-NEXT: Length: 3 203 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 204 // CHECK-NEXT: Symbol: _prev 205 // CHECK-NEXT: } 206 // CHECK-NEXT: Relocation { 207 // CHECK-NEXT: Offset: 0x79 208 // CHECK-NEXT: PCRel: 1 209 // CHECK-NEXT: Length: 2 210 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED_4 (8) 211 // CHECK-NEXT: Symbol: _prev 212 // CHECK-NEXT: } 213 // CHECK-NEXT: Relocation { 214 // CHECK-NEXT: Offset: 0x71 215 // CHECK-NEXT: PCRel: 1 216 // CHECK-NEXT: Length: 2 217 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED_2 (7) 218 // CHECK-NEXT: Symbol: _prev 219 // CHECK-NEXT: } 220 // CHECK-NEXT: Relocation { 221 // CHECK-NEXT: Offset: 0x69 222 // CHECK-NEXT: PCRel: 1 223 // CHECK-NEXT: Length: 2 224 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED_1 (6) 225 // CHECK-NEXT: Symbol: _prev 226 // CHECK-NEXT: } 227 // CHECK-NEXT: Relocation { 228 // CHECK-NEXT: Offset: 0x63 229 // CHECK-NEXT: PCRel: 1 230 // CHECK-NEXT: Length: 2 231 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) 232 // CHECK-NEXT: Symbol: _prev 233 // CHECK-NEXT: } 234 // CHECK-NEXT: Relocation { 235 // CHECK-NEXT: Offset: 0x5C 236 // CHECK-NEXT: PCRel: 1 237 // CHECK-NEXT: Length: 2 238 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) 239 // CHECK-NEXT: Symbol: _prev 240 // CHECK-NEXT: } 241 // CHECK-NEXT: Relocation { 242 // CHECK-NEXT: Offset: 0x55 243 // CHECK-NEXT: PCRel: 0 244 // CHECK-NEXT: Length: 2 245 // CHECK-NEXT: Type: X86_64_RELOC_SUBTRACTOR (5) 246 // CHECK-NEXT: Symbol: _bar 247 // CHECK-NEXT: } 248 // CHECK-NEXT: Relocation { 249 // CHECK-NEXT: Offset: 0x55 250 // CHECK-NEXT: PCRel: 0 251 // CHECK-NEXT: Length: 2 252 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 253 // CHECK-NEXT: Symbol: _foo 254 // CHECK-NEXT: } 255 // CHECK-NEXT: Relocation { 256 // CHECK-NEXT: Offset: 0x4D 257 // CHECK-NEXT: PCRel: 0 258 // CHECK-NEXT: Length: 3 259 // CHECK-NEXT: Type: X86_64_RELOC_SUBTRACTOR (5) 260 // CHECK-NEXT: Symbol: _bar 261 // CHECK-NEXT: } 262 // CHECK-NEXT: Relocation { 263 // CHECK-NEXT: Offset: 0x4D 264 // CHECK-NEXT: PCRel: 0 265 // CHECK-NEXT: Length: 3 266 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 267 // CHECK-NEXT: Symbol: _foo 268 // CHECK-NEXT: } 269 // CHECK-NEXT: Relocation { 270 // CHECK-NEXT: Offset: 0x45 271 // CHECK-NEXT: PCRel: 0 272 // CHECK-NEXT: Length: 3 273 // CHECK-NEXT: Type: X86_64_RELOC_SUBTRACTOR (5) 274 // CHECK-NEXT: Symbol: _bar 275 // CHECK-NEXT: } 276 // CHECK-NEXT: Relocation { 277 // CHECK-NEXT: Offset: 0x45 278 // CHECK-NEXT: PCRel: 0 279 // CHECK-NEXT: Length: 3 280 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 281 // CHECK-NEXT: Symbol: _foo 282 // CHECK-NEXT: } 283 // CHECK-NEXT: Relocation { 284 // CHECK-NEXT: Offset: 0x3D 285 // CHECK-NEXT: PCRel: 0 286 // CHECK-NEXT: Length: 3 287 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 288 // CHECK-NEXT: Symbol: _foo 289 // CHECK-NEXT: } 290 // CHECK-NEXT: Relocation { 291 // CHECK-NEXT: Offset: 0x35 292 // CHECK-NEXT: PCRel: 0 293 // CHECK-NEXT: Length: 3 294 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 295 // CHECK-NEXT: Symbol: _foo 296 // CHECK-NEXT: } 297 // CHECK-NEXT: Relocation { 298 // CHECK-NEXT: Offset: 0x2D 299 // CHECK-NEXT: PCRel: 1 300 // CHECK-NEXT: Length: 2 301 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED_4 (8) 302 // CHECK-NEXT: Symbol: _foo 303 // CHECK-NEXT: } 304 // CHECK-NEXT: Relocation { 305 // CHECK-NEXT: Offset: 0x26 306 // CHECK-NEXT: PCRel: 1 307 // CHECK-NEXT: Length: 2 308 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED_1 (6) 309 // CHECK-NEXT: Symbol: _foo 310 // CHECK-NEXT: } 311 // CHECK-NEXT: Relocation { 312 // CHECK-NEXT: Offset: 0x20 313 // CHECK-NEXT: PCRel: 1 314 // CHECK-NEXT: Length: 2 315 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) 316 // CHECK-NEXT: Symbol: _foo 317 // CHECK-NEXT: } 318 // CHECK-NEXT: Relocation { 319 // CHECK-NEXT: Offset: 0x1A 320 // CHECK-NEXT: PCRel: 1 321 // CHECK-NEXT: Length: 2 322 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) 323 // CHECK-NEXT: Symbol: _foo 324 // CHECK-NEXT: } 325 // CHECK-NEXT: Relocation { 326 // CHECK-NEXT: Offset: 0x14 327 // CHECK-NEXT: PCRel: 1 328 // CHECK-NEXT: Length: 2 329 // CHECK-NEXT: Type: X86_64_RELOC_GOT (4) 330 // CHECK-NEXT: Symbol: _foo 331 // CHECK-NEXT: } 332 // CHECK-NEXT: Relocation { 333 // CHECK-NEXT: Offset: 0xE 334 // CHECK-NEXT: PCRel: 1 335 // CHECK-NEXT: Length: 2 336 // CHECK-NEXT: Type: X86_64_RELOC_GOT_LOAD (3) 337 // CHECK-NEXT: Symbol: _foo 338 // CHECK-NEXT: } 339 // CHECK-NEXT: Relocation { 340 // CHECK-NEXT: Offset: 0x7 341 // CHECK-NEXT: PCRel: 1 342 // CHECK-NEXT: Length: 2 343 // CHECK-NEXT: Type: X86_64_RELOC_BRANCH (2) 344 // CHECK-NEXT: Symbol: _foo 345 // CHECK-NEXT: } 346 // CHECK-NEXT: Relocation { 347 // CHECK-NEXT: Offset: 0x2 348 // CHECK-NEXT: PCRel: 1 349 // CHECK-NEXT: Length: 2 350 // CHECK-NEXT: Type: X86_64_RELOC_BRANCH (2) 351 // CHECK-NEXT: Symbol: _foo 352 // CHECK-NEXT: } 353 // CHECK-NEXT: } 354 // CHECK-NEXT: Section __debug_frame { 355 // CHECK-NEXT: Relocation { 356 // CHECK-NEXT: Offset: 0x8 357 // CHECK-NEXT: PCRel: 0 358 // CHECK-NEXT: Length: 3 359 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 360 // CHECK-NEXT: Symbol: _ext_foo 361 // CHECK-NEXT: } 362 // CHECK-NEXT: Relocation { 363 // CHECK-NEXT: Offset: 0x0 364 // CHECK-NEXT: PCRel: 0 365 // CHECK-NEXT: Length: 3 366 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) 367 // CHECK-NEXT: Section: __text 368 // CHECK-NEXT: } 369 // CHECK-NEXT: } 370 // CHECK-NEXT: ] 371