// RUN: llvm-mc -n -triple x86_64-apple-darwin9 %s -filetype=obj -o - | llvm-readobj -r --expand-relocs | FileCheck %s // These examples are taken from <mach-o/x86_64/reloc.h>. .data .long 0 .text _foo: ret _baz: call _foo call _foo+4 movq _foo@GOTPCREL(%rip), %rax pushq _foo@GOTPCREL(%rip) movl _foo(%rip), %eax movl _foo+4(%rip), %eax movb $0x12, _foo(%rip) movl $0x12345678, _foo(%rip) .quad _foo _bar: .quad _foo+4 .quad _foo - _bar .quad _foo - _bar + 4 .long _foo - _bar leaq L1(%rip), %rax leaq L0(%rip), %rax addl $6,L0(%rip) addw $500,L0(%rip) addl $500,L0(%rip) _prev: .space 12,0x90 .quad L1 L0: .quad L0 L_pc: .quad _foo - L_pc .quad _foo - L1 L1: .quad L1 - _prev .data .long _foobar@GOTPCREL+4 .long _foo@GOTPCREL+4 .section __DWARF,__debug_frame,regular,debug .quad L1 .quad _ext_foo // Make sure local label which overlaps with non-local one is assigned to the // right atom. .text _f2: L2_0: addl $0, %eax L2_1: _f3: addl L2_1 - L2_0, %eax .data L4: .long 0 .text movl L4(%rip), %eax .section __TEXT,__literal8,8byte_literals .quad 0 L5: .quad 0 f6: .quad 0 L6: .quad 0 .text movl L5(%rip), %eax movl f6(%rip), %eax movl L6(%rip), %eax .data .quad L5 .quad f6 .quad L6 .text cmpq $0, _foo@GOTPCREL(%rip) // CHECK: Relocations [ // CHECK-NEXT: Section __data { // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x20 // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Section: __literal8 // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x18 // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Symbol: f6 // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x10 // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Section: __literal8 // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x8 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_GOT (4) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x4 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_GOT (4) // CHECK-NEXT: Symbol: _foobar // CHECK-NEXT: } // CHECK-NEXT: } // CHECK-NEXT: Section __text { // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0xDA // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_GOT (4) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0xD3 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) // CHECK-NEXT: Section: __literal8 // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0xCD // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) // CHECK-NEXT: Symbol: f6 // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0xC7 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) // CHECK-NEXT: Section: __literal8 // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0xC1 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) // CHECK-NEXT: Section: __data // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0xA5 // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_SUBTRACTOR (5) // CHECK-NEXT: Symbol: _prev // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0xA5 // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x9D // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_SUBTRACTOR (5) // CHECK-NEXT: Symbol: _prev // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x9D // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x95 // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Symbol: _prev // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x8D // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Symbol: _prev // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x79 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED_4 (8) // CHECK-NEXT: Symbol: _prev // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x71 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED_2 (7) // CHECK-NEXT: Symbol: _prev // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x69 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED_1 (6) // CHECK-NEXT: Symbol: _prev // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x63 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) // CHECK-NEXT: Symbol: _prev // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x5C // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) // CHECK-NEXT: Symbol: _prev // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x55 // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SUBTRACTOR (5) // CHECK-NEXT: Symbol: _bar // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x55 // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x4D // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_SUBTRACTOR (5) // CHECK-NEXT: Symbol: _bar // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x4D // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x45 // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_SUBTRACTOR (5) // CHECK-NEXT: Symbol: _bar // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x45 // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x3D // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x35 // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x2D // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED_4 (8) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x26 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED_1 (6) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x20 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x1A // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_SIGNED (1) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x14 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_GOT (4) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0xE // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_GOT_LOAD (3) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x7 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_BRANCH (2) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x2 // CHECK-NEXT: PCRel: 1 // CHECK-NEXT: Length: 2 // CHECK-NEXT: Type: X86_64_RELOC_BRANCH (2) // CHECK-NEXT: Symbol: _foo // CHECK-NEXT: } // CHECK-NEXT: } // CHECK-NEXT: Section __debug_frame { // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x8 // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Symbol: _ext_foo // CHECK-NEXT: } // CHECK-NEXT: Relocation { // CHECK-NEXT: Offset: 0x0 // CHECK-NEXT: PCRel: 0 // CHECK-NEXT: Length: 3 // CHECK-NEXT: Type: X86_64_RELOC_UNSIGNED (0) // CHECK-NEXT: Section: __text // CHECK-NEXT: } // CHECK-NEXT: } // CHECK-NEXT: ]