1 // RUN: llvm-mc -triple x86_64-apple-darwin10 %s -filetype=obj -o - | macho-dump --dump-section-data | 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 // CHECK: ('cputype', 16777223) 121 // CHECK: ('cpusubtype', 3) 122 // CHECK: ('filetype', 1) 123 // CHECK: ('num_load_commands', 3) 124 // CHECK: ('load_commands_size', 336) 125 // CHECK: ('flag', 0) 126 // CHECK: ('reserved', 0) 127 // CHECK: ('load_commands', [ 128 // CHECK: # Load Command 0 129 // CHECK: (('command', 25) 130 // CHECK: ('size', 232) 131 // CHECK: ('segment_name', '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 132 // CHECK: ('vm_addr', 0) 133 // CHECK: ('vm_size', 236) 134 // CHECK: ('file_offset', 368) 135 // CHECK: ('file_size', 236) 136 // CHECK: ('maxprot', 7) 137 // CHECK: ('initprot', 7) 138 // CHECK: ('num_sections', 2) 139 // CHECK: ('flags', 0) 140 // CHECK: ('sections', [ 141 // CHECK: # Section 0 142 // CHECK: (('section_name', '__text\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 143 // CHECK: ('segment_name', '__TEXT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 144 // CHECK: ('address', 0) 145 // CHECK: ('size', 94) 146 // CHECK: ('offset', 368) 147 // CHECK: ('alignment', 0) 148 // CHECK: ('reloc_offset', 604) 149 // CHECK: ('num_reloc', 12) 150 // CHECK: ('flags', 0x80000400) 151 // CHECK: ('reserved1', 0) 152 // CHECK: ('reserved2', 0) 153 // CHECK: ('reserved3', 0) 154 // CHECK: ), 155 // CHECK: ('_relocations', [ 156 157 // FIXME: Unfortunately, we do not get these relocations in exactly the same 158 // order as Darwin 'as'. It turns out that 'as' *usually* ends up emitting 159 // them in reverse address order, but sometimes it allocates some 160 // additional relocations late so these end up precede the other entries. I 161 // haven't figured out the exact criteria for this yet. 162 163 // CHECK: (('word-0', 0x56), 164 // CHECK: ('word-1', 0x1d000004)), 165 // CHECK: (('word-0', 0x50), 166 // CHECK: ('word-1', 0x1d000004)), 167 // CHECK: (('word-0', 0x4a), 168 // CHECK: ('word-1', 0x1d000003)), 169 // CHECK: (('word-0', 0x44), 170 // CHECK: ('word-1', 0x1d000003)), 171 // CHECK: (('word-0', 0x3e), 172 // CHECK: ('word-1', 0x1d000002)), 173 // CHECK: (('word-0', 0x38), 174 // CHECK: ('word-1', 0x1d000002)), 175 // CHECK: (('word-0', 0x20), 176 // CHECK: ('word-1', 0x2d000004)), 177 // CHECK: (('word-0', 0x1b), 178 // CHECK: ('word-1', 0x2d000004)), 179 // CHECK: (('word-0', 0x16), 180 // CHECK: ('word-1', 0x2d000003)), 181 // CHECK: (('word-0', 0x11), 182 // CHECK: ('word-1', 0x2d000003)), 183 // CHECK: (('word-0', 0xc), 184 // CHECK: ('word-1', 0x2d000002)), 185 // CHECK: (('word-0', 0x5), 186 // CHECK: ('word-1', 0x2d000000)), 187 // CHECK: ]) 188 // CHECK: # Section 1 189 // CHECK: (('section_name', '__data\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 190 // CHECK: ('segment_name', '__DATA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 191 // CHECK: ('address', 94) 192 // CHECK: ('size', 142) 193 // CHECK: ('offset', 462) 194 // CHECK: ('alignment', 0) 195 // CHECK: ('reloc_offset', 700) 196 // CHECK: ('num_reloc', 16) 197 // CHECK: ('flags', 0x400) 198 // CHECK: ('reserved1', 0) 199 // CHECK: ('reserved2', 0) 200 // CHECK: ('reserved3', 0) 201 // CHECK: ), 202 // CHECK: ('_relocations', [ 203 // CHECK: # Relocation 0 204 // CHECK: (('word-0', 0x7a), 205 // CHECK: ('word-1', 0x5e000001)), 206 // CHECK: # Relocation 1 207 // CHECK: (('word-0', 0x7a), 208 // CHECK: ('word-1', 0xe000002)), 209 // CHECK: # Relocation 2 210 // CHECK: (('word-0', 0x72), 211 // CHECK: ('word-1', 0x5e000001)), 212 // CHECK: # Relocation 3 213 // CHECK: (('word-0', 0x72), 214 // CHECK: ('word-1', 0xe000002)), 215 // CHECK: # Relocation 4 216 // CHECK: (('word-0', 0x62), 217 // CHECK: ('word-1', 0xe000002)), 218 // CHECK: # Relocation 5 219 // CHECK: (('word-0', 0x5a), 220 // CHECK: ('word-1', 0xe000002)), 221 // CHECK: # Relocation 6 222 // CHECK: (('word-0', 0x52), 223 // CHECK: ('word-1', 0xe000001)), 224 // CHECK: # Relocation 7 225 // CHECK: (('word-0', 0x4a), 226 // CHECK: ('word-1', 0xe000001)), 227 // CHECK: # Relocation 8 228 // CHECK: (('word-0', 0x3a), 229 // CHECK: ('word-1', 0x5e000003)), 230 // CHECK: # Relocation 9 231 // CHECK: (('word-0', 0x3a), 232 // CHECK: ('word-1', 0xe000004)), 233 // CHECK: # Relocation 10 234 // CHECK: (('word-0', 0x32), 235 // CHECK: ('word-1', 0x5e000003)), 236 // CHECK: # Relocation 11 237 // CHECK: (('word-0', 0x32), 238 // CHECK: ('word-1', 0xe000004)), 239 // CHECK: # Relocation 12 240 // CHECK: (('word-0', 0x22), 241 // CHECK: ('word-1', 0xe000004)), 242 // CHECK: # Relocation 13 243 // CHECK: (('word-0', 0x1a), 244 // CHECK: ('word-1', 0xe000004)), 245 // CHECK: # Relocation 14 246 // CHECK: (('word-0', 0x12), 247 // CHECK: ('word-1', 0xe000003)), 248 // CHECK: # Relocation 15 249 // CHECK: (('word-0', 0xa), 250 // CHECK: ('word-1', 0xe000003)), 251 // CHECK: ]) 252 // CHECK: ]) 253 // CHECK: ), 254 // CHECK: # Load Command 1 255 // CHECK: (('command', 2) 256 // CHECK: ('size', 24) 257 // CHECK: ('symoff', 828) 258 // CHECK: ('nsyms', 5) 259 // CHECK: ('stroff', 908) 260 // CHECK: ('strsize', 24) 261 // CHECK: ('_string_data', '\x00_foo\x00_g0\x00_g1\x00_g2\x00_g3\x00\x00\x00') 262 // CHECK: ('_symbols', [ 263 // CHECK: # Symbol 0 264 // CHECK: (('n_strx', 1) 265 // CHECK: ('n_type', 0xe) 266 // CHECK: ('n_sect', 1) 267 // CHECK: ('n_desc', 0) 268 // CHECK: ('n_value', 0) 269 // CHECK: ('_string', '_foo') 270 // CHECK: ), 271 // CHECK: # Symbol 1 272 // CHECK: (('n_strx', 6) 273 // CHECK: ('n_type', 0xe) 274 // CHECK: ('n_sect', 1) 275 // CHECK: ('n_desc', 0) 276 // CHECK: ('n_value', 2) 277 // CHECK: ('_string', '_g0') 278 // CHECK: ), 279 // CHECK: # Symbol 2 280 // CHECK: (('n_strx', 10) 281 // CHECK: ('n_type', 0xe) 282 // CHECK: ('n_sect', 1) 283 // CHECK: ('n_desc', 0) 284 // CHECK: ('n_value', 90) 285 // CHECK: ('_string', '_g1') 286 // CHECK: ), 287 // CHECK: # Symbol 3 288 // CHECK: (('n_strx', 14) 289 // CHECK: ('n_type', 0xe) 290 // CHECK: ('n_sect', 2) 291 // CHECK: ('n_desc', 0) 292 // CHECK: ('n_value', 94) 293 // CHECK: ('_string', '_g2') 294 // CHECK: ), 295 // CHECK: # Symbol 4 296 // CHECK: (('n_strx', 18) 297 // CHECK: ('n_type', 0xe) 298 // CHECK: ('n_sect', 2) 299 // CHECK: ('n_desc', 0) 300 // CHECK: ('n_value', 232) 301 // CHECK: ('_string', '_g3') 302 // CHECK: ), 303 // CHECK: ]) 304 // CHECK: ), 305 // CHECK: # Load Command 2 306 // CHECK: (('command', 11) 307 // CHECK: ('size', 80) 308 // CHECK: ('ilocalsym', 0) 309 // CHECK: ('nlocalsym', 5) 310 // CHECK: ('iextdefsym', 5) 311 // CHECK: ('nextdefsym', 0) 312 // CHECK: ('iundefsym', 5) 313 // CHECK: ('nundefsym', 0) 314 // CHECK: ('tocoff', 0) 315 // CHECK: ('ntoc', 0) 316 // CHECK: ('modtaboff', 0) 317 // CHECK: ('nmodtab', 0) 318 // CHECK: ('extrefsymoff', 0) 319 // CHECK: ('nextrefsyms', 0) 320 // CHECK: ('indirectsymoff', 0) 321 // CHECK: ('nindirectsyms', 0) 322 // CHECK: ('extreloff', 0) 323 // CHECK: ('nextrel', 0) 324 // CHECK: ('locreloff', 0) 325 // CHECK: ('nlocrel', 0) 326 // CHECK: ('_indirect_symbols', [ 327 // CHECK: ]) 328 // CHECK: ), 329 // CHECK: ]) 330