181ad6265SDimitry Andric //===- MachOWriter.h --------------------------------------------*- C++ -*-===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric 981ad6265SDimitry Andric #ifndef LLVM_LIB_OBJCOPY_MACHO_MACHOWRITER_H 1081ad6265SDimitry Andric #define LLVM_LIB_OBJCOPY_MACHO_MACHOWRITER_H 1181ad6265SDimitry Andric 1281ad6265SDimitry Andric #include "MachOLayoutBuilder.h" 1381ad6265SDimitry Andric #include "MachOObject.h" 1481ad6265SDimitry Andric #include "llvm/BinaryFormat/MachO.h" 1581ad6265SDimitry Andric #include "llvm/ObjCopy/MachO/MachOObjcopy.h" 1681ad6265SDimitry Andric #include "llvm/Object/MachO.h" 1781ad6265SDimitry Andric 1881ad6265SDimitry Andric namespace llvm { 1981ad6265SDimitry Andric class Error; 2081ad6265SDimitry Andric 2181ad6265SDimitry Andric namespace objcopy { 2281ad6265SDimitry Andric namespace macho { 2381ad6265SDimitry Andric 2481ad6265SDimitry Andric class MachOWriter { 2581ad6265SDimitry Andric Object &O; 2681ad6265SDimitry Andric bool Is64Bit; 2781ad6265SDimitry Andric bool IsLittleEndian; 2881ad6265SDimitry Andric uint64_t PageSize; 2981ad6265SDimitry Andric std::unique_ptr<WritableMemoryBuffer> Buf; 3081ad6265SDimitry Andric raw_ostream &Out; 3181ad6265SDimitry Andric MachOLayoutBuilder LayoutBuilder; 3281ad6265SDimitry Andric 3381ad6265SDimitry Andric size_t headerSize() const; 3481ad6265SDimitry Andric size_t loadCommandsSize() const; 3581ad6265SDimitry Andric size_t symTableSize() const; 3681ad6265SDimitry Andric size_t strTableSize() const; 3781ad6265SDimitry Andric 3881ad6265SDimitry Andric void writeHeader(); 3981ad6265SDimitry Andric void writeLoadCommands(); 4081ad6265SDimitry Andric template <typename StructType> 4181ad6265SDimitry Andric void writeSectionInLoadCommand(const Section &Sec, uint8_t *&Out); 4281ad6265SDimitry Andric void writeSections(); 4381ad6265SDimitry Andric void writeSymbolTable(); 4481ad6265SDimitry Andric void writeStringTable(); 4581ad6265SDimitry Andric void writeRebaseInfo(); 4681ad6265SDimitry Andric void writeBindInfo(); 4781ad6265SDimitry Andric void writeWeakBindInfo(); 4881ad6265SDimitry Andric void writeLazyBindInfo(); 4981ad6265SDimitry Andric void writeExportInfo(); 5081ad6265SDimitry Andric void writeIndirectSymbolTable(); 51*bdd1243dSDimitry Andric void writeLinkData(std::optional<size_t> LCIndex, const LinkData &LD); 5281ad6265SDimitry Andric void writeCodeSignatureData(); 5381ad6265SDimitry Andric void writeDataInCodeData(); 5481ad6265SDimitry Andric void writeLinkerOptimizationHint(); 5581ad6265SDimitry Andric void writeFunctionStartsData(); 56*bdd1243dSDimitry Andric void writeDylibCodeSignDRsData(); 5781ad6265SDimitry Andric void writeChainedFixupsData(); 5881ad6265SDimitry Andric void writeExportsTrieData(); 5981ad6265SDimitry Andric void writeTail(); 6081ad6265SDimitry Andric 6181ad6265SDimitry Andric public: MachOWriter(Object & O,bool Is64Bit,bool IsLittleEndian,StringRef OutputFileName,uint64_t PageSize,raw_ostream & Out)6281ad6265SDimitry Andric MachOWriter(Object &O, bool Is64Bit, bool IsLittleEndian, 6381ad6265SDimitry Andric StringRef OutputFileName, uint64_t PageSize, raw_ostream &Out) 6481ad6265SDimitry Andric : O(O), Is64Bit(Is64Bit), IsLittleEndian(IsLittleEndian), 6581ad6265SDimitry Andric PageSize(PageSize), Out(Out), 6681ad6265SDimitry Andric LayoutBuilder(O, Is64Bit, OutputFileName, PageSize) {} 6781ad6265SDimitry Andric 6881ad6265SDimitry Andric size_t totalSize() const; 6981ad6265SDimitry Andric Error finalize(); 7081ad6265SDimitry Andric Error write(); 7181ad6265SDimitry Andric }; 7281ad6265SDimitry Andric 7381ad6265SDimitry Andric } // end namespace macho 7481ad6265SDimitry Andric } // end namespace objcopy 7581ad6265SDimitry Andric } // end namespace llvm 7681ad6265SDimitry Andric 7781ad6265SDimitry Andric #endif // LLVM_LIB_OBJCOPY_MACHO_MACHOWRITER_H 78