xref: /freebsd-src/contrib/llvm-project/llvm/lib/ObjCopy/MachO/MachOWriter.h (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
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