Remove the mblaze backend from llvm.
[oota-llvm.git] / test / tools / llvm-readobj / Inputs / relocs.py
1 #!/usr/bin/env python
2
3 # Generates ELF, COFF and MachO object files for different architectures
4 # containing all relocations:
5 #
6 # ELF:   i386, x86_64, ppc64, aarch64, arm, mips, mips64el
7 # COFF:  i386, x86_64
8 # MachO: i386, x86_64, arm
9 # (see end of file for triples)
10 #
11 # To simplify generation, object files are generated with just the proper
12 # number of relocations through repeated instructions. Afterwards, the
13 # relocations in the object file are patched to their proper value.
14
15 import operator
16 import shutil
17 import StringIO
18 import struct
19 import subprocess
20 import sys
21
22 class EnumType(type):
23   def __init__(self, name, bases = (), attributes = {}):
24     super(EnumType, self).__init__(name, bases, attributes)
25
26     type.__setattr__(self, '_map', {})
27     type.__setattr__(self, '_nameMap', {})
28
29     for symbol in attributes:
30       if symbol.startswith('__') or symbol.endswith('__'):
31         continue
32
33       value = attributes[symbol]
34
35       # MyEnum.symbol == value
36       type.__setattr__(self, symbol, value)
37       self._nameMap[symbol] = value
38
39       # The first symbol with the given value is authoritative.
40       if not (value in self._map):
41         # MyEnum[value] == symbol
42         self._map[value] = symbol
43
44   # Not supported (Enums are immutable).
45   def __setattr__(self, name, value):
46     raise NotSupportedException, self.__setattr__
47
48   # Not supported (Enums are immutable).
49   def __delattr__(self, name):
50     raise NotSupportedException, self.__delattr__
51
52   # Gets the enum symbol for the specified value.
53   def __getitem__(self, value):
54     symbol = self._map.get(value)
55     if symbol is None:
56       raise KeyError, value
57     return symbol
58
59   # Gets the enum symbol for the specified value or none.
60   def lookup(self, value):
61     symbol = self._map.get(value)
62     return symbol
63
64   # Not supported (Enums are immutable).
65   def __setitem__(self, value, symbol):
66     raise NotSupportedException, self.__setitem__
67
68   # Not supported (Enums are immutable).
69   def __delitem__(self, value):
70     raise NotSupportedException, self.__delitem__
71
72   def entries(self):
73     # sort by (value, name)
74     def makeKey(item):
75       return (item[1], item[0])
76     e = []
77     for pair in sorted(self._nameMap.iteritems(), key=makeKey):
78       e.append(pair)
79     return e
80
81   def __iter__(self):
82     for e in self.entries():
83       yield e
84
85 Enum = EnumType('Enum', (), {})
86
87 class BinaryReader:
88   def __init__(self, path):
89     self.file = open(path, "r+b", 0)
90     self.isLSB = None
91     self.is64Bit = None
92     self.isN64 = False
93
94   def tell(self):
95     return self.file.tell()
96
97   def seek(self, pos):
98     self.file.seek(pos)
99
100   def read(self, N):
101     data = self.file.read(N)
102     if len(data) != N:
103       raise ValueError, "Out of data!"
104     return data
105
106   def int8(self):
107     return ord(self.read(1))
108
109   def uint8(self):
110     return ord(self.read(1))
111
112   def int16(self):
113     return struct.unpack('><'[self.isLSB] + 'h', self.read(2))[0]
114
115   def uint16(self):
116     return struct.unpack('><'[self.isLSB] + 'H', self.read(2))[0]
117
118   def int32(self):
119     return struct.unpack('><'[self.isLSB] + 'i', self.read(4))[0]
120
121   def uint32(self):
122     return struct.unpack('><'[self.isLSB] + 'I', self.read(4))[0]
123
124   def int64(self):
125     return struct.unpack('><'[self.isLSB] + 'q', self.read(8))[0]
126
127   def uint64(self):
128     return struct.unpack('><'[self.isLSB] + 'Q', self.read(8))[0]
129
130   def writeUInt8(self, value):
131     self.file.write(struct.pack('><'[self.isLSB] + 'B', value))
132
133   def writeUInt16(self, value):
134     self.file.write(struct.pack('><'[self.isLSB] + 'H', value))
135
136   def writeUInt32(self, value):
137     self.file.write(struct.pack('><'[self.isLSB] + 'I', value))
138
139   def writeUInt64(self, value):
140     self.file.write(struct.pack('><'[self.isLSB] + 'Q', value))
141
142   def word(self):
143     if self.is64Bit:
144       return self.uint64()
145     else:
146       return self.uint32()
147
148   def writeWord(self, value):
149     if self.is64Bit:
150       self.writeUInt64(value)
151     else:
152       self.writeUInt32(value)
153
154 class StringTable:
155   def __init__(self, strings):
156     self.string_table = strings
157
158   def __getitem__(self, index):
159     end = self.string_table.index('\x00', index)
160     return self.string_table[index:end]
161
162 class ElfSection:
163   def __init__(self, f):
164     self.sh_name = f.uint32()
165     self.sh_type = f.uint32()
166     self.sh_flags = f.word()
167     self.sh_addr = f.word()
168     self.sh_offset = f.word()
169     self.sh_size = f.word()
170     self.sh_link = f.uint32()
171     self.sh_info = f.uint32()
172     self.sh_addralign = f.word()
173     self.sh_entsize = f.word()
174
175   def patch(self, f, relocs):
176     if self.sh_type == 4 or self.sh_type == 9: # SHT_RELA / SHT_REL
177       self.patchRelocs(f, relocs)
178
179   def patchRelocs(self, f, relocs):
180     entries = self.sh_size // self.sh_entsize
181
182     for index in range(entries):
183       f.seek(self.sh_offset + index * self.sh_entsize)
184       r_offset = f.word()
185
186       if index < len(relocs):
187         ri = index
188       else:
189         ri = 0
190
191       if f.isN64:
192         r_sym =   f.uint32()
193         r_ssym =  f.uint8()
194         f.seek(f.tell())
195         f.writeUInt8(relocs[ri][1])
196         f.writeUInt8(relocs[ri][1])
197         f.writeUInt8(relocs[ri][1])
198       else:
199         pos = f.tell()
200         r_info = f.word()
201
202         r_type = relocs[ri][1]
203         if f.is64Bit:
204           r_info = (r_info & 0xFFFFFFFF00000000) | (r_type & 0xFFFFFFFF)
205         else:
206           r_info = (r_info & 0xFF00) | (r_type & 0xFF)
207
208         print("    %s" % relocs[ri][0])
209         f.seek(pos)
210         f.writeWord(r_info)
211
212
213 class CoffSection:
214   def __init__(self, f):
215     self.raw_name                = f.read(8)
216     self.virtual_size            = f.uint32()
217     self.virtual_address         = f.uint32()
218     self.raw_data_size           = f.uint32()
219     self.pointer_to_raw_data     = f.uint32()
220     self.pointer_to_relocations  = f.uint32()
221     self.pointer_to_line_numbers = f.uint32()
222     self.relocation_count        = f.uint16()
223     self.line_number_count       = f.uint16()
224     self.characteristics         = f.uint32()
225
226
227 def compileAsm(filename, triple, src):
228   cmd = ["llvm-mc", "-triple=" + triple, "-filetype=obj", "-o", filename]
229   print("  Running: " + " ".join(cmd))
230   p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
231   p.communicate(input=src)
232   p.wait()
233
234 def compileIR(filename, triple, src):
235   cmd = ["llc", "-mtriple=" + triple, "-filetype=obj", "-o", filename]
236   print("  Running: " + " ".join(cmd))
237   p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
238   p.communicate(input=src)
239   p.wait()
240
241
242 def craftElf(filename, triple, relocs, dummyReloc):
243   print("Crafting " + filename + " for " + triple)
244   if type(dummyReloc) is tuple:
245     preSrc, dummyReloc, relocsPerDummy = dummyReloc
246     src = preSrc + "\n"
247     for i in range((len(relocs) + relocsPerDummy - 1) / relocsPerDummy):
248       src += dummyReloc.format(i) + "\n"
249     compileIR(filename, triple, src)
250   else:
251     src = (dummyReloc + "\n") * len(relocs)
252     compileAsm(filename, triple, src)
253
254   print("  Patching relocations...")
255   patchElf(filename, relocs)
256
257 def patchElf(path, relocs):
258   f = BinaryReader(path)
259
260   magic = f.read(4)
261   assert magic == '\x7FELF'
262
263   fileclass = f.uint8()
264   if fileclass == 1:
265     f.is64Bit = False
266   elif fileclass == 2:
267     f.is64Bit = True
268   else:
269     raise ValueError, "Unknown file class %x" % fileclass
270
271   byteordering = f.uint8()
272   if byteordering == 1:
273       f.isLSB = True
274   elif byteordering == 2:
275       f.isLSB = False
276   else:
277       raise ValueError, "Unknown byte ordering %x" % byteordering
278
279   f.seek(18)
280   e_machine = f.uint16()
281   if e_machine == 0x0008 and f.is64Bit: # EM_MIPS && 64 bit
282       f.isN64 = True
283
284   e_version = f.uint32()
285   e_entry = f.word()
286   e_phoff = f.word()
287   e_shoff = f.word()
288   e_flags = f.uint32()
289   e_ehsize = f.uint16()
290   e_phentsize = f.uint16()
291   e_phnum = f.uint16()
292   e_shentsize = f.uint16()
293   e_shnum = f.uint16()
294   e_shstrndx = f.uint16()
295
296   sections = []
297   for index in range(e_shnum):
298     f.seek(e_shoff + index * e_shentsize)
299     s = ElfSection(f)
300     sections.append(s)
301
302   f.seek(sections[e_shstrndx].sh_offset)
303   shstrtab = StringTable(f.read(sections[e_shstrndx].sh_size))
304
305   strtab = None
306   for section in sections:
307     if shstrtab[section.sh_name] == ".strtab":
308       f.seek(section.sh_offset)
309       strtab = StringTable(f.read(section.sh_size))
310       break
311
312   for index in range(e_shnum):
313     sections[index].patch(f, relocs)
314
315
316 def craftCoff(filename, triple, relocs, dummyReloc):
317   print("Crafting " + filename + " for " + triple)
318   src = (dummyReloc + "\n") * len(relocs)
319   compileAsm(filename, triple, src)
320
321   print("  Patching relocations...")
322   patchCoff(filename, relocs)
323
324 def patchCoff(path, relocs):
325   f = BinaryReader(path)
326   f.isLSB = True
327
328   machine_type            = f.uint16()
329   section_count           = f.uint16()
330   f.seek(20)
331   sections = [CoffSection(f) for idx in range(section_count)]
332
333   section = sections[0]
334   f.seek(section.pointer_to_relocations)
335   for i in range(section.relocation_count):
336     virtual_addr = f.uint32()
337     symtab_idx   = f.uint32()
338     print("    %s" % relocs[i][0])
339     f.writeUInt16(relocs[i][1])
340
341
342 def craftMacho(filename, triple, relocs, dummyReloc):
343   print("Crafting " + filename + " for " + triple)
344
345   if type(dummyReloc) is tuple:
346     srcType, preSrc, dummyReloc, relocsPerDummy = dummyReloc
347     src = preSrc + "\n"
348     for i in range((len(relocs) + relocsPerDummy - 1) / relocsPerDummy):
349       src += dummyReloc.format(i) + "\n"
350     if srcType == "asm":
351       compileAsm(filename, triple, src)
352     elif srcType == "ir":
353       compileIR(filename, triple, src)
354   else:
355     src = (dummyReloc + "\n") * len(relocs)
356     compileAsm(filename, triple, src)
357
358   print("  Patching relocations...")
359   patchMacho(filename, relocs)
360
361 def patchMacho(filename, relocs):
362   f = BinaryReader(filename)
363
364   magic = f.read(4)
365   if magic == '\xFE\xED\xFA\xCE':
366     f.isLSB, f.is64Bit = False, False
367   elif magic == '\xCE\xFA\xED\xFE':
368     f.isLSB, f.is64Bit = True, False
369   elif magic == '\xFE\xED\xFA\xCF':
370     f.isLSB, f.is64Bit = False, True
371   elif magic == '\xCF\xFA\xED\xFE':
372     f.isLSB, f.is64Bit = True, True
373   else:
374     raise ValueError,"Not a Mach-O object file: %r (bad magic)" % path
375
376   cputype = f.uint32()
377   cpusubtype = f.uint32()
378   filetype = f.uint32()
379   numLoadCommands = f.uint32()
380   loadCommandsSize = f.uint32()
381   flag = f.uint32()
382   if f.is64Bit:
383     reserved = f.uint32()
384
385   start = f.tell()
386
387   for i in range(numLoadCommands):
388     patchMachoLoadCommand(f, relocs)
389
390   if f.tell() - start != loadCommandsSize:
391     raise ValueError,"%s: warning: invalid load commands size: %r" % (
392       sys.argv[0], loadCommandsSize)
393
394 def patchMachoLoadCommand(f, relocs):
395   start = f.tell()
396   cmd = f.uint32()
397   cmdSize = f.uint32()
398
399   if cmd == 1:
400     patchMachoSegmentLoadCommand(f, relocs)
401   elif cmd == 25:
402     patchMachoSegmentLoadCommand(f, relocs)
403   else:
404     f.read(cmdSize - 8)
405
406   if f.tell() - start != cmdSize:
407     raise ValueError,"%s: warning: invalid load command size: %r" % (
408       sys.argv[0], cmdSize)
409
410 def patchMachoSegmentLoadCommand(f, relocs):
411   segment_name = f.read(16)
412   vm_addr = f.word()
413   vm_size = f.word()
414   file_offset = f.word()
415   file_size = f.word()
416   maxprot = f.uint32()
417   initprot = f.uint32()
418   numSections = f.uint32()
419   flags = f.uint32()
420   for i in range(numSections):
421     patchMachoSection(f, relocs)
422
423 def patchMachoSection(f, relocs):
424   section_name = f.read(16)
425   segment_name = f.read(16)
426   address = f.word()
427   size = f.word()
428   offset = f.uint32()
429   alignment = f.uint32()
430   relocOffset = f.uint32()
431   numReloc = f.uint32()
432   flags = f.uint32()
433   reserved1 = f.uint32()
434   reserved2 = f.uint32()
435   if f.is64Bit:
436     reserved3 = f.uint32()
437
438   prev_pos = f.tell()
439
440   f.seek(relocOffset)
441   for i in range(numReloc):
442     ri = i < len(relocs) and i or 0
443     print("    %s" % relocs[ri][0])
444     word1 = f.uint32()
445     pos = f.tell()
446     value = f.uint32()
447     f.seek(pos)
448     value = (value & 0x0FFFFFFF) | ((relocs[ri][1] & 0xF) << 28)
449     f.writeUInt32(value)
450   f.seek(prev_pos)
451
452
453 class Relocs_Elf_X86_64(Enum):
454   R_X86_64_NONE       = 0
455   R_X86_64_64         = 1
456   R_X86_64_PC32       = 2
457   R_X86_64_GOT32      = 3
458   R_X86_64_PLT32      = 4
459   R_X86_64_COPY       = 5
460   R_X86_64_GLOB_DAT   = 6
461   R_X86_64_JUMP_SLOT  = 7
462   R_X86_64_RELATIVE   = 8
463   R_X86_64_GOTPCREL   = 9
464   R_X86_64_32         = 10
465   R_X86_64_32S        = 11
466   R_X86_64_16         = 12
467   R_X86_64_PC16       = 13
468   R_X86_64_8          = 14
469   R_X86_64_PC8        = 15
470   R_X86_64_DTPMOD64   = 16
471   R_X86_64_DTPOFF64   = 17
472   R_X86_64_TPOFF64    = 18
473   R_X86_64_TLSGD      = 19
474   R_X86_64_TLSLD      = 20
475   R_X86_64_DTPOFF32   = 21
476   R_X86_64_GOTTPOFF   = 22
477   R_X86_64_TPOFF32    = 23
478   R_X86_64_PC64       = 24
479   R_X86_64_GOTOFF64   = 25
480   R_X86_64_GOTPC32    = 26
481   R_X86_64_GOT64      = 27
482   R_X86_64_GOTPCREL64 = 28
483   R_X86_64_GOTPC64    = 29
484   R_X86_64_GOTPLT64   = 30
485   R_X86_64_PLTOFF64   = 31
486   R_X86_64_SIZE32     = 32
487   R_X86_64_SIZE64     = 33
488   R_X86_64_GOTPC32_TLSDESC = 34
489   R_X86_64_TLSDESC_CALL    = 35
490   R_X86_64_TLSDESC    = 36
491   R_X86_64_IRELATIVE  = 37
492
493 class Relocs_Elf_i386(Enum):
494   R_386_NONE          = 0
495   R_386_32            = 1
496   R_386_PC32          = 2
497   R_386_GOT32         = 3
498   R_386_PLT32         = 4
499   R_386_COPY          = 5
500   R_386_GLOB_DAT      = 6
501   R_386_JUMP_SLOT     = 7
502   R_386_RELATIVE      = 8
503   R_386_GOTOFF        = 9
504   R_386_GOTPC         = 10
505   R_386_32PLT         = 11
506   R_386_TLS_TPOFF     = 14
507   R_386_TLS_IE        = 15
508   R_386_TLS_GOTIE     = 16
509   R_386_TLS_LE        = 17
510   R_386_TLS_GD        = 18
511   R_386_TLS_LDM       = 19
512   R_386_16            = 20
513   R_386_PC16          = 21
514   R_386_8             = 22
515   R_386_PC8           = 23
516   R_386_TLS_GD_32     = 24
517   R_386_TLS_GD_PUSH   = 25
518   R_386_TLS_GD_CALL   = 26
519   R_386_TLS_GD_POP    = 27
520   R_386_TLS_LDM_32    = 28
521   R_386_TLS_LDM_PUSH  = 29
522   R_386_TLS_LDM_CALL  = 30
523   R_386_TLS_LDM_POP   = 31
524   R_386_TLS_LDO_32    = 32
525   R_386_TLS_IE_32     = 33
526   R_386_TLS_LE_32     = 34
527   R_386_TLS_DTPMOD32  = 35
528   R_386_TLS_DTPOFF32  = 36
529   R_386_TLS_TPOFF32   = 37
530   R_386_TLS_GOTDESC   = 39
531   R_386_TLS_DESC_CALL = 40
532   R_386_TLS_DESC      = 41
533   R_386_IRELATIVE     = 42
534   R_386_NUM           = 43
535
536 class Relocs_Elf_PPC32(Enum):
537   R_PPC_NONE                  = 0
538   R_PPC_ADDR32                = 1
539   R_PPC_ADDR24                = 2
540   R_PPC_ADDR16                = 3
541   R_PPC_ADDR16_LO             = 4
542   R_PPC_ADDR16_HI             = 5
543   R_PPC_ADDR16_HA             = 6
544   R_PPC_ADDR14                = 7
545   R_PPC_ADDR14_BRTAKEN        = 8
546   R_PPC_ADDR14_BRNTAKEN       = 9
547   R_PPC_REL24                 = 10
548   R_PPC_REL14                 = 11
549   R_PPC_REL14_BRTAKEN         = 12
550   R_PPC_REL14_BRNTAKEN        = 13
551   R_PPC_REL32                 = 26
552   R_PPC_TPREL16_LO            = 70
553   R_PPC_TPREL16_HA            = 72
554
555 class Relocs_Elf_PPC64(Enum):
556   R_PPC64_NONE                = 0
557   R_PPC64_ADDR32              = 1
558   R_PPC64_ADDR16_LO           = 4
559   R_PPC64_ADDR16_HI           = 5
560   R_PPC64_ADDR14              = 7
561   R_PPC64_REL24               = 10
562   R_PPC64_REL32               = 26
563   R_PPC64_ADDR64              = 38
564   R_PPC64_ADDR16_HIGHER       = 39
565   R_PPC64_ADDR16_HIGHEST      = 41
566   R_PPC64_REL64               = 44
567   R_PPC64_TOC16               = 47
568   R_PPC64_TOC16_LO            = 48
569   R_PPC64_TOC16_HA            = 50
570   R_PPC64_TOC                 = 51
571   R_PPC64_ADDR16_DS           = 56
572   R_PPC64_ADDR16_LO_DS        = 57
573   R_PPC64_TOC16_DS            = 63
574   R_PPC64_TOC16_LO_DS         = 64
575   R_PPC64_TLS                 = 67
576   R_PPC64_TPREL16_LO          = 70
577   R_PPC64_TPREL16_HA          = 72
578   R_PPC64_DTPREL16_LO         = 75
579   R_PPC64_DTPREL16_HA         = 77
580   R_PPC64_GOT_TLSGD16_LO      = 80
581   R_PPC64_GOT_TLSGD16_HA      = 82
582   R_PPC64_GOT_TLSLD16_LO      = 84
583   R_PPC64_GOT_TLSLD16_HA      = 86
584   R_PPC64_GOT_TPREL16_LO_DS   = 88
585   R_PPC64_GOT_TPREL16_HA      = 90
586   R_PPC64_TLSGD               = 107
587   R_PPC64_TLSLD               = 108
588
589 class Relocs_Elf_AArch64(Enum):
590   R_AARCH64_NONE                        = 0x100
591   R_AARCH64_ABS64                       = 0x101
592   R_AARCH64_ABS32                       = 0x102
593   R_AARCH64_ABS16                       = 0x103
594   R_AARCH64_PREL64                      = 0x104
595   R_AARCH64_PREL32                      = 0x105
596   R_AARCH64_PREL16                      = 0x106
597   R_AARCH64_MOVW_UABS_G0                = 0x107
598   R_AARCH64_MOVW_UABS_G0_NC             = 0x108
599   R_AARCH64_MOVW_UABS_G1                = 0x109
600   R_AARCH64_MOVW_UABS_G1_NC             = 0x10a
601   R_AARCH64_MOVW_UABS_G2                = 0x10b
602   R_AARCH64_MOVW_UABS_G2_NC             = 0x10c
603   R_AARCH64_MOVW_UABS_G3                = 0x10d
604   R_AARCH64_MOVW_SABS_G0                = 0x10e
605   R_AARCH64_MOVW_SABS_G1                = 0x10f
606   R_AARCH64_MOVW_SABS_G2                = 0x110
607   R_AARCH64_LD_PREL_LO19                = 0x111
608   R_AARCH64_ADR_PREL_LO21               = 0x112
609   R_AARCH64_ADR_PREL_PG_HI21            = 0x113
610   R_AARCH64_ADD_ABS_LO12_NC             = 0x115
611   R_AARCH64_LDST8_ABS_LO12_NC           = 0x116
612   R_AARCH64_TSTBR14                     = 0x117
613   R_AARCH64_CONDBR19                    = 0x118
614   R_AARCH64_JUMP26                      = 0x11a
615   R_AARCH64_CALL26                      = 0x11b
616   R_AARCH64_LDST16_ABS_LO12_NC          = 0x11c
617   R_AARCH64_LDST32_ABS_LO12_NC          = 0x11d
618   R_AARCH64_LDST64_ABS_LO12_NC          = 0x11e
619   R_AARCH64_LDST128_ABS_LO12_NC         = 0x12b
620   R_AARCH64_ADR_GOT_PAGE                = 0x137
621   R_AARCH64_LD64_GOT_LO12_NC            = 0x138
622   R_AARCH64_TLSLD_MOVW_DTPREL_G2        = 0x20b
623   R_AARCH64_TLSLD_MOVW_DTPREL_G1        = 0x20c
624   R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC     = 0x20d
625   R_AARCH64_TLSLD_MOVW_DTPREL_G0        = 0x20e
626   R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC     = 0x20f
627   R_AARCH64_TLSLD_ADD_DTPREL_HI12       = 0x210
628   R_AARCH64_TLSLD_ADD_DTPREL_LO12       = 0x211
629   R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC    = 0x212
630   R_AARCH64_TLSLD_LDST8_DTPREL_LO12     = 0x213
631   R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC  = 0x214
632   R_AARCH64_TLSLD_LDST16_DTPREL_LO12    = 0x215
633   R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC = 0x216
634   R_AARCH64_TLSLD_LDST32_DTPREL_LO12    = 0x217
635   R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC = 0x218
636   R_AARCH64_TLSLD_LDST64_DTPREL_LO12    = 0x219
637   R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC = 0x21a
638   R_AARCH64_TLSIE_MOVW_GOTTPREL_G1      = 0x21b
639   R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC   = 0x21c
640   R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21   = 0x21d
641   R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC = 0x21e
642   R_AARCH64_TLSIE_LD_GOTTPREL_PREL19    = 0x21f
643   R_AARCH64_TLSLE_MOVW_TPREL_G2         = 0x220
644   R_AARCH64_TLSLE_MOVW_TPREL_G1         = 0x221
645   R_AARCH64_TLSLE_MOVW_TPREL_G1_NC      = 0x222
646   R_AARCH64_TLSLE_MOVW_TPREL_G0         = 0x223
647   R_AARCH64_TLSLE_MOVW_TPREL_G0_NC      = 0x224
648   R_AARCH64_TLSLE_ADD_TPREL_HI12        = 0x225
649   R_AARCH64_TLSLE_ADD_TPREL_LO12        = 0x226
650   R_AARCH64_TLSLE_ADD_TPREL_LO12_NC     = 0x227
651   R_AARCH64_TLSLE_LDST8_TPREL_LO12      = 0x228
652   R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC   = 0x229
653   R_AARCH64_TLSLE_LDST16_TPREL_LO12     = 0x22a
654   R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC  = 0x22b
655   R_AARCH64_TLSLE_LDST32_TPREL_LO12     = 0x22c
656   R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC  = 0x22d
657   R_AARCH64_TLSLE_LDST64_TPREL_LO12     = 0x22e
658   R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC  = 0x22f
659   R_AARCH64_TLSDESC_ADR_PAGE            = 0x232
660   R_AARCH64_TLSDESC_LD64_LO12_NC        = 0x233
661   R_AARCH64_TLSDESC_ADD_LO12_NC         = 0x234
662   R_AARCH64_TLSDESC_CALL                = 0x239
663
664 class Relocs_Elf_ARM(Enum):
665   R_ARM_NONE                  = 0x00
666   R_ARM_PC24                  = 0x01
667   R_ARM_ABS32                 = 0x02
668   R_ARM_REL32                 = 0x03
669   R_ARM_LDR_PC_G0             = 0x04
670   R_ARM_ABS16                 = 0x05
671   R_ARM_ABS12                 = 0x06
672   R_ARM_THM_ABS5              = 0x07
673   R_ARM_ABS8                  = 0x08
674   R_ARM_SBREL32               = 0x09
675   R_ARM_THM_CALL              = 0x0a
676   R_ARM_THM_PC8               = 0x0b
677   R_ARM_BREL_ADJ              = 0x0c
678   R_ARM_TLS_DESC              = 0x0d
679   R_ARM_THM_SWI8              = 0x0e
680   R_ARM_XPC25                 = 0x0f
681   R_ARM_THM_XPC22             = 0x10
682   R_ARM_TLS_DTPMOD32          = 0x11
683   R_ARM_TLS_DTPOFF32          = 0x12
684   R_ARM_TLS_TPOFF32           = 0x13
685   R_ARM_COPY                  = 0x14
686   R_ARM_GLOB_DAT              = 0x15
687   R_ARM_JUMP_SLOT             = 0x16
688   R_ARM_RELATIVE              = 0x17
689   R_ARM_GOTOFF32              = 0x18
690   R_ARM_BASE_PREL             = 0x19
691   R_ARM_GOT_BREL              = 0x1a
692   R_ARM_PLT32                 = 0x1b
693   R_ARM_CALL                  = 0x1c
694   R_ARM_JUMP24                = 0x1d
695   R_ARM_THM_JUMP24            = 0x1e
696   R_ARM_BASE_ABS              = 0x1f
697   R_ARM_ALU_PCREL_7_0         = 0x20
698   R_ARM_ALU_PCREL_15_8        = 0x21
699   R_ARM_ALU_PCREL_23_15       = 0x22
700   R_ARM_LDR_SBREL_11_0_NC     = 0x23
701   R_ARM_ALU_SBREL_19_12_NC    = 0x24
702   R_ARM_ALU_SBREL_27_20_CK    = 0x25
703   R_ARM_TARGET1               = 0x26
704   R_ARM_SBREL31               = 0x27
705   R_ARM_V4BX                  = 0x28
706   R_ARM_TARGET2               = 0x29
707   R_ARM_PREL31                = 0x2a
708   R_ARM_MOVW_ABS_NC           = 0x2b
709   R_ARM_MOVT_ABS              = 0x2c
710   R_ARM_MOVW_PREL_NC          = 0x2d
711   R_ARM_MOVT_PREL             = 0x2e
712   R_ARM_THM_MOVW_ABS_NC       = 0x2f
713   R_ARM_THM_MOVT_ABS          = 0x30
714   R_ARM_THM_MOVW_PREL_NC      = 0x31
715   R_ARM_THM_MOVT_PREL         = 0x32
716   R_ARM_THM_JUMP19            = 0x33
717   R_ARM_THM_JUMP6             = 0x34
718   R_ARM_THM_ALU_PREL_11_0     = 0x35
719   R_ARM_THM_PC12              = 0x36
720   R_ARM_ABS32_NOI             = 0x37
721   R_ARM_REL32_NOI             = 0x38
722   R_ARM_ALU_PC_G0_NC          = 0x39
723   R_ARM_ALU_PC_G0             = 0x3a
724   R_ARM_ALU_PC_G1_NC          = 0x3b
725   R_ARM_ALU_PC_G1             = 0x3c
726   R_ARM_ALU_PC_G2             = 0x3d
727   R_ARM_LDR_PC_G1             = 0x3e
728   R_ARM_LDR_PC_G2             = 0x3f
729   R_ARM_LDRS_PC_G0            = 0x40
730   R_ARM_LDRS_PC_G1            = 0x41
731   R_ARM_LDRS_PC_G2            = 0x42
732   R_ARM_LDC_PC_G0             = 0x43
733   R_ARM_LDC_PC_G1             = 0x44
734   R_ARM_LDC_PC_G2             = 0x45
735   R_ARM_ALU_SB_G0_NC          = 0x46
736   R_ARM_ALU_SB_G0             = 0x47
737   R_ARM_ALU_SB_G1_NC          = 0x48
738   R_ARM_ALU_SB_G1             = 0x49
739   R_ARM_ALU_SB_G2             = 0x4a
740   R_ARM_LDR_SB_G0             = 0x4b
741   R_ARM_LDR_SB_G1             = 0x4c
742   R_ARM_LDR_SB_G2             = 0x4d
743   R_ARM_LDRS_SB_G0            = 0x4e
744   R_ARM_LDRS_SB_G1            = 0x4f
745   R_ARM_LDRS_SB_G2            = 0x50
746   R_ARM_LDC_SB_G0             = 0x51
747   R_ARM_LDC_SB_G1             = 0x52
748   R_ARM_LDC_SB_G2             = 0x53
749   R_ARM_MOVW_BREL_NC          = 0x54
750   R_ARM_MOVT_BREL             = 0x55
751   R_ARM_MOVW_BREL             = 0x56
752   R_ARM_THM_MOVW_BREL_NC      = 0x57
753   R_ARM_THM_MOVT_BREL         = 0x58
754   R_ARM_THM_MOVW_BREL         = 0x59
755   R_ARM_TLS_GOTDESC           = 0x5a
756   R_ARM_TLS_CALL              = 0x5b
757   R_ARM_TLS_DESCSEQ           = 0x5c
758   R_ARM_THM_TLS_CALL          = 0x5d
759   R_ARM_PLT32_ABS             = 0x5e
760   R_ARM_GOT_ABS               = 0x5f
761   R_ARM_GOT_PREL              = 0x60
762   R_ARM_GOT_BREL12            = 0x61
763   R_ARM_GOTOFF12              = 0x62
764   R_ARM_GOTRELAX              = 0x63
765   R_ARM_GNU_VTENTRY           = 0x64
766   R_ARM_GNU_VTINHERIT         = 0x65
767   R_ARM_THM_JUMP11            = 0x66
768   R_ARM_THM_JUMP8             = 0x67
769   R_ARM_TLS_GD32              = 0x68
770   R_ARM_TLS_LDM32             = 0x69
771   R_ARM_TLS_LDO32             = 0x6a
772   R_ARM_TLS_IE32              = 0x6b
773   R_ARM_TLS_LE32              = 0x6c
774   R_ARM_TLS_LDO12             = 0x6d
775   R_ARM_TLS_LE12              = 0x6e
776   R_ARM_TLS_IE12GP            = 0x6f
777   R_ARM_PRIVATE_0             = 0x70
778   R_ARM_PRIVATE_1             = 0x71
779   R_ARM_PRIVATE_2             = 0x72
780   R_ARM_PRIVATE_3             = 0x73
781   R_ARM_PRIVATE_4             = 0x74
782   R_ARM_PRIVATE_5             = 0x75
783   R_ARM_PRIVATE_6             = 0x76
784   R_ARM_PRIVATE_7             = 0x77
785   R_ARM_PRIVATE_8             = 0x78
786   R_ARM_PRIVATE_9             = 0x79
787   R_ARM_PRIVATE_10            = 0x7a
788   R_ARM_PRIVATE_11            = 0x7b
789   R_ARM_PRIVATE_12            = 0x7c
790   R_ARM_PRIVATE_13            = 0x7d
791   R_ARM_PRIVATE_14            = 0x7e
792   R_ARM_PRIVATE_15            = 0x7f
793   R_ARM_ME_TOO                = 0x80
794   R_ARM_THM_TLS_DESCSEQ16     = 0x81
795   R_ARM_THM_TLS_DESCSEQ32     = 0x82
796
797 class Relocs_Elf_Mips(Enum):
798   R_MIPS_NONE              =  0
799   R_MIPS_16                =  1
800   R_MIPS_32                =  2
801   R_MIPS_REL32             =  3
802   R_MIPS_26                =  4
803   R_MIPS_HI16              =  5
804   R_MIPS_LO16              =  6
805   R_MIPS_GPREL16           =  7
806   R_MIPS_LITERAL           =  8
807   R_MIPS_GOT16             =  9
808   R_MIPS_PC16              = 10
809   R_MIPS_CALL16            = 11
810   R_MIPS_GPREL32           = 12
811   R_MIPS_SHIFT5            = 16
812   R_MIPS_SHIFT6            = 17
813   R_MIPS_64                = 18
814   R_MIPS_GOT_DISP          = 19
815   R_MIPS_GOT_PAGE          = 20
816   R_MIPS_GOT_OFST          = 21
817   R_MIPS_GOT_HI16          = 22
818   R_MIPS_GOT_LO16          = 23
819   R_MIPS_SUB               = 24
820   R_MIPS_INSERT_A          = 25
821   R_MIPS_INSERT_B          = 26
822   R_MIPS_DELETE            = 27
823   R_MIPS_HIGHER            = 28
824   R_MIPS_HIGHEST           = 29
825   R_MIPS_CALL_HI16         = 30
826   R_MIPS_CALL_LO16         = 31
827   R_MIPS_SCN_DISP          = 32
828   R_MIPS_REL16             = 33
829   R_MIPS_ADD_IMMEDIATE     = 34
830   R_MIPS_PJUMP             = 35
831   R_MIPS_RELGOT            = 36
832   R_MIPS_JALR              = 37
833   R_MIPS_TLS_DTPMOD32      = 38
834   R_MIPS_TLS_DTPREL32      = 39
835   R_MIPS_TLS_DTPMOD64      = 40
836   R_MIPS_TLS_DTPREL64      = 41
837   R_MIPS_TLS_GD            = 42
838   R_MIPS_TLS_LDM           = 43
839   R_MIPS_TLS_DTPREL_HI16   = 44
840   R_MIPS_TLS_DTPREL_LO16   = 45
841   R_MIPS_TLS_GOTTPREL      = 46
842   R_MIPS_TLS_TPREL32       = 47
843   R_MIPS_TLS_TPREL64       = 48
844   R_MIPS_TLS_TPREL_HI16    = 49
845   R_MIPS_TLS_TPREL_LO16    = 50
846   R_MIPS_GLOB_DAT          = 51
847   R_MIPS_COPY              = 126
848   R_MIPS_JUMP_SLOT         = 127
849   R_MIPS_NUM               = 218
850
851 class Relocs_Elf_Hexagon(Enum):
852   R_HEX_NONE              =  0
853   R_HEX_B22_PCREL         =  1
854   R_HEX_B15_PCREL         =  2
855   R_HEX_B7_PCREL          =  3
856   R_HEX_LO16              =  4
857   R_HEX_HI16              =  5
858   R_HEX_32                =  6
859   R_HEX_16                =  7
860   R_HEX_8                 =  8
861   R_HEX_GPREL16_0         =  9
862   R_HEX_GPREL16_1         =  10
863   R_HEX_GPREL16_2         =  11
864   R_HEX_GPREL16_3         =  12
865   R_HEX_HL16              =  13
866   R_HEX_B13_PCREL         =  14
867   R_HEX_B9_PCREL          =  15
868   R_HEX_B32_PCREL_X       =  16
869   R_HEX_32_6_X            =  17
870   R_HEX_B22_PCREL_X       =  18
871   R_HEX_B15_PCREL_X       =  19
872   R_HEX_B13_PCREL_X       =  20
873   R_HEX_B9_PCREL_X        =  21
874   R_HEX_B7_PCREL_X        =  22
875   R_HEX_16_X              =  23
876   R_HEX_12_X              =  24
877   R_HEX_11_X              =  25
878   R_HEX_10_X              =  26
879   R_HEX_9_X               =  27
880   R_HEX_8_X               =  28
881   R_HEX_7_X               =  29
882   R_HEX_6_X               =  30
883   R_HEX_32_PCREL          =  31
884   R_HEX_COPY              =  32
885   R_HEX_GLOB_DAT          =  33
886   R_HEX_JMP_SLOT          =  34
887   R_HEX_RELATIVE          =  35
888   R_HEX_PLT_B22_PCREL     =  36
889   R_HEX_GOTREL_LO16       =  37
890   R_HEX_GOTREL_HI16       =  38
891   R_HEX_GOTREL_32         =  39
892   R_HEX_GOT_LO16          =  40
893   R_HEX_GOT_HI16          =  41
894   R_HEX_GOT_32            =  42
895   R_HEX_GOT_16            =  43
896   R_HEX_DTPMOD_32         =  44
897   R_HEX_DTPREL_LO16       =  45
898   R_HEX_DTPREL_HI16       =  46
899   R_HEX_DTPREL_32         =  47
900   R_HEX_DTPREL_16         =  48
901   R_HEX_GD_PLT_B22_PCREL  =  49
902   R_HEX_GD_GOT_LO16       =  50
903   R_HEX_GD_GOT_HI16       =  51
904   R_HEX_GD_GOT_32         =  52
905   R_HEX_GD_GOT_16         =  53
906   R_HEX_IE_LO16           =  54
907   R_HEX_IE_HI16           =  55
908   R_HEX_IE_32             =  56
909   R_HEX_IE_GOT_LO16       =  57
910   R_HEX_IE_GOT_HI16       =  58
911   R_HEX_IE_GOT_32         =  59
912   R_HEX_IE_GOT_16         =  60
913   R_HEX_TPREL_LO16        =  61
914   R_HEX_TPREL_HI16        =  62
915   R_HEX_TPREL_32          =  63
916   R_HEX_TPREL_16          =  64
917   R_HEX_6_PCREL_X         =  65
918   R_HEX_GOTREL_32_6_X     =  66
919   R_HEX_GOTREL_16_X       =  67
920   R_HEX_GOTREL_11_X       =  68
921   R_HEX_GOT_32_6_X        =  69
922   R_HEX_GOT_16_X          =  70
923   R_HEX_GOT_11_X          =  71
924   R_HEX_DTPREL_32_6_X     =  72
925   R_HEX_DTPREL_16_X       =  73
926   R_HEX_DTPREL_11_X       =  74
927   R_HEX_GD_GOT_32_6_X     =  75
928   R_HEX_GD_GOT_16_X       =  76
929   R_HEX_GD_GOT_11_X       =  77
930   R_HEX_IE_32_6_X         =  78
931   R_HEX_IE_16_X           =  79
932   R_HEX_IE_GOT_32_6_X     =  80
933   R_HEX_IE_GOT_16_X       =  81
934   R_HEX_IE_GOT_11_X       =  82
935   R_HEX_TPREL_32_6_X      =  83
936   R_HEX_TPREL_16_X        =  84
937   R_HEX_TPREL_11_X        =  85
938
939
940 class Relocs_Coff_i386(Enum):
941   IMAGE_REL_I386_ABSOLUTE = 0x0000
942   IMAGE_REL_I386_DIR16    = 0x0001
943   IMAGE_REL_I386_REL16    = 0x0002
944   IMAGE_REL_I386_DIR32    = 0x0006
945   IMAGE_REL_I386_DIR32NB  = 0x0007
946   IMAGE_REL_I386_SEG12    = 0x0009
947   IMAGE_REL_I386_SECTION  = 0x000A
948   IMAGE_REL_I386_SECREL   = 0x000B
949   IMAGE_REL_I386_TOKEN    = 0x000C
950   IMAGE_REL_I386_SECREL7  = 0x000D
951   IMAGE_REL_I386_REL32    = 0x0014
952
953 class Relocs_Coff_X86_64(Enum):
954   IMAGE_REL_AMD64_ABSOLUTE  = 0x0000
955   IMAGE_REL_AMD64_ADDR64    = 0x0001
956   IMAGE_REL_AMD64_ADDR32    = 0x0002
957   IMAGE_REL_AMD64_ADDR32NB  = 0x0003
958   IMAGE_REL_AMD64_REL32     = 0x0004
959   IMAGE_REL_AMD64_REL32_1   = 0x0005
960   IMAGE_REL_AMD64_REL32_2   = 0x0006
961   IMAGE_REL_AMD64_REL32_3   = 0x0007
962   IMAGE_REL_AMD64_REL32_4   = 0x0008
963   IMAGE_REL_AMD64_REL32_5   = 0x0009
964   IMAGE_REL_AMD64_SECTION   = 0x000A
965   IMAGE_REL_AMD64_SECREL    = 0x000B
966   IMAGE_REL_AMD64_SECREL7   = 0x000C
967   IMAGE_REL_AMD64_TOKEN     = 0x000D
968   IMAGE_REL_AMD64_SREL32    = 0x000E
969   IMAGE_REL_AMD64_PAIR      = 0x000F
970   IMAGE_REL_AMD64_SSPAN32   = 0x0010
971
972 class Relocs_Coff_ARM(Enum):
973   IMAGE_REL_ARM_ABSOLUTE  = 0x0000
974   IMAGE_REL_ARM_ADDR32    = 0x0001
975   IMAGE_REL_ARM_ADDR32NB  = 0x0002
976   IMAGE_REL_ARM_BRANCH24  = 0x0003
977   IMAGE_REL_ARM_BRANCH11  = 0x0004
978   IMAGE_REL_ARM_TOKEN     = 0x0005
979   IMAGE_REL_ARM_BLX24     = 0x0008
980   IMAGE_REL_ARM_BLX11     = 0x0009
981   IMAGE_REL_ARM_SECTION   = 0x000E
982   IMAGE_REL_ARM_SECREL    = 0x000F
983   IMAGE_REL_ARM_MOV32A    = 0x0010
984   IMAGE_REL_ARM_MOV32T    = 0x0011
985   IMAGE_REL_ARM_BRANCH20T = 0x0012
986   IMAGE_REL_ARM_BRANCH24T = 0x0014
987   IMAGE_REL_ARM_BLX23T    = 0x0015
988
989
990 class Relocs_Macho_i386(Enum):
991   RIT_Vanilla                     = 0
992   RIT_Pair                        = 1
993   RIT_Difference                  = 2
994   RIT_Generic_PreboundLazyPointer = 3
995   RIT_Generic_LocalDifference     = 4
996   RIT_Generic_TLV                 = 5
997
998 class Relocs_Macho_X86_64(Enum):
999   RIT_X86_64_Unsigned   = 0
1000   RIT_X86_64_Signed     = 1
1001   RIT_X86_64_Branch     = 2
1002   RIT_X86_64_GOTLoad    = 3
1003   RIT_X86_64_GOT        = 4
1004   RIT_X86_64_Subtractor = 5
1005   RIT_X86_64_Signed1    = 6
1006   RIT_X86_64_Signed2    = 7
1007   RIT_X86_64_Signed4    = 8
1008   RIT_X86_64_TLV        = 9
1009
1010 class Relocs_Macho_ARM(Enum):
1011   RIT_Vanilla                     = 0
1012   RIT_Pair                        = 1
1013   RIT_Difference                  = 2
1014   RIT_ARM_LocalDifference         = 3
1015   RIT_ARM_PreboundLazyPointer     = 4
1016   RIT_ARM_Branch24Bit             = 5
1017   RIT_ARM_ThumbBranch22Bit        = 6
1018   RIT_ARM_ThumbBranch32Bit        = 7
1019   RIT_ARM_Half                    = 8
1020   RIT_ARM_HalfDifference          = 9
1021
1022 class Relocs_Macho_PPC(Enum):
1023   PPC_RELOC_VANILLA        = 0
1024   PPC_RELOC_PAIR           = 1
1025   PPC_RELOC_BR14           = 2
1026   PPC_RELOC_BR24           = 3
1027   PPC_RELOC_HI16           = 4
1028   PPC_RELOC_LO16           = 5
1029   PPC_RELOC_HA16           = 6
1030   PPC_RELOC_LO14           = 7
1031   PPC_RELOC_SECTDIFF       = 8
1032   PPC_RELOC_PB_LA_PTR      = 9
1033   PPC_RELOC_HI16_SECTDIFF  = 10
1034   PPC_RELOC_LO16_SECTDIFF  = 11
1035   PPC_RELOC_HA16_SECTDIFF  = 12
1036   PPC_RELOC_JBSR           = 13
1037   PPC_RELOC_LO14_SECTDIFF  = 14
1038   PPC_RELOC_LOCAL_SECTDIFF = 15
1039
1040
1041 craftElf("relocs.obj.elf-x86_64",   "x86_64-pc-linux-gnu",         Relocs_Elf_X86_64.entries(), "leaq sym@GOTTPOFF(%rip), %rax")
1042 craftElf("relocs.obj.elf-i386",     "i386-pc-linux-gnu",           Relocs_Elf_i386.entries(),   "mov sym@GOTOFF(%ebx), %eax")
1043 #craftElf("relocs-elf-ppc32",   "powerpc-unknown-linux-gnu",   Relocs_Elf_PPC32.entries(), ...)
1044 craftElf("relocs.obj.elf-ppc64",   "powerpc64-unknown-linux-gnu", Relocs_Elf_PPC64.entries(),
1045          ("@t = thread_local global i32 0, align 4", "define i32* @f{0}() nounwind {{ ret i32* @t }}", 2))
1046 craftElf("relocs.obj.elf-aarch64",  "aarch64",                     Relocs_Elf_AArch64.entries(), "movz x0, #:abs_g0:sym")
1047 craftElf("relocs.obj.elf-arm",      "arm-unknown-unknown",         Relocs_Elf_ARM.entries(), "b sym")
1048 craftElf("relocs.obj.elf-mips",     "mips-unknown-linux",          Relocs_Elf_Mips.entries(), "lui $2, %hi(sym)")
1049 craftElf("relocs.obj.elf-mips64el", "mips64el-unknown-linux",        Relocs_Elf_Mips.entries(), "lui $2, %hi(sym)")
1050 #craftElf("relocs.obj.elf-hexagon",  "hexagon-unknown-unknown",     Relocs_Elf_Hexagon.entries(), ...)
1051
1052 craftCoff("relocs.obj.coff-i386",   "i386-pc-win32",   Relocs_Coff_i386.entries(),   "mov foo@imgrel(%ebx, %ecx, 4), %eax")
1053 craftCoff("relocs.obj.coff-x86_64", "x86_64-pc-win32", Relocs_Coff_X86_64.entries(), "mov foo@imgrel(%ebx, %ecx, 4), %eax")
1054 #craftCoff("relocs.obj.coff-arm",    "arm-pc-win32",    Relocs_Coff_ARM.entries(), "...")
1055
1056 craftMacho("relocs.obj.macho-i386",   "i386-apple-darwin9", Relocs_Macho_i386.entries(),
1057           ("asm", ".subsections_via_symbols; .text; a: ; b:", "call a", 1))
1058 craftMacho("relocs.obj.macho-x86_64", "x86_64-apple-darwin9", Relocs_Macho_X86_64.entries(),
1059           ("asm", ".subsections_via_symbols; .text; a: ; b:", "call a", 1))
1060 craftMacho("relocs.obj.macho-arm",    "armv7-apple-darwin10", Relocs_Macho_ARM.entries(), "bl sym")
1061 #craftMacho("relocs.obj.macho-ppc",   "powerpc-apple-darwin10", Relocs_Macho_PPC.entries(), ...)