Home | History | Annotate | Download | only in MachO
      1 // RUN: llvm-mc -triple x86_64-apple-darwin10 %s -filetype=obj -o - | llvm-readobj -file-headers -s -sd -r -t -macho-segment -macho-dysymtab -macho-indirect-symbols | FileCheck %s
      2 
      3         .text
      4 
      5 // FIXME: llvm-mc doesn't handle this in a way we can make compatible with 'as',
      6 // currently, because of how we handle assembler variables.
      7 //
      8 // See <rdar://problem/7763719> improve handling of absolute symbols
      9 
     10 // _baz = 4
     11 
     12 _foo:
     13         xorl %eax,%eax
     14 _g0:
     15         xorl %eax,%eax
     16 L0:
     17         jmp 4
     18 //        jmp _baz
     19 
     20 // FIXME: Darwin 'as' for historical reasons widens this jump, but doesn't emit
     21 // a relocation. It seems like 'as' widens any jump that is not to a temporary,
     22 // which is inherited from the x86_32 behavior, even though x86_64 could do
     23 // better.
     24 //        jmp _g0
     25 
     26         jmp L0
     27         jmp _g1
     28 
     29 // FIXME: Darwin 'as' gets this wrong as well, even though it could get it right
     30 // given the other things we do on x86_64. It is using a short jump here. This
     31 // is probably fallout of the hack that exists for x86_32.
     32 //        jmp L1
     33 
     34 // FIXME: We don't support this, and would currently get it wrong, it should be a jump to an absolute address.
     35 //        jmp L0 - _g0
     36 
     37 //        jmp _g1 - _g0
     38 // FIXME: Darwin 'as' comes up with 'SIGNED' here instead of 'BRANCH'.
     39 //        jmp _g1 - L1
     40 // FIXME: Darwin 'as' gets this completely wrong. It ends up with a single
     41 // branch relocation. Fallout from the other delta hack?
     42 //        jmp L1 - _g0
     43 
     44         jmp _g2
     45         jmp L2
     46         jmp _g3
     47         jmp L3
     48 // FIXME: Darwin 'as' gets this completely wrong. It ends up with a single
     49 // branch relocation. Fallout from the other delta hack?
     50 //        jmp L2 - _g3
     51 //        jmp _g3 - _g2
     52 // FIXME: Darwin 'as' comes up with 'SIGNED' here instead of 'BRANCH'.
     53 //        jmp _g3 - L3
     54 // FIXME: Darwin 'as' gets this completely wrong. It ends up with a single
     55 // branch relocation. Fallout from the other delta hack?
     56 //        jmp L3 - _g2
     57 
     58         movl %eax,4(%rip)
     59 //        movl %eax,_baz(%rip)
     60         movl %eax,_g0(%rip)
     61         movl %eax,L0(%rip)
     62         movl %eax,_g1(%rip)
     63         movl %eax,L1(%rip)
     64 
     65 // FIXME: Darwin 'as' gets most of these wrong, and there is an ambiguity in ATT
     66 // syntax in what they should mean in the first place (absolute or
     67 // rip-relative address).
     68 //        movl %eax,L0 - _g0(%rip)
     69 //        movl %eax,_g1 - _g0(%rip)
     70 //        movl %eax,_g1 - L1(%rip)
     71 //        movl %eax,L1 - _g0(%rip)
     72 
     73         movl %eax,_g2(%rip)
     74         movl %eax,L2(%rip)
     75         movl %eax,_g3(%rip)
     76         movl %eax,L3(%rip)
     77 
     78 // FIXME: Darwin 'as' gets most of these wrong, and there is an ambiguity in ATT
     79 // syntax in what they should mean in the first place (absolute or
     80 // rip-relative address).
     81 //        movl %eax,L2 - _g2(%rip)
     82 //        movl %eax,_g3 - _g2(%rip)
     83 //        movl %eax,_g3 - L3(%rip)
     84 //        movl %eax,L3 - _g2(%rip)
     85 
     86 _g1:
     87         xorl %eax,%eax
     88 L1:
     89         xorl %eax,%eax
     90 
     91         .data
     92 _g2:
     93         xorl %eax,%eax
     94 L2:
     95         .quad 4
     96 //        .quad _baz
     97         .quad _g2
     98         .quad L2
     99         .quad _g3
    100         .quad L3
    101         .quad L2 - _g2
    102         .quad _g3 - _g2
    103         .quad L3 - _g2
    104         .quad L3 - _g3
    105 
    106         .quad _g0
    107         .quad L0
    108         .quad _g1
    109         .quad L1
    110         .quad L0 - _g0
    111         .quad _g1 - _g0
    112         .quad L1 - _g0
    113         .quad L1 - _g1
    114 
    115 _g3:
    116         xorl %eax,%eax
    117 L3:
    118         xorl %eax,%eax
    119 
    120 // FIXME: Unfortunately, we do not get these relocations in exactly the same
    121 // order as Darwin 'as'. It turns out that 'as' *usually* ends up emitting
    122 // them in reverse address order, but sometimes it allocates some
    123 // additional relocations late so these end up precede the other entries. I
    124 // haven't figured out the exact criteria for this yet.
    125 
    126 // CHECK: File: <stdin>
    127 // CHECK: Format: Mach-O 64-bit x86-64
    128 // CHECK: Arch: x86_64
    129 // CHECK: AddressSize: 64bit
    130 // CHECK: MachHeader {
    131 // CHECK:   Magic: Magic64 (0xFEEDFACF)
    132 // CHECK:   CpuType: X86-64 (0x1000007)
    133 // CHECK:   CpuSubType: CPU_SUBTYPE_X86_64_ALL (0x3)
    134 // CHECK:   FileType: Relocatable (0x1)
    135 // CHECK:   NumOfLoadCommands: 4
    136 // CHECK:   SizeOfLoadCommands: 352
    137 // CHECK:   Flags [ (0x0)
    138 // CHECK:   ]
    139 // CHECK:   Reserved: 0x0
    140 // CHECK: }
    141 // CHECK: Sections [
    142 // CHECK:   Section {
    143 // CHECK:     Index: 0
    144 // CHECK:     Name: __text (5F 5F 74 65 78 74 00 00 00 00 00 00 00 00 00 00)
    145 // CHECK:     Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00)
    146 // CHECK:     Address: 0x0
    147 // CHECK:     Size: 0x5E
    148 // CHECK:     Offset: 384
    149 // CHECK:     Alignment: 0
    150 // CHECK:     RelocationOffset: 0x26C
    151 // CHECK:     RelocationCount: 12
    152 // CHECK:     Type: 0x0
    153 // CHECK:     Attributes [ (0x800004)
    154 // CHECK:       PureInstructions (0x800000)
    155 // CHECK:       SomeInstructions (0x4)
    156 // CHECK:     ]
    157 // CHECK:     Reserved1: 0x0
    158 // CHECK:     Reserved2: 0x0
    159 // CHECK:     Reserved3: 0x0
    160 // CHECK:     SectionData (
    161 // CHECK:       0000: 31C031C0 E9040000 00EBF9E9 00000000  |1.1.............|
    162 // CHECK:       0010: E9000000 00E90200 0000E900 000000E9  |................|
    163 // CHECK:       0020: 02000000 89050400 00008905 D2FFFFFF  |................|
    164 // CHECK:       0030: 8905CEFF FFFF8905 00000000 89050200  |................|
    165 // CHECK:       0040: 00008905 00000000 89050200 00008905  |................|
    166 // CHECK:       0050: 00000000 89050200 000031C0 31C0      |..........1.1.|
    167 // CHECK:     )
    168 // CHECK:   }
    169 // CHECK:   Section {
    170 // CHECK:     Index: 1
    171 // CHECK:     Name: __data (5F 5F 64 61 74 61 00 00 00 00 00 00 00 00 00 00)
    172 // CHECK:     Segment: __DATA (5F 5F 44 41 54 41 00 00 00 00 00 00 00 00 00 00)
    173 // CHECK:     Address: 0x5E
    174 // CHECK:     Size: 0x8E
    175 // CHECK:     Offset: 478
    176 // CHECK:     Alignment: 0
    177 // CHECK:     RelocationOffset: 0x2CC
    178 // CHECK:     RelocationCount: 16
    179 // CHECK:     Type: 0x0
    180 // CHECK:     Attributes [ (0x4)
    181 // CHECK:       SomeInstructions (0x4)
    182 // CHECK:     ]
    183 // CHECK:     Reserved1: 0x0
    184 // CHECK:     Reserved2: 0x0
    185 // CHECK:     Reserved3: 0x0
    186 // CHECK:     SectionData (
    187 // CHECK:       0000: 31C00400 00000000 00000000 00000000  |1...............|
    188 // CHECK:       0010: 00000200 00000000 00000000 00000000  |................|
    189 // CHECK:       0020: 00000200 00000000 00000200 00000000  |................|
    190 // CHECK:       0030: 00000000 00000000 00000200 00000000  |................|
    191 // CHECK:       0040: 00000200 00000000 00000000 00000000  |................|
    192 // CHECK:       0050: 00000200 00000000 00000000 00000000  |................|
    193 // CHECK:       0060: 00000200 00000000 00000200 00000000  |................|
    194 // CHECK:       0070: 00000000 00000000 00000200 00000000  |................|
    195 // CHECK:       0080: 00000200 00000000 000031C0 31C0      |..........1.1.|
    196 // CHECK:     )
    197 // CHECK:   }
    198 // CHECK: ]
    199 // CHECK: Relocations [
    200 // CHECK:   Section __text {
    201 // CHECK:     0x56 1 2 1 X86_64_RELOC_SIGNED 0 _g3
    202 // CHECK:     0x50 1 2 1 X86_64_RELOC_SIGNED 0 _g3
    203 // CHECK:     0x4A 1 2 1 X86_64_RELOC_SIGNED 0 _g2
    204 // CHECK:     0x44 1 2 1 X86_64_RELOC_SIGNED 0 _g2
    205 // CHECK:     0x3E 1 2 1 X86_64_RELOC_SIGNED 0 _g1
    206 // CHECK:     0x38 1 2 1 X86_64_RELOC_SIGNED 0 _g1
    207 // CHECK:     0x20 1 2 1 X86_64_RELOC_BRANCH 0 _g3
    208 // CHECK:     0x1B 1 2 1 X86_64_RELOC_BRANCH 0 _g3
    209 // CHECK:     0x16 1 2 1 X86_64_RELOC_BRANCH 0 _g2
    210 // CHECK:     0x11 1 2 1 X86_64_RELOC_BRANCH 0 _g2
    211 // CHECK:     0xC 1 2 1 X86_64_RELOC_BRANCH 0 _g1
    212 // CHECK:     0x5 1 2 1 X86_64_RELOC_BRANCH 0 _foo
    213 // CHECK:   }
    214 // CHECK:   Section __data {
    215 // CHECK:     0x7A 0 3 1 X86_64_RELOC_SUBTRACTOR 0 _g0
    216 // CHECK:     0x7A 0 3 1 X86_64_RELOC_UNSIGNED 0 _g1
    217 // CHECK:     0x72 0 3 1 X86_64_RELOC_SUBTRACTOR 0 _g0
    218 // CHECK:     0x72 0 3 1 X86_64_RELOC_UNSIGNED 0 _g1
    219 // CHECK:     0x62 0 3 1 X86_64_RELOC_UNSIGNED 0 _g1
    220 // CHECK:     0x5A 0 3 1 X86_64_RELOC_UNSIGNED 0 _g1
    221 // CHECK:     0x52 0 3 1 X86_64_RELOC_UNSIGNED 0 _g0
    222 // CHECK:     0x4A 0 3 1 X86_64_RELOC_UNSIGNED 0 _g0
    223 // CHECK:     0x3A 0 3 1 X86_64_RELOC_SUBTRACTOR 0 _g2
    224 // CHECK:     0x3A 0 3 1 X86_64_RELOC_UNSIGNED 0 _g3
    225 // CHECK:     0x32 0 3 1 X86_64_RELOC_SUBTRACTOR 0 _g2
    226 // CHECK:     0x32 0 3 1 X86_64_RELOC_UNSIGNED 0 _g3
    227 // CHECK:     0x22 0 3 1 X86_64_RELOC_UNSIGNED 0 _g3
    228 // CHECK:     0x1A 0 3 1 X86_64_RELOC_UNSIGNED 0 _g3
    229 // CHECK:     0x12 0 3 1 X86_64_RELOC_UNSIGNED 0 _g2
    230 // CHECK:     0xA 0 3 1 X86_64_RELOC_UNSIGNED 0 _g2
    231 // CHECK:   }
    232 // CHECK: ]
    233 // CHECK: Symbols [
    234 // CHECK:   Symbol {
    235 // CHECK:     Name: _foo (1)
    236 // CHECK:     Type: Section (0xE)
    237 // CHECK:     Section: __text (0x1)
    238 // CHECK:     RefType: UndefinedNonLazy (0x0)
    239 // CHECK:     Flags [ (0x0)
    240 // CHECK:     ]
    241 // CHECK:     Value: 0x0
    242 // CHECK:   }
    243 // CHECK:   Symbol {
    244 // CHECK:     Name: _g0 (18)
    245 // CHECK:     Type: Section (0xE)
    246 // CHECK:     Section: __text (0x1)
    247 // CHECK:     RefType: UndefinedNonLazy (0x0)
    248 // CHECK:     Flags [ (0x0)
    249 // CHECK:     ]
    250 // CHECK:     Value: 0x2
    251 // CHECK:   }
    252 // CHECK:   Symbol {
    253 // CHECK:     Name: _g1 (14)
    254 // CHECK:     Type: Section (0xE)
    255 // CHECK:     Section: __text (0x1)
    256 // CHECK:     RefType: UndefinedNonLazy (0x0)
    257 // CHECK:     Flags [ (0x0)
    258 // CHECK:     ]
    259 // CHECK:     Value: 0x5A
    260 // CHECK:   }
    261 // CHECK:   Symbol {
    262 // CHECK:     Name: _g2 (10)
    263 // CHECK:     Type: Section (0xE)
    264 // CHECK:     Section: __data (0x2)
    265 // CHECK:     RefType: UndefinedNonLazy (0x0)
    266 // CHECK:     Flags [ (0x0)
    267 // CHECK:     ]
    268 // CHECK:     Value: 0x5E
    269 // CHECK:   }
    270 // CHECK:   Symbol {
    271 // CHECK:     Name: _g3 (6)
    272 // CHECK:     Type: Section (0xE)
    273 // CHECK:     Section: __data (0x2)
    274 // CHECK:     RefType: UndefinedNonLazy (0x0)
    275 // CHECK:     Flags [ (0x0)
    276 // CHECK:     ]
    277 // CHECK:     Value: 0xE8
    278 // CHECK:   }
    279 // CHECK: ]
    280 // CHECK: Indirect Symbols {
    281 // CHECK:   Number: 0
    282 // CHECK:   Symbols [
    283 // CHECK:   ]
    284 // CHECK: }
    285 // CHECK: Segment {
    286 // CHECK:   Cmd: LC_SEGMENT_64
    287 // CHECK:   Name:
    288 // CHECK:   Size: 232
    289 // CHECK:   vmaddr: 0x0
    290 // CHECK:   vmsize: 0xEC
    291 // CHECK:   fileoff: 384
    292 // CHECK:   filesize: 236
    293 // CHECK:   maxprot: rwx
    294 // CHECK:   initprot: rwx
    295 // CHECK:   nsects: 2
    296 // CHECK:   flags: 0x0
    297 // CHECK: }
    298 // CHECK: Dysymtab {
    299 // CHECK:   ilocalsym: 0
    300 // CHECK:   nlocalsym: 5
    301 // CHECK:   iextdefsym: 5
    302 // CHECK:   nextdefsym: 0
    303 // CHECK:   iundefsym: 5
    304 // CHECK:   nundefsym: 0
    305 // CHECK:   tocoff: 0
    306 // CHECK:   ntoc: 0
    307 // CHECK:   modtaboff: 0
    308 // CHECK:   nmodtab: 0
    309 // CHECK:   extrefsymoff: 0
    310 // CHECK:   nextrefsyms: 0
    311 // CHECK:   indirectsymoff: 0
    312 // CHECK:   nindirectsyms: 0
    313 // CHECK:   extreloff: 0
    314 // CHECK:   nextrel: 0
    315 // CHECK:   locreloff: 0
    316 // CHECK:   nlocrel: 0
    317 // CHECK: }
    318