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