blob: 573efca9f6f98748fe8145ae59d967f2f1f81564 [file] [log] [blame]
Eugene Zelenko20a38452016-04-29 19:47:09 +00001//===- lib/ReaderWriter/MachO/Atoms.h ---------------------------*- C++ -*-===//
Joey Goulyceb16de2014-01-03 23:12:02 +00002//
3// The LLVM Linker
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLD_READER_WRITER_MACHO_ATOMS_H
11#define LLD_READER_WRITER_MACHO_ATOMS_H
12
Eugene Zelenko20a38452016-04-29 19:47:09 +000013#include "lld/Core/Atom.h"
14#include "lld/Core/DefinedAtom.h"
15#include "lld/Core/SharedLibraryAtom.h"
Rui Ueyamae05d3802014-06-11 21:47:51 +000016#include "lld/Core/Simple.h"
Eugene Zelenko20a38452016-04-29 19:47:09 +000017#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/StringRef.h"
19#include <cstdint>
20#include <string>
Joey Goulyceb16de2014-01-03 23:12:02 +000021
22namespace lld {
Eugene Zelenko20a38452016-04-29 19:47:09 +000023
24class File;
25
Joey Goulyceb16de2014-01-03 23:12:02 +000026namespace mach_o {
Eugene Zelenko20a38452016-04-29 19:47:09 +000027
Joey Goulyceb16de2014-01-03 23:12:02 +000028class MachODefinedAtom : public SimpleDefinedAtom {
29public:
Nick Kledzike09cfc52014-05-15 23:03:50 +000030 MachODefinedAtom(const File &f, const StringRef name, Scope scope,
Nick Kledzik7820c802014-08-21 22:18:30 +000031 ContentType type, Merge merge, bool thumb, bool noDeadStrip,
Nick Kledzik63adb082014-11-18 00:30:25 +000032 const ArrayRef<uint8_t> content, Alignment align)
Nick Kledzike09cfc52014-05-15 23:03:50 +000033 : SimpleDefinedAtom(f), _name(name), _content(content),
Nick Kledzik63adb082014-11-18 00:30:25 +000034 _align(align), _contentType(type), _scope(scope), _merge(merge),
35 _thumb(thumb), _noDeadStrip(noDeadStrip) {}
Joey Goulyceb16de2014-01-03 23:12:02 +000036
Nick Kledzike09cfc52014-05-15 23:03:50 +000037 // Constructor for zero-fill content
38 MachODefinedAtom(const File &f, const StringRef name, Scope scope,
Lang Hamesac2adce2015-12-11 23:25:09 +000039 ContentType type, uint64_t size, bool noDeadStrip,
40 Alignment align)
Nick Kledzike09cfc52014-05-15 23:03:50 +000041 : SimpleDefinedAtom(f), _name(name),
Nick Kledzik63adb082014-11-18 00:30:25 +000042 _content(ArrayRef<uint8_t>(nullptr, size)), _align(align),
Lang Hamesac2adce2015-12-11 23:25:09 +000043 _contentType(type), _scope(scope), _merge(mergeNo), _thumb(false),
Nick Kledzik7820c802014-08-21 22:18:30 +000044 _noDeadStrip(noDeadStrip) {}
Joey Goulyceb16de2014-01-03 23:12:02 +000045
Pete Cooper8ad55fb2016-03-22 17:15:50 +000046 ~MachODefinedAtom() override = default;
47
Nick Kledzike09cfc52014-05-15 23:03:50 +000048 uint64_t size() const override { return _content.size(); }
49
50 ContentType contentType() const override { return _contentType; }
Joey Goulyceb16de2014-01-03 23:12:02 +000051
Nick Kledzik63adb082014-11-18 00:30:25 +000052 Alignment alignment() const override { return _align; }
53
Rui Ueyamabc69bce2014-03-28 21:36:33 +000054 StringRef name() const override { return _name; }
Joey Goulyceb16de2014-01-03 23:12:02 +000055
Rui Ueyamabc69bce2014-03-28 21:36:33 +000056 Scope scope() const override { return _scope; }
Joey Goulyceb16de2014-01-03 23:12:02 +000057
Nick Kledzik388f3d02014-05-28 01:16:35 +000058 Merge merge() const override { return _merge; }
59
Nick Kledzika4a08d32014-05-27 23:20:52 +000060 DeadStripKind deadStrip() const override {
61 if (_contentType == DefinedAtom::typeInitializerPtr)
62 return deadStripNever;
63 if (_contentType == DefinedAtom::typeTerminatorPtr)
64 return deadStripNever;
Nick Kledzik7820c802014-08-21 22:18:30 +000065 if (_noDeadStrip)
66 return deadStripNever;
Nick Kledzika4a08d32014-05-27 23:20:52 +000067 return deadStripNormal;
68 }
69
Nick Kledzike09cfc52014-05-15 23:03:50 +000070 ArrayRef<uint8_t> rawContent() const override {
Nick Kledzik3f690762014-06-27 18:25:01 +000071 // Note: Zerofill atoms have a content pointer which is null.
Nick Kledzike09cfc52014-05-15 23:03:50 +000072 return _content;
73 }
Joey Goulyceb16de2014-01-03 23:12:02 +000074
Nick Kledzik4576c112014-07-04 00:11:09 +000075 bool isThumb() const { return _thumb; }
76
Joey Goulyceb16de2014-01-03 23:12:02 +000077private:
78 const StringRef _name;
79 const ArrayRef<uint8_t> _content;
Nick Kledzik63adb082014-11-18 00:30:25 +000080 const DefinedAtom::Alignment _align;
Nick Kledzike09cfc52014-05-15 23:03:50 +000081 const ContentType _contentType;
Joey Goulyd2215372014-01-13 22:28:02 +000082 const Scope _scope;
Nick Kledzik388f3d02014-05-28 01:16:35 +000083 const Merge _merge;
Nick Kledzik4576c112014-07-04 00:11:09 +000084 const bool _thumb;
Nick Kledzik7820c802014-08-21 22:18:30 +000085 const bool _noDeadStrip;
Joey Goulyceb16de2014-01-03 23:12:02 +000086};
Nick Kledzik61fdef62014-05-15 20:59:23 +000087
Nick Kledzikacfad802014-05-30 22:51:04 +000088class MachODefinedCustomSectionAtom : public MachODefinedAtom {
89public:
Nick Kledzik7820c802014-08-21 22:18:30 +000090 MachODefinedCustomSectionAtom(const File &f, const StringRef name,
Nick Kledzikacfad802014-05-30 22:51:04 +000091 Scope scope, ContentType type, Merge merge,
Nick Kledzik7820c802014-08-21 22:18:30 +000092 bool thumb, bool noDeadStrip,
93 const ArrayRef<uint8_t> content,
Nick Kledzik63adb082014-11-18 00:30:25 +000094 StringRef sectionName, Alignment align)
Nick Kledzik7820c802014-08-21 22:18:30 +000095 : MachODefinedAtom(f, name, scope, type, merge, thumb, noDeadStrip,
Nick Kledzik63adb082014-11-18 00:30:25 +000096 content, align),
Nick Kledzikacfad802014-05-30 22:51:04 +000097 _sectionName(sectionName) {}
98
Pete Cooper8ad55fb2016-03-22 17:15:50 +000099 ~MachODefinedCustomSectionAtom() override = default;
100
Nick Kledzikacfad802014-05-30 22:51:04 +0000101 SectionChoice sectionChoice() const override {
102 return DefinedAtom::sectionCustomRequired;
103 }
Nick Kledzik7820c802014-08-21 22:18:30 +0000104
Nick Kledzikacfad802014-05-30 22:51:04 +0000105 StringRef customSectionName() const override {
106 return _sectionName;
107 }
Nick Kledzik7820c802014-08-21 22:18:30 +0000108private:
Nick Kledzikacfad802014-05-30 22:51:04 +0000109 StringRef _sectionName;
110};
111
Nick Kledzik61fdef62014-05-15 20:59:23 +0000112class MachOTentativeDefAtom : public SimpleDefinedAtom {
113public:
114 MachOTentativeDefAtom(const File &f, const StringRef name, Scope scope,
115 uint64_t size, DefinedAtom::Alignment align)
116 : SimpleDefinedAtom(f), _name(name), _scope(scope), _size(size),
117 _align(align) {}
118
Pete Cooper8ad55fb2016-03-22 17:15:50 +0000119 ~MachOTentativeDefAtom() override = default;
120
Nick Kledzik61fdef62014-05-15 20:59:23 +0000121 uint64_t size() const override { return _size; }
122
123 Merge merge() const override { return DefinedAtom::mergeAsTentative; }
124
125 ContentType contentType() const override { return DefinedAtom::typeZeroFill; }
126
127 Alignment alignment() const override { return _align; }
128
129 StringRef name() const override { return _name; }
130
131 Scope scope() const override { return _scope; }
132
133 ArrayRef<uint8_t> rawContent() const override { return ArrayRef<uint8_t>(); }
134
135private:
Lang Hamesac416d422015-10-29 03:57:31 +0000136 const std::string _name;
Nick Kledzik61fdef62014-05-15 20:59:23 +0000137 const Scope _scope;
138 const uint64_t _size;
139 const DefinedAtom::Alignment _align;
140};
141
Tim Northoverf9b13d62014-06-30 09:11:38 +0000142class MachOSharedLibraryAtom : public SharedLibraryAtom {
143public:
144 MachOSharedLibraryAtom(const File &file, StringRef name,
Nick Kledzik8fc67fb2014-08-13 23:55:41 +0000145 StringRef dylibInstallName, bool weakDef)
Tim Northoverf9b13d62014-06-30 09:11:38 +0000146 : SharedLibraryAtom(), _file(file), _name(name),
147 _dylibInstallName(dylibInstallName) {}
Rui Ueyama9071e4a2015-09-10 18:51:36 +0000148 ~MachOSharedLibraryAtom() override = default;
Tim Northoverf9b13d62014-06-30 09:11:38 +0000149
David Blaikie71df4052015-04-08 17:08:27 +0000150 StringRef loadName() const override { return _dylibInstallName; }
Tim Northoverf9b13d62014-06-30 09:11:38 +0000151
David Blaikie71df4052015-04-08 17:08:27 +0000152 bool canBeNullAtRuntime() const override {
Tim Northoverf9b13d62014-06-30 09:11:38 +0000153 // FIXME: this may actually be changeable. For now, all symbols are strongly
154 // defined though.
155 return false;
156 }
157
David Blaikie71df4052015-04-08 17:08:27 +0000158 const File &file() const override { return _file; }
Tim Northoverf9b13d62014-06-30 09:11:38 +0000159
David Blaikie71df4052015-04-08 17:08:27 +0000160 StringRef name() const override { return _name; }
Tim Northoverf9b13d62014-06-30 09:11:38 +0000161
David Blaikie71df4052015-04-08 17:08:27 +0000162 Type type() const override {
Tim Northoverf9b13d62014-06-30 09:11:38 +0000163 // Unused in MachO (I think).
164 return Type::Unknown;
165 }
166
David Blaikie71df4052015-04-08 17:08:27 +0000167 uint64_t size() const override {
Tim Northoverf9b13d62014-06-30 09:11:38 +0000168 // Unused in MachO (I think)
169 return 0;
170 }
171
172private:
173 const File &_file;
174 StringRef _name;
175 StringRef _dylibInstallName;
176};
177
Eugene Zelenko20a38452016-04-29 19:47:09 +0000178} // end namespace mach_o
179} // end namespace lld
Nick Kledzik61fdef62014-05-15 20:59:23 +0000180
Rui Ueyama9071e4a2015-09-10 18:51:36 +0000181#endif // LLD_READER_WRITER_MACHO_ATOMS_H