1*81ad6265SDimitry Andric //===- MachOWriter.h --------------------------------------------*- C++ -*-===// 2*81ad6265SDimitry Andric // 3*81ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*81ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*81ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*81ad6265SDimitry Andric // 7*81ad6265SDimitry Andric //===----------------------------------------------------------------------===// 8*81ad6265SDimitry Andric 9*81ad6265SDimitry Andric #ifndef LLVM_LIB_OBJCOPY_MACHO_MACHOWRITER_H 10*81ad6265SDimitry Andric #define LLVM_LIB_OBJCOPY_MACHO_MACHOWRITER_H 11*81ad6265SDimitry Andric 12*81ad6265SDimitry Andric #include "MachOLayoutBuilder.h" 13*81ad6265SDimitry Andric #include "MachOObject.h" 14*81ad6265SDimitry Andric #include "llvm/BinaryFormat/MachO.h" 15*81ad6265SDimitry Andric #include "llvm/ObjCopy/MachO/MachOObjcopy.h" 16*81ad6265SDimitry Andric #include "llvm/Object/MachO.h" 17*81ad6265SDimitry Andric 18*81ad6265SDimitry Andric namespace llvm { 19*81ad6265SDimitry Andric class Error; 20*81ad6265SDimitry Andric 21*81ad6265SDimitry Andric namespace objcopy { 22*81ad6265SDimitry Andric namespace macho { 23*81ad6265SDimitry Andric 24*81ad6265SDimitry Andric class MachOWriter { 25*81ad6265SDimitry Andric Object &O; 26*81ad6265SDimitry Andric bool Is64Bit; 27*81ad6265SDimitry Andric bool IsLittleEndian; 28*81ad6265SDimitry Andric uint64_t PageSize; 29*81ad6265SDimitry Andric std::unique_ptr<WritableMemoryBuffer> Buf; 30*81ad6265SDimitry Andric raw_ostream &Out; 31*81ad6265SDimitry Andric MachOLayoutBuilder LayoutBuilder; 32*81ad6265SDimitry Andric 33*81ad6265SDimitry Andric size_t headerSize() const; 34*81ad6265SDimitry Andric size_t loadCommandsSize() const; 35*81ad6265SDimitry Andric size_t symTableSize() const; 36*81ad6265SDimitry Andric size_t strTableSize() const; 37*81ad6265SDimitry Andric 38*81ad6265SDimitry Andric void writeHeader(); 39*81ad6265SDimitry Andric void writeLoadCommands(); 40*81ad6265SDimitry Andric template <typename StructType> 41*81ad6265SDimitry Andric void writeSectionInLoadCommand(const Section &Sec, uint8_t *&Out); 42*81ad6265SDimitry Andric void writeSections(); 43*81ad6265SDimitry Andric void writeSymbolTable(); 44*81ad6265SDimitry Andric void writeStringTable(); 45*81ad6265SDimitry Andric void writeRebaseInfo(); 46*81ad6265SDimitry Andric void writeBindInfo(); 47*81ad6265SDimitry Andric void writeWeakBindInfo(); 48*81ad6265SDimitry Andric void writeLazyBindInfo(); 49*81ad6265SDimitry Andric void writeExportInfo(); 50*81ad6265SDimitry Andric void writeIndirectSymbolTable(); 51*81ad6265SDimitry Andric void writeLinkData(Optional<size_t> LCIndex, const LinkData &LD); 52*81ad6265SDimitry Andric void writeCodeSignatureData(); 53*81ad6265SDimitry Andric void writeDataInCodeData(); 54*81ad6265SDimitry Andric void writeLinkerOptimizationHint(); 55*81ad6265SDimitry Andric void writeFunctionStartsData(); 56*81ad6265SDimitry Andric void writeChainedFixupsData(); 57*81ad6265SDimitry Andric void writeExportsTrieData(); 58*81ad6265SDimitry Andric void writeTail(); 59*81ad6265SDimitry Andric 60*81ad6265SDimitry Andric public: 61*81ad6265SDimitry Andric MachOWriter(Object &O, bool Is64Bit, bool IsLittleEndian, 62*81ad6265SDimitry Andric StringRef OutputFileName, uint64_t PageSize, raw_ostream &Out) 63*81ad6265SDimitry Andric : O(O), Is64Bit(Is64Bit), IsLittleEndian(IsLittleEndian), 64*81ad6265SDimitry Andric PageSize(PageSize), Out(Out), 65*81ad6265SDimitry Andric LayoutBuilder(O, Is64Bit, OutputFileName, PageSize) {} 66*81ad6265SDimitry Andric 67*81ad6265SDimitry Andric size_t totalSize() const; 68*81ad6265SDimitry Andric Error finalize(); 69*81ad6265SDimitry Andric Error write(); 70*81ad6265SDimitry Andric }; 71*81ad6265SDimitry Andric 72*81ad6265SDimitry Andric } // end namespace macho 73*81ad6265SDimitry Andric } // end namespace objcopy 74*81ad6265SDimitry Andric } // end namespace llvm 75*81ad6265SDimitry Andric 76*81ad6265SDimitry Andric #endif // LLVM_LIB_OBJCOPY_MACHO_MACHOWRITER_H 77