assert(0) -> LLVM_UNREACHABLE.
[oota-llvm.git] / lib / CodeGen / MachOWriter.cpp
1 //===-- MachOWriter.cpp - Target-independent Mach-O Writer code -----------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the target-independent Mach-O writer.  This file writes
11 // out the Mach-O file in the following order:
12 //
13 //  #1 FatHeader (universal-only)
14 //  #2 FatArch (universal-only, 1 per universal arch)
15 //  Per arch:
16 //    #3 Header
17 //    #4 Load Commands
18 //    #5 Sections
19 //    #6 Relocations
20 //    #7 Symbols
21 //    #8 Strings
22 //
23 //===----------------------------------------------------------------------===//
24
25 #include "MachO.h"
26 #include "MachOWriter.h"
27 #include "MachOCodeEmitter.h"
28 #include "llvm/Constants.h"
29 #include "llvm/DerivedTypes.h"
30 #include "llvm/Module.h"
31 #include "llvm/PassManager.h"
32 #include "llvm/Target/TargetAsmInfo.h"
33 #include "llvm/Target/TargetData.h"
34 #include "llvm/Target/TargetMachine.h"
35 #include "llvm/Target/TargetMachOWriterInfo.h"
36 #include "llvm/Support/Mangler.h"
37 #include "llvm/Support/OutputBuffer.h"
38 #include "llvm/Support/ErrorHandling.h"
39 #include "llvm/Support/raw_ostream.h"
40
41 namespace llvm {
42
43 /// AddMachOWriter - Concrete function to add the Mach-O writer to the function
44 /// pass manager.
45 ObjectCodeEmitter *AddMachOWriter(PassManagerBase &PM,
46                                          raw_ostream &O,
47                                          TargetMachine &TM) {
48   MachOWriter *MOW = new MachOWriter(O, TM);
49   PM.add(MOW);
50   return MOW->getObjectCodeEmitter();
51 }
52
53 //===----------------------------------------------------------------------===//
54 //                          MachOWriter Implementation
55 //===----------------------------------------------------------------------===//
56
57 char MachOWriter::ID = 0;
58
59 MachOWriter::MachOWriter(raw_ostream &o, TargetMachine &tm)
60   : MachineFunctionPass(&ID), O(o), TM(tm) {
61   is64Bit = TM.getTargetData()->getPointerSizeInBits() == 64;
62   isLittleEndian = TM.getTargetData()->isLittleEndian();
63
64   TAI = TM.getTargetAsmInfo();
65
66   // Create the machine code emitter object for this target.
67   MachOCE = new MachOCodeEmitter(*this, *getTextSection(true));
68 }
69
70 MachOWriter::~MachOWriter() {
71   delete MachOCE;
72 }
73
74 bool MachOWriter::doInitialization(Module &M) {
75   // Set the magic value, now that we know the pointer size and endianness
76   Header.setMagic(isLittleEndian, is64Bit);
77
78   // Set the file type
79   // FIXME: this only works for object files, we do not support the creation
80   //        of dynamic libraries or executables at this time.
81   Header.filetype = MachOHeader::MH_OBJECT;
82
83   Mang = new Mangler(M);
84   return false;
85 }
86
87 bool MachOWriter::runOnMachineFunction(MachineFunction &MF) {
88   return false;
89 }
90
91 /// doFinalization - Now that the module has been completely processed, emit
92 /// the Mach-O file to 'O'.
93 bool MachOWriter::doFinalization(Module &M) {
94   // FIXME: we don't handle debug info yet, we should probably do that.
95   // Okay, the.text section has been completed, build the .data, .bss, and
96   // "common" sections next.
97
98   for (Module::global_iterator I = M.global_begin(), E = M.global_end();
99        I != E; ++I)
100     EmitGlobal(I);
101
102   // Emit the header and load commands.
103   EmitHeaderAndLoadCommands();
104
105   // Emit the various sections and their relocation info.
106   EmitSections();
107   EmitRelocations();
108
109   // Write the symbol table and the string table to the end of the file.
110   O.write((char*)&SymT[0], SymT.size());
111   O.write((char*)&StrT[0], StrT.size());
112
113   // We are done with the abstract symbols.
114   SectionList.clear();
115   SymbolTable.clear();
116   DynamicSymbolTable.clear();
117
118   // Release the name mangler object.
119   delete Mang; Mang = 0;
120   return false;
121 }
122
123 // getConstSection - Get constant section for Constant 'C'
124 MachOSection *MachOWriter::getConstSection(Constant *C) {
125   const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
126   if (CVA && CVA->isCString())
127     return getSection("__TEXT", "__cstring", 
128                       MachOSection::S_CSTRING_LITERALS);
129
130   const Type *Ty = C->getType();
131   if (Ty->isPrimitiveType() || Ty->isInteger()) {
132     unsigned Size = TM.getTargetData()->getTypeAllocSize(Ty);
133     switch(Size) {
134     default: break; // Fall through to __TEXT,__const
135     case 4:
136       return getSection("__TEXT", "__literal4",
137                         MachOSection::S_4BYTE_LITERALS);
138     case 8:
139       return getSection("__TEXT", "__literal8",
140                         MachOSection::S_8BYTE_LITERALS);
141     case 16:
142       return getSection("__TEXT", "__literal16",
143                         MachOSection::S_16BYTE_LITERALS);
144     }
145   }
146   return getSection("__TEXT", "__const");
147 }
148
149 // getJumpTableSection - Select the Jump Table section
150 MachOSection *MachOWriter::getJumpTableSection() {
151   if (TM.getRelocationModel() == Reloc::PIC_)
152     return getTextSection(false);
153   else
154     return getSection("__TEXT", "__const");
155 }
156
157 // getSection - Return the section with the specified name, creating a new
158 // section if one does not already exist.
159 MachOSection *MachOWriter::getSection(const std::string &seg,
160                                       const std::string &sect,
161                                       unsigned Flags /* = 0 */ ) {
162   MachOSection *MOS = SectionLookup[seg+sect];
163   if (MOS) return MOS;
164
165   MOS = new MachOSection(seg, sect);
166   SectionList.push_back(MOS);
167   MOS->Index = SectionList.size();
168   MOS->flags = MachOSection::S_REGULAR | Flags;
169   SectionLookup[seg+sect] = MOS;
170   return MOS;
171 }
172
173 // getTextSection - Return text section with different flags for code/data
174 MachOSection *MachOWriter::getTextSection(bool isCode /* = true */ ) {
175   if (isCode)
176     return getSection("__TEXT", "__text",
177                       MachOSection::S_ATTR_PURE_INSTRUCTIONS |
178                       MachOSection::S_ATTR_SOME_INSTRUCTIONS);
179   else
180     return getSection("__TEXT", "__text");
181 }
182
183 MachOSection *MachOWriter::getBSSSection() {
184   return getSection("__DATA", "__bss", MachOSection::S_ZEROFILL);
185 }
186
187 // GetJTRelocation - Get a relocation a new BB relocation based
188 // on target information.
189 MachineRelocation MachOWriter::GetJTRelocation(unsigned Offset,
190                                                MachineBasicBlock *MBB) const {
191   return TM.getMachOWriterInfo()->GetJTRelocation(Offset, MBB);
192 }
193
194 // GetTargetRelocation - Returns the number of relocations.
195 unsigned MachOWriter::GetTargetRelocation(MachineRelocation &MR,
196                              unsigned FromIdx, unsigned ToAddr,
197                              unsigned ToIndex, OutputBuffer &RelocOut,
198                              OutputBuffer &SecOut, bool Scattered,
199                              bool Extern) {
200   return TM.getMachOWriterInfo()->GetTargetRelocation(MR, FromIdx, ToAddr,
201                                                       ToIndex, RelocOut,
202                                                       SecOut, Scattered,
203                                                       Extern);
204 }
205
206 void MachOWriter::AddSymbolToSection(MachOSection *Sec, GlobalVariable *GV) {
207   const Type *Ty = GV->getType()->getElementType();
208   unsigned Size = TM.getTargetData()->getTypeAllocSize(Ty);
209   unsigned Align = TM.getTargetData()->getPreferredAlignment(GV);
210
211   // Reserve space in the .bss section for this symbol while maintaining the
212   // desired section alignment, which must be at least as much as required by
213   // this symbol.
214   OutputBuffer SecDataOut(Sec->getData(), is64Bit, isLittleEndian);
215
216   if (Align) {
217     Align = Log2_32(Align);
218     Sec->align = std::max(unsigned(Sec->align), Align);
219
220     Sec->emitAlignment(Sec->align);
221   }
222   // Globals without external linkage apparently do not go in the symbol table.
223   if (!GV->hasLocalLinkage()) {
224     MachOSym Sym(GV, Mang->getValueName(GV), Sec->Index, TAI);
225     Sym.n_value = Sec->size();
226     SymbolTable.push_back(Sym);
227   }
228
229   // Record the offset of the symbol, and then allocate space for it.
230   // FIXME: remove when we have unified size + output buffer
231
232   // Now that we know what section the GlovalVariable is going to be emitted
233   // into, update our mappings.
234   // FIXME: We may also need to update this when outputting non-GlobalVariable
235   // GlobalValues such as functions.
236
237   GVSection[GV] = Sec;
238   GVOffset[GV] = Sec->size();
239
240   // Allocate space in the section for the global.
241   for (unsigned i = 0; i < Size; ++i)
242     SecDataOut.outbyte(0);
243 }
244
245 void MachOWriter::EmitGlobal(GlobalVariable *GV) {
246   const Type *Ty = GV->getType()->getElementType();
247   unsigned Size = TM.getTargetData()->getTypeAllocSize(Ty);
248   bool NoInit = !GV->hasInitializer();
249
250   // If this global has a zero initializer, it is part of the .bss or common
251   // section.
252   if (NoInit || GV->getInitializer()->isNullValue()) {
253     // If this global is part of the common block, add it now.  Variables are
254     // part of the common block if they are zero initialized and allowed to be
255     // merged with other symbols.
256     if (NoInit || GV->hasLinkOnceLinkage() || GV->hasWeakLinkage() ||
257         GV->hasCommonLinkage()) {
258       MachOSym ExtOrCommonSym(GV, Mang->getValueName(GV),
259                               MachOSym::NO_SECT, TAI);
260       // For undefined (N_UNDF) external (N_EXT) types, n_value is the size in
261       // bytes of the symbol.
262       ExtOrCommonSym.n_value = Size;
263       SymbolTable.push_back(ExtOrCommonSym);
264       // Remember that we've seen this symbol
265       GVOffset[GV] = Size;
266       return;
267     }
268     // Otherwise, this symbol is part of the .bss section.
269     MachOSection *BSS = getBSSSection();
270     AddSymbolToSection(BSS, GV);
271     return;
272   }
273
274   // Scalar read-only data goes in a literal section if the scalar is 4, 8, or
275   // 16 bytes, or a cstring.  Other read only data goes into a regular const
276   // section.  Read-write data goes in the data section.
277   MachOSection *Sec = GV->isConstant() ? getConstSection(GV->getInitializer()) :
278                                          getDataSection();
279   AddSymbolToSection(Sec, GV);
280   InitMem(GV->getInitializer(), GVOffset[GV], TM.getTargetData(), Sec);
281 }
282
283
284
285 void MachOWriter::EmitHeaderAndLoadCommands() {
286   // Step #0: Fill in the segment load command size, since we need it to figure
287   //          out the rest of the header fields
288
289   MachOSegment SEG("", is64Bit);
290   SEG.nsects  = SectionList.size();
291   SEG.cmdsize = SEG.cmdSize(is64Bit) +
292                 SEG.nsects * SectionList[0]->cmdSize(is64Bit);
293
294   // Step #1: calculate the number of load commands.  We always have at least
295   //          one, for the LC_SEGMENT load command, plus two for the normal
296   //          and dynamic symbol tables, if there are any symbols.
297   Header.ncmds = SymbolTable.empty() ? 1 : 3;
298
299   // Step #2: calculate the size of the load commands
300   Header.sizeofcmds = SEG.cmdsize;
301   if (!SymbolTable.empty())
302     Header.sizeofcmds += SymTab.cmdsize + DySymTab.cmdsize;
303
304   // Step #3: write the header to the file
305   // Local alias to shortenify coming code.
306   std::vector<unsigned char> &FH = Header.HeaderData;
307   OutputBuffer FHOut(FH, is64Bit, isLittleEndian);
308
309   FHOut.outword(Header.magic);
310   FHOut.outword(TM.getMachOWriterInfo()->getCPUType());
311   FHOut.outword(TM.getMachOWriterInfo()->getCPUSubType());
312   FHOut.outword(Header.filetype);
313   FHOut.outword(Header.ncmds);
314   FHOut.outword(Header.sizeofcmds);
315   FHOut.outword(Header.flags);
316   if (is64Bit)
317     FHOut.outword(Header.reserved);
318
319   // Step #4: Finish filling in the segment load command and write it out
320   for (std::vector<MachOSection*>::iterator I = SectionList.begin(),
321          E = SectionList.end(); I != E; ++I)
322     SEG.filesize += (*I)->size();
323
324   SEG.vmsize = SEG.filesize;
325   SEG.fileoff = Header.cmdSize(is64Bit) + Header.sizeofcmds;
326
327   FHOut.outword(SEG.cmd);
328   FHOut.outword(SEG.cmdsize);
329   FHOut.outstring(SEG.segname, 16);
330   FHOut.outaddr(SEG.vmaddr);
331   FHOut.outaddr(SEG.vmsize);
332   FHOut.outaddr(SEG.fileoff);
333   FHOut.outaddr(SEG.filesize);
334   FHOut.outword(SEG.maxprot);
335   FHOut.outword(SEG.initprot);
336   FHOut.outword(SEG.nsects);
337   FHOut.outword(SEG.flags);
338
339   // Step #5: Finish filling in the fields of the MachOSections
340   uint64_t currentAddr = 0;
341   for (std::vector<MachOSection*>::iterator I = SectionList.begin(),
342          E = SectionList.end(); I != E; ++I) {
343     MachOSection *MOS = *I;
344     MOS->addr = currentAddr;
345     MOS->offset = currentAddr + SEG.fileoff;
346     // FIXME: do we need to do something with alignment here?
347     currentAddr += MOS->size();
348   }
349
350   // Step #6: Emit the symbol table to temporary buffers, so that we know the
351   // size of the string table when we write the next load command.  This also
352   // sorts and assigns indices to each of the symbols, which is necessary for
353   // emitting relocations to externally-defined objects.
354   BufferSymbolAndStringTable();
355
356   // Step #7: Calculate the number of relocations for each section and write out
357   // the section commands for each section
358   currentAddr += SEG.fileoff;
359   for (std::vector<MachOSection*>::iterator I = SectionList.begin(),
360          E = SectionList.end(); I != E; ++I) {
361     MachOSection *MOS = *I;
362
363     // Convert the relocations to target-specific relocations, and fill in the
364     // relocation offset for this section.
365     CalculateRelocations(*MOS);
366     MOS->reloff = MOS->nreloc ? currentAddr : 0;
367     currentAddr += MOS->nreloc * 8;
368
369     // write the finalized section command to the output buffer
370     FHOut.outstring(MOS->sectname, 16);
371     FHOut.outstring(MOS->segname, 16);
372     FHOut.outaddr(MOS->addr);
373     FHOut.outaddr(MOS->size());
374     FHOut.outword(MOS->offset);
375     FHOut.outword(MOS->align);
376     FHOut.outword(MOS->reloff);
377     FHOut.outword(MOS->nreloc);
378     FHOut.outword(MOS->flags);
379     FHOut.outword(MOS->reserved1);
380     FHOut.outword(MOS->reserved2);
381     if (is64Bit)
382       FHOut.outword(MOS->reserved3);
383   }
384
385   // Step #8: Emit LC_SYMTAB/LC_DYSYMTAB load commands
386   SymTab.symoff  = currentAddr;
387   SymTab.nsyms   = SymbolTable.size();
388   SymTab.stroff  = SymTab.symoff + SymT.size();
389   SymTab.strsize = StrT.size();
390   FHOut.outword(SymTab.cmd);
391   FHOut.outword(SymTab.cmdsize);
392   FHOut.outword(SymTab.symoff);
393   FHOut.outword(SymTab.nsyms);
394   FHOut.outword(SymTab.stroff);
395   FHOut.outword(SymTab.strsize);
396
397   // FIXME: set DySymTab fields appropriately
398   // We should probably just update these in BufferSymbolAndStringTable since
399   // thats where we're partitioning up the different kinds of symbols.
400   FHOut.outword(DySymTab.cmd);
401   FHOut.outword(DySymTab.cmdsize);
402   FHOut.outword(DySymTab.ilocalsym);
403   FHOut.outword(DySymTab.nlocalsym);
404   FHOut.outword(DySymTab.iextdefsym);
405   FHOut.outword(DySymTab.nextdefsym);
406   FHOut.outword(DySymTab.iundefsym);
407   FHOut.outword(DySymTab.nundefsym);
408   FHOut.outword(DySymTab.tocoff);
409   FHOut.outword(DySymTab.ntoc);
410   FHOut.outword(DySymTab.modtaboff);
411   FHOut.outword(DySymTab.nmodtab);
412   FHOut.outword(DySymTab.extrefsymoff);
413   FHOut.outword(DySymTab.nextrefsyms);
414   FHOut.outword(DySymTab.indirectsymoff);
415   FHOut.outword(DySymTab.nindirectsyms);
416   FHOut.outword(DySymTab.extreloff);
417   FHOut.outword(DySymTab.nextrel);
418   FHOut.outword(DySymTab.locreloff);
419   FHOut.outword(DySymTab.nlocrel);
420
421   O.write((char*)&FH[0], FH.size());
422 }
423
424 /// EmitSections - Now that we have constructed the file header and load
425 /// commands, emit the data for each section to the file.
426 void MachOWriter::EmitSections() {
427   for (std::vector<MachOSection*>::iterator I = SectionList.begin(),
428          E = SectionList.end(); I != E; ++I)
429     // Emit the contents of each section
430     if ((*I)->size())
431       O.write((char*)&(*I)->getData()[0], (*I)->size());
432 }
433
434 /// EmitRelocations - emit relocation data from buffer.
435 void MachOWriter::EmitRelocations() {
436   for (std::vector<MachOSection*>::iterator I = SectionList.begin(),
437          E = SectionList.end(); I != E; ++I)
438     // Emit the relocation entry data for each section.
439     if ((*I)->RelocBuffer.size())
440       O.write((char*)&(*I)->RelocBuffer[0], (*I)->RelocBuffer.size());
441 }
442
443 /// BufferSymbolAndStringTable - Sort the symbols we encountered and assign them
444 /// each a string table index so that they appear in the correct order in the
445 /// output file.
446 void MachOWriter::BufferSymbolAndStringTable() {
447   // The order of the symbol table is:
448   // 1. local symbols
449   // 2. defined external symbols (sorted by name)
450   // 3. undefined external symbols (sorted by name)
451
452   // Before sorting the symbols, check the PendingGlobals for any undefined
453   // globals that need to be put in the symbol table.
454   for (std::vector<GlobalValue*>::iterator I = PendingGlobals.begin(),
455          E = PendingGlobals.end(); I != E; ++I) {
456     if (GVOffset[*I] == 0 && GVSection[*I] == 0) {
457       MachOSym UndfSym(*I, Mang->getValueName(*I), MachOSym::NO_SECT, TAI);
458       SymbolTable.push_back(UndfSym);
459       GVOffset[*I] = -1;
460     }
461   }
462
463   // Sort the symbols by name, so that when we partition the symbols by scope
464   // of definition, we won't have to sort by name within each partition.
465   std::sort(SymbolTable.begin(), SymbolTable.end(), MachOSym::SymCmp());
466
467   // Parition the symbol table entries so that all local symbols come before
468   // all symbols with external linkage. { 1 | 2 3 }
469   std::partition(SymbolTable.begin(), SymbolTable.end(),
470                  MachOSym::PartitionByLocal);
471
472   // Advance iterator to beginning of external symbols and partition so that
473   // all external symbols defined in this module come before all external
474   // symbols defined elsewhere. { 1 | 2 | 3 }
475   for (std::vector<MachOSym>::iterator I = SymbolTable.begin(),
476          E = SymbolTable.end(); I != E; ++I) {
477     if (!MachOSym::PartitionByLocal(*I)) {
478       std::partition(I, E, MachOSym::PartitionByDefined);
479       break;
480     }
481   }
482
483   // Calculate the starting index for each of the local, extern defined, and
484   // undefined symbols, as well as the number of each to put in the LC_DYSYMTAB
485   // load command.
486   for (std::vector<MachOSym>::iterator I = SymbolTable.begin(),
487          E = SymbolTable.end(); I != E; ++I) {
488     if (MachOSym::PartitionByLocal(*I)) {
489       ++DySymTab.nlocalsym;
490       ++DySymTab.iextdefsym;
491       ++DySymTab.iundefsym;
492     } else if (MachOSym::PartitionByDefined(*I)) {
493       ++DySymTab.nextdefsym;
494       ++DySymTab.iundefsym;
495     } else {
496       ++DySymTab.nundefsym;
497     }
498   }
499
500   // Write out a leading zero byte when emitting string table, for n_strx == 0
501   // which means an empty string.
502   OutputBuffer StrTOut(StrT, is64Bit, isLittleEndian);
503   StrTOut.outbyte(0);
504
505   // The order of the string table is:
506   // 1. strings for external symbols
507   // 2. strings for local symbols
508   // Since this is the opposite order from the symbol table, which we have just
509   // sorted, we can walk the symbol table backwards to output the string table.
510   for (std::vector<MachOSym>::reverse_iterator I = SymbolTable.rbegin(),
511         E = SymbolTable.rend(); I != E; ++I) {
512     if (I->GVName == "") {
513       I->n_strx = 0;
514     } else {
515       I->n_strx = StrT.size();
516       StrTOut.outstring(I->GVName, I->GVName.length()+1);
517     }
518   }
519
520   OutputBuffer SymTOut(SymT, is64Bit, isLittleEndian);
521
522   unsigned index = 0;
523   for (std::vector<MachOSym>::iterator I = SymbolTable.begin(),
524          E = SymbolTable.end(); I != E; ++I, ++index) {
525     // Add the section base address to the section offset in the n_value field
526     // to calculate the full address.
527     // FIXME: handle symbols where the n_value field is not the address
528     GlobalValue *GV = const_cast<GlobalValue*>(I->GV);
529     if (GV && GVSection[GV])
530       I->n_value += GVSection[GV]->addr;
531     if (GV && (GVOffset[GV] == -1))
532       GVOffset[GV] = index;
533
534     // Emit nlist to buffer
535     SymTOut.outword(I->n_strx);
536     SymTOut.outbyte(I->n_type);
537     SymTOut.outbyte(I->n_sect);
538     SymTOut.outhalf(I->n_desc);
539     SymTOut.outaddr(I->n_value);
540   }
541 }
542
543 /// CalculateRelocations - For each MachineRelocation in the current section,
544 /// calculate the index of the section containing the object to be relocated,
545 /// and the offset into that section.  From this information, create the
546 /// appropriate target-specific MachORelocation type and add buffer it to be
547 /// written out after we are finished writing out sections.
548 void MachOWriter::CalculateRelocations(MachOSection &MOS) {
549   std::vector<MachineRelocation> Relocations =  MOS.getRelocations();
550   for (unsigned i = 0, e = Relocations.size(); i != e; ++i) {
551     MachineRelocation &MR = Relocations[i];
552     unsigned TargetSection = MR.getConstantVal();
553     unsigned TargetAddr = 0;
554     unsigned TargetIndex = 0;
555
556     // This is a scattered relocation entry if it points to a global value with
557     // a non-zero offset.
558     bool Scattered = false;
559     bool Extern = false;
560
561     // Since we may not have seen the GlobalValue we were interested in yet at
562     // the time we emitted the relocation for it, fix it up now so that it
563     // points to the offset into the correct section.
564     if (MR.isGlobalValue()) {
565       GlobalValue *GV = MR.getGlobalValue();
566       MachOSection *MOSPtr = GVSection[GV];
567       intptr_t Offset = GVOffset[GV];
568
569       // If we have never seen the global before, it must be to a symbol
570       // defined in another module (N_UNDF).
571       if (!MOSPtr) {
572         // FIXME: need to append stub suffix
573         Extern = true;
574         TargetAddr = 0;
575         TargetIndex = GVOffset[GV];
576       } else {
577         Scattered = TargetSection != 0;
578         TargetSection = MOSPtr->Index;
579       }
580       MR.setResultPointer((void*)Offset);
581     }
582
583     // If the symbol is locally defined, pass in the address of the section and
584     // the section index to the code which will generate the target relocation.
585     if (!Extern) {
586         MachOSection &To = *SectionList[TargetSection - 1];
587         TargetAddr = To.addr;
588         TargetIndex = To.Index;
589     }
590
591     OutputBuffer RelocOut(MOS.RelocBuffer, is64Bit, isLittleEndian);
592     OutputBuffer SecOut(MOS.getData(), is64Bit, isLittleEndian);
593
594     MOS.nreloc += GetTargetRelocation(MR, MOS.Index, TargetAddr, TargetIndex,
595                                       RelocOut, SecOut, Scattered, Extern);
596   }
597 }
598
599 // InitMem - Write the value of a Constant to the specified memory location,
600 // converting it into bytes and relocations.
601 void MachOWriter::InitMem(const Constant *C, uintptr_t Offset,
602                           const TargetData *TD, MachOSection* mos) {
603   typedef std::pair<const Constant*, intptr_t> CPair;
604   std::vector<CPair> WorkList;
605   uint8_t *Addr = &mos->getData()[0];
606
607   WorkList.push_back(CPair(C,(intptr_t)Addr + Offset));
608
609   intptr_t ScatteredOffset = 0;
610
611   while (!WorkList.empty()) {
612     const Constant *PC = WorkList.back().first;
613     intptr_t PA = WorkList.back().second;
614     WorkList.pop_back();
615
616     if (isa<UndefValue>(PC)) {
617       continue;
618     } else if (const ConstantVector *CP = dyn_cast<ConstantVector>(PC)) {
619       unsigned ElementSize =
620         TD->getTypeAllocSize(CP->getType()->getElementType());
621       for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i)
622         WorkList.push_back(CPair(CP->getOperand(i), PA+i*ElementSize));
623     } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(PC)) {
624       //
625       // FIXME: Handle ConstantExpression.  See EE::getConstantValue()
626       //
627       switch (CE->getOpcode()) {
628       case Instruction::GetElementPtr: {
629         SmallVector<Value*, 8> Indices(CE->op_begin()+1, CE->op_end());
630         ScatteredOffset = TD->getIndexedOffset(CE->getOperand(0)->getType(),
631                                                &Indices[0], Indices.size());
632         WorkList.push_back(CPair(CE->getOperand(0), PA));
633         break;
634       }
635       case Instruction::Add:
636       default:
637         cerr << "ConstantExpr not handled as global var init: " << *CE << "\n";
638         llvm_unreachable();
639       }
640     } else if (PC->getType()->isSingleValueType()) {
641       unsigned char *ptr = (unsigned char *)PA;
642       switch (PC->getType()->getTypeID()) {
643       case Type::IntegerTyID: {
644         unsigned NumBits = cast<IntegerType>(PC->getType())->getBitWidth();
645         uint64_t val = cast<ConstantInt>(PC)->getZExtValue();
646         if (NumBits <= 8)
647           ptr[0] = val;
648         else if (NumBits <= 16) {
649           if (TD->isBigEndian())
650             val = ByteSwap_16(val);
651           ptr[0] = val;
652           ptr[1] = val >> 8;
653         } else if (NumBits <= 32) {
654           if (TD->isBigEndian())
655             val = ByteSwap_32(val);
656           ptr[0] = val;
657           ptr[1] = val >> 8;
658           ptr[2] = val >> 16;
659           ptr[3] = val >> 24;
660         } else if (NumBits <= 64) {
661           if (TD->isBigEndian())
662             val = ByteSwap_64(val);
663           ptr[0] = val;
664           ptr[1] = val >> 8;
665           ptr[2] = val >> 16;
666           ptr[3] = val >> 24;
667           ptr[4] = val >> 32;
668           ptr[5] = val >> 40;
669           ptr[6] = val >> 48;
670           ptr[7] = val >> 56;
671         } else {
672           LLVM_UNREACHABLE("Not implemented: bit widths > 64");
673         }
674         break;
675       }
676       case Type::FloatTyID: {
677         uint32_t val = cast<ConstantFP>(PC)->getValueAPF().bitcastToAPInt().
678                         getZExtValue();
679         if (TD->isBigEndian())
680           val = ByteSwap_32(val);
681         ptr[0] = val;
682         ptr[1] = val >> 8;
683         ptr[2] = val >> 16;
684         ptr[3] = val >> 24;
685         break;
686       }
687       case Type::DoubleTyID: {
688         uint64_t val = cast<ConstantFP>(PC)->getValueAPF().bitcastToAPInt().
689                          getZExtValue();
690         if (TD->isBigEndian())
691           val = ByteSwap_64(val);
692         ptr[0] = val;
693         ptr[1] = val >> 8;
694         ptr[2] = val >> 16;
695         ptr[3] = val >> 24;
696         ptr[4] = val >> 32;
697         ptr[5] = val >> 40;
698         ptr[6] = val >> 48;
699         ptr[7] = val >> 56;
700         break;
701       }
702       case Type::PointerTyID:
703         if (isa<ConstantPointerNull>(PC))
704           memset(ptr, 0, TD->getPointerSize());
705         else if (const GlobalValue* GV = dyn_cast<GlobalValue>(PC)) {
706           // FIXME: what about function stubs?
707           mos->addRelocation(MachineRelocation::getGV(PA-(intptr_t)Addr,
708                                                  MachineRelocation::VANILLA,
709                                                  const_cast<GlobalValue*>(GV),
710                                                  ScatteredOffset));
711           ScatteredOffset = 0;
712         } else
713           LLVM_UNREACHABLE("Unknown constant pointer type!");
714         break;
715       default:
716         std::string msg;
717         raw_string_ostream Msg(msg);
718         Msg << "ERROR: Constant unimp for type: " << *PC->getType();
719         llvm_report_error(Msg.str());
720       }
721     } else if (isa<ConstantAggregateZero>(PC)) {
722       memset((void*)PA, 0, (size_t)TD->getTypeAllocSize(PC->getType()));
723     } else if (const ConstantArray *CPA = dyn_cast<ConstantArray>(PC)) {
724       unsigned ElementSize =
725         TD->getTypeAllocSize(CPA->getType()->getElementType());
726       for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i)
727         WorkList.push_back(CPair(CPA->getOperand(i), PA+i*ElementSize));
728     } else if (const ConstantStruct *CPS = dyn_cast<ConstantStruct>(PC)) {
729       const StructLayout *SL =
730         TD->getStructLayout(cast<StructType>(CPS->getType()));
731       for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i)
732         WorkList.push_back(CPair(CPS->getOperand(i),
733                                  PA+SL->getElementOffset(i)));
734     } else {
735       cerr << "Bad Type: " << *PC->getType() << "\n";
736       LLVM_UNREACHABLE("Unknown constant type to initialize memory with!");
737     }
738   }
739 }
740
741 //===----------------------------------------------------------------------===//
742 //                          MachOSym Implementation
743 //===----------------------------------------------------------------------===//
744
745 MachOSym::MachOSym(const GlobalValue *gv, std::string name, uint8_t sect,
746                    const TargetAsmInfo *TAI) :
747   GV(gv), n_strx(0), n_type(sect == NO_SECT ? N_UNDF : N_SECT), n_sect(sect),
748   n_desc(0), n_value(0) {
749
750   switch (GV->getLinkage()) {
751   default:
752     LLVM_UNREACHABLE("Unexpected linkage type!");
753     break;
754   case GlobalValue::WeakAnyLinkage:
755   case GlobalValue::WeakODRLinkage:
756   case GlobalValue::LinkOnceAnyLinkage:
757   case GlobalValue::LinkOnceODRLinkage:
758   case GlobalValue::CommonLinkage:
759     assert(!isa<Function>(gv) && "Unexpected linkage type for Function!");
760   case GlobalValue::ExternalLinkage:
761     GVName = TAI->getGlobalPrefix() + name;
762     n_type |= GV->hasHiddenVisibility() ? N_PEXT : N_EXT;
763     break;
764   case GlobalValue::PrivateLinkage:
765     GVName = TAI->getPrivateGlobalPrefix() + name;
766     break;
767   case GlobalValue::InternalLinkage:
768     GVName = TAI->getGlobalPrefix() + name;
769     break;
770   }
771 }
772
773 } // end namespace llvm
774