|
reference, declaration → definition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
|
Derived Classes
tools/lld/include/lld/Core/Simple.h 143 class SimpleDefinedAtom : public DefinedAtom {
tools/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp 807 class NormalizedAtom : public lld::DefinedAtom {
Declarations
tools/lld/include/lld/Core/SymbolTable.h 23 class DefinedAtom;
tools/lld/lib/ReaderWriter/MachO/LayoutPass.h 22 class DefinedAtom;
References
include/llvm/Support/Casting.h 58 return To::classof(&Val);
66 static inline bool doit(const From &) { return true; }
104 static inline bool doit(const From *Val) {
106 return isa_impl<To, From>::doit(*Val);
106 return isa_impl<To, From>::doit(*Val);
122 return isa_impl_wrap<To, SimpleFrom,
132 return isa_impl_cl<To,FromTy>::doit(Val);
142 return isa_impl_wrap<X, const Y,
172 using ret_type = To *; // Pointer arg case, return Ty*
176 using ret_type = const To *; // Constant pointer arg case, return const Ty*
198 using ret_type = typename cast_retty<To, SimpleFrom>::ret_type;
204 using ret_type = typename cast_retty_impl<To,FromTy>::ret_type;
210 To, From, typename simplify_type<From>::SimpleType>::ret_type;
227 static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
228 typename cast_retty<To, FromTy>::ret_type Res2
256 inline typename cast_retty<X, Y>::ret_type cast(Y &Val) {
263 inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
265 return cast_convert_val<X, Y*,
337 LLVM_NODISCARD inline typename cast_retty<X, Y>::ret_type dyn_cast(Y &Val) {
342 LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
343 return isa<X>(Val) ? cast<X>(Val) : nullptr;
343 return isa<X>(Val) ? cast<X>(Val) : nullptr;
include/llvm/Support/PointerLikeTypeTraits.h 56 static inline void *getAsVoidPointer(T *P) { return P; }
57 static inline T *getFromVoidPointer(void *P) { return static_cast<T *>(P); }
59 enum { NumLowBitsAvailable = detail::ConstantLog2<alignof(T)>::value };
91 typedef PointerLikeTypeTraits<T *> NonConst;
93 static inline const void *getAsVoidPointer(const T *P) {
96 static inline const T *getFromVoidPointer(const void *P) {
tools/lld/include/lld/Core/Atom.h 88 OwningAtomPtr(T *atom) : atom(atom) { }
110 T *const &get() const {
114 T *&get() {
118 T *release() {
119 auto *v = atom;
125 T *atom = nullptr;
tools/lld/include/lld/Core/DefinedAtom.h 291 reference_iterator(const DefinedAtom &a, const void *it)
315 const DefinedAtom &_atom;
343 return !(atomContentType == DefinedAtom::typeZeroFill ||
344 atomContentType == DefinedAtom::typeZeroFillFast ||
345 atomContentType == DefinedAtom::typeTLVInitialZeroFill);
tools/lld/include/lld/Core/File.h 114 AtomRange(AtomVector<T> &v) : _v(v) {}
115 AtomRange(const AtomVector<T> &v) : _v(const_cast<AtomVector<T> &>(v)) {}
117 using ConstDerefFn = const T* (*)(const OwningAtomPtr<T>&);
117 using ConstDerefFn = const T* (*)(const OwningAtomPtr<T>&);
118 using DerefFn = T* (*)(OwningAtomPtr<T>&);
118 using DerefFn = T* (*)(OwningAtomPtr<T>&);
120 typedef llvm::mapped_iterator<typename AtomVector<T>::const_iterator,
122 typedef llvm::mapped_iterator<typename AtomVector<T>::iterator,
125 static const T* DerefConst(const OwningAtomPtr<T> &p) {
125 static const T* DerefConst(const OwningAtomPtr<T> &p) {
129 static T* Deref(OwningAtomPtr<T> &p) {
129 static T* Deref(OwningAtomPtr<T> &p) {
147 llvm::iterator_range<typename AtomVector<T>::iterator> owning_ptrs() {
151 llvm::iterator_range<typename AtomVector<T>::iterator> owning_ptrs() const {
163 const OwningAtomPtr<T> &operator[](size_t idx) const {
167 OwningAtomPtr<T> &operator[](size_t idx) {
172 AtomVector<T> &_v;
177 virtual const AtomRange<DefinedAtom> defined() const = 0;
224 static AtomVector<DefinedAtom> _noDefinedAtoms;
254 const AtomRange<DefinedAtom> defined() const override {
tools/lld/include/lld/Core/Resolver.h 37 void doDefinedAtom(OwningAtomPtr<DefinedAtom> atom);
tools/lld/include/lld/Core/SharedLibraryFile.h 34 const AtomRange<DefinedAtom> defined() const override {
61 AtomVector<DefinedAtom> _definedAtoms;
tools/lld/include/lld/Core/Simple.h 50 void addAtom(DefinedAtom &a) {
64 if (auto *p = dyn_cast<DefinedAtom>(&atom)) {
77 void removeDefinedAtomsIf(std::function<bool(const DefinedAtom *)> pred) {
86 const AtomRange<DefinedAtom> defined() const override { return _defined; }
108 AtomVector<DefinedAtom> _defined;
143 class SimpleDefinedAtom : public DefinedAtom {
158 Scope scope() const override { return DefinedAtom::scopeLinkageUnit; }
161 return DefinedAtom::interposeNo;
164 Merge merge() const override { return DefinedAtom::mergeNo; }
169 return DefinedAtom::sectionBasedOnContent;
174 return DefinedAtom::deadStripNormal;
177 DefinedAtom::reference_iterator begin() const override {
183 DefinedAtom::reference_iterator end() const override {
tools/lld/include/lld/Core/SymbolTable.h 37 bool add(const DefinedAtom &);
77 static const DefinedAtom * getEmptyKey() { return nullptr; }
78 static const DefinedAtom * getTombstoneKey() { return (DefinedAtom*)(-1); }
79 static unsigned getHashValue(const DefinedAtom * const Val);
80 static bool isEqual(const DefinedAtom * const LHS,
81 const DefinedAtom * const RHS);
83 typedef llvm::DenseSet<const DefinedAtom*, AtomMappingInfo> AtomContentSet;
86 bool addByContent(const DefinedAtom &);
tools/lld/include/lld/ReaderWriter/MachOLinkingContext.h 415 bool customAtomOrderer(const DefinedAtom *left, const DefinedAtom *right,
415 bool customAtomOrderer(const DefinedAtom *left, const DefinedAtom *right,
426 void checkExportWhiteList(const DefinedAtom *atom) const;
427 void checkExportBlackList(const DefinedAtom *atom) const;
448 const DefinedAtom *atom, unsigned &ordinal);
tools/lld/lib/Core/DefinedAtom.cpp 15 DefinedAtom::ContentPermissions DefinedAtom::permissions() const {
21 DefinedAtom::ContentPermissions DefinedAtom::permissions(ContentType type) {
tools/lld/lib/Core/File.cpp 16 File::AtomVector<DefinedAtom> File::_noDefinedAtoms;
tools/lld/lib/Core/Resolver.cpp 124 void Resolver::doDefinedAtom(OwningAtomPtr<DefinedAtom> atom) {
140 atom.get()->deadStrip() == DefinedAtom::deadStripNever) {
299 if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom.get())) {
299 if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom.get())) {
326 if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom)) {
326 if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom)) {
356 if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom.get()))
356 if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom.get()))
367 if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom.get()))
367 if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom.get()))
368 if (defAtom->scope() == DefinedAtom::scopeGlobal)
480 if (auto *definedAtom = dyn_cast<DefinedAtom>(atom.get())) {
480 if (auto *definedAtom = dyn_cast<DefinedAtom>(atom.get())) {
tools/lld/lib/Core/SymbolTable.cpp 36 bool SymbolTable::add(const DefinedAtom &atom) {
38 atom.scope() != DefinedAtom::scopeTranslationUnit) {
44 if (atom.merge() == DefinedAtom::mergeByContent) {
48 if (atom.permissions() == DefinedAtom::permR__)
107 static MergeResolution mergeSelect(DefinedAtom::Merge first,
108 DefinedAtom::Merge second) {
138 const auto *existingDef = cast<DefinedAtom>(existing);
138 const auto *existingDef = cast<DefinedAtom>(existing);
139 const auto *newDef = cast<DefinedAtom>(&newAtom);
139 const auto *newDef = cast<DefinedAtom>(&newAtom);
213 unsigned SymbolTable::AtomMappingInfo::getHashValue(const DefinedAtom *atom) {
221 bool SymbolTable::AtomMappingInfo::isEqual(const DefinedAtom * const l,
222 const DefinedAtom * const r) {
235 if (l->sectionChoice() == DefinedAtom::sectionCustomRequired) {
244 bool SymbolTable::addByContent(const DefinedAtom &newAtom) {
tools/lld/lib/ReaderWriter/FileArchive.cpp 101 const AtomRange<DefinedAtom> defined() const override {
tools/lld/lib/ReaderWriter/MachO/ArchHandler.cpp 142 bool ArchHandler::isDwarfCIE(bool isBig, const DefinedAtom *atom) {
155 const Atom *ArchHandler::fdeTargetFunction(const DefinedAtom *fde) {
tools/lld/lib/ReaderWriter/MachO/ArchHandler.h 104 virtual const Atom *fdeTargetFunction(const DefinedAtom *fde);
138 const DefinedAtom *inAtom,
154 const DefinedAtom *inAtom,
176 virtual bool needsLocalSymbolInRelocatableFile(const DefinedAtom *atom) {
181 virtual void generateAtomContent(const DefinedAtom &atom, bool relocatable,
188 virtual void appendSectionRelocations(const DefinedAtom &atom,
224 virtual bool isThumbFunction(const DefinedAtom &atom) { return false; }
227 virtual const DefinedAtom *createShim(MachOFile &file, bool thumbToArm,
228 const DefinedAtom &) {
233 static bool isDwarfCIE(bool isBig, const DefinedAtom *atom);
267 DefinedAtom::ContentType stubHelperImageCacheContentType;
tools/lld/lib/ReaderWriter/MachO/ArchHandler_arm.cpp 83 const DefinedAtom *inAtom,
94 const DefinedAtom *inAtom,
103 void generateAtomContent(const DefinedAtom &atom, bool relocatable,
109 void appendSectionRelocations(const DefinedAtom &atom,
141 bool isThumbFunction(const DefinedAtom &atom) override;
142 const DefinedAtom *createShim(MachOFile &file, bool thumbToArm,
143 const DefinedAtom &) override;
197 StringRef stubName(const DefinedAtom &);
271 DefinedAtom::typeGOT,
339 StringRef ArchHandler_arm::stubName(const DefinedAtom &stubAtom) {
342 if (const DefinedAtom* lp = dyn_cast<DefinedAtom>(ref->target())) {
342 if (const DefinedAtom* lp = dyn_cast<DefinedAtom>(ref->target())) {
343 if (lp->contentType() != DefinedAtom::typeLazyPointer)
514 if (isa<DefinedAtom>(target)) {
525 const Relocation &reloc, const DefinedAtom *inAtom, uint32_t offsetInAtom,
638 const DefinedAtom *inAtom,
1012 void ArchHandler_arm::generateAtomContent(const DefinedAtom &atom,
1028 if (const DefinedAtom *defTarg = dyn_cast<DefinedAtom>(target)) {
1028 if (const DefinedAtom *defTarg = dyn_cast<DefinedAtom>(target)) {
1049 if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(&target)) {
1049 if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(&target)) {
1051 case DefinedAtom::mergeAsTentative:
1054 case DefinedAtom::mergeAsWeak:
1055 case DefinedAtom::mergeAsWeakAndAddressUsed:
1057 return (defAtom->scope() == DefinedAtom::scopeGlobal);
1182 const DefinedAtom &atom,
1401 bool ArchHandler_arm::isThumbFunction(const DefinedAtom &atom) {
1417 const DefinedAtom &target)
1435 return DefinedAtom::typeCode;
1445 return DefinedAtom::permR_X;
1464 const DefinedAtom &target)
1480 return DefinedAtom::typeCode;
1490 return DefinedAtom::permR_X;
1506 const DefinedAtom *ArchHandler_arm::createShim(MachOFile &file,
1508 const DefinedAtom &target) {
1509 bool isStub = (target.contentType() == DefinedAtom::typeStub);
tools/lld/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp 138 const DefinedAtom *inAtom,
149 const DefinedAtom *inAtom,
158 bool needsLocalSymbolInRelocatableFile(const DefinedAtom *atom) override {
159 return (atom->contentType() == DefinedAtom::typeCString);
162 void generateAtomContent(const DefinedAtom &atom, bool relocatable,
168 void appendSectionRelocations(const DefinedAtom &atom,
297 DefinedAtom::typeGOT,
378 const Relocation &reloc, const DefinedAtom *inAtom, uint32_t offsetInAtom,
458 if (inAtom->contentType() == DefinedAtom::typeCFI)
474 const DefinedAtom *inAtom, uint32_t offsetInAtom, uint64_t fixupAddress,
514 if (inAtom->contentType() == DefinedAtom::typeCFI)
539 const DefinedAtom &atom, bool relocatable, FindAddressForAtom findAddress,
568 if (isa<DefinedAtom>(target))
775 const DefinedAtom &atom, uint64_t atomSectionOffset, const Reference &ref,
tools/lld/lib/ReaderWriter/MachO/ArchHandler_x86.cpp 89 const DefinedAtom *inAtom,
100 const DefinedAtom *inAtom,
109 void generateAtomContent(const DefinedAtom &atom, bool relocatable,
115 void appendSectionRelocations(const DefinedAtom &atom,
220 DefinedAtom::typeNonLazyPointer,
252 const DefinedAtom *inAtom,
260 DefinedAtom::ContentPermissions perms;
315 ((perms & DefinedAtom::permR_X) == DefinedAtom::permR_X) ? abs32
315 ((perms & DefinedAtom::permR_X) == DefinedAtom::permR_X) ? abs32
326 ((perms & DefinedAtom::permR_X) == DefinedAtom::permR_X) ? abs32
326 ((perms & DefinedAtom::permR_X) == DefinedAtom::permR_X) ? abs32
335 ((perms & DefinedAtom::permR_X) == DefinedAtom::permR_X) ? abs32
335 ((perms & DefinedAtom::permR_X) == DefinedAtom::permR_X) ? abs32
350 const DefinedAtom *inAtom,
360 DefinedAtom::ContentPermissions perms = inAtom->permissions();
387 if ((perms & DefinedAtom::permR_X) == DefinedAtom::permR_X) {
387 if ((perms & DefinedAtom::permR_X) == DefinedAtom::permR_X) {
409 void ArchHandler_x86::generateAtomContent(const DefinedAtom &atom,
423 if (isa<DefinedAtom>(target))
534 if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(&target)) {
534 if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(&target)) {
536 case DefinedAtom::mergeAsTentative:
539 case DefinedAtom::mergeAsWeak:
540 case DefinedAtom::mergeAsWeakAndAddressUsed:
542 return (defAtom->scope() == DefinedAtom::scopeGlobal);
552 const DefinedAtom &atom,
tools/lld/lib/ReaderWriter/MachO/ArchHandler_x86_64.cpp 146 const DefinedAtom *inAtom,
157 const DefinedAtom *inAtom,
166 bool needsLocalSymbolInRelocatableFile(const DefinedAtom *atom) override {
167 return (atom->contentType() == DefinedAtom::typeCString);
170 void generateAtomContent(const DefinedAtom &atom, bool relocatable,
176 void appendSectionRelocations(const DefinedAtom &atom,
323 DefinedAtom::typeNonLazyPointer,
397 const DefinedAtom *inAtom,
457 if (inAtom->contentType() == DefinedAtom::typeThunkTLV &&
475 const DefinedAtom *inAtom,
497 if (inAtom->contentType() == DefinedAtom::typeCFI)
546 const DefinedAtom &atom, bool relocatable, FindAddressForAtom findAddress,
557 if (isa<DefinedAtom>(target))
765 const DefinedAtom &atom,
tools/lld/lib/ReaderWriter/MachO/Atoms.h 60 if (_contentType == DefinedAtom::typeInitializerPtr)
62 if (_contentType == DefinedAtom::typeTerminatorPtr)
79 const DefinedAtom::Alignment _align;
101 return DefinedAtom::sectionCustomRequired;
114 uint64_t size, DefinedAtom::Alignment align)
122 Merge merge() const override { return DefinedAtom::mergeAsTentative; }
124 ContentType contentType() const override { return DefinedAtom::typeZeroFill; }
138 const DefinedAtom::Alignment _align;
tools/lld/lib/ReaderWriter/MachO/CompactUnwindPass.cpp 50 CompactUnwindEntry(const DefinedAtom *function)
93 return DefinedAtom::typeProcessedUnwindInfo;
101 return DefinedAtom::permR__;
354 return atom->contentType() == DefinedAtom::typeCompactUnwindInfo;
366 for (const DefinedAtom *atom : mergedFile.defined()) {
367 if (atom->contentType() != DefinedAtom::typeCompactUnwindInfo)
396 CompactUnwindEntry extractCompactUnwindEntry(const DefinedAtom *atom) {
432 for (const DefinedAtom *ehFrameAtom : mergedFile.defined()) {
433 if (ehFrameAtom->contentType() != DefinedAtom::typeCFI)
460 for (const DefinedAtom *atom : mergedFile.defined()) {
461 if (atom->contentType() != DefinedAtom::typeCode)
487 std::vector<const DefinedAtom *> usedDwarfWorklist;
493 usedDwarfWorklist.push_back(cast<DefinedAtom>(entry.ehFrame));
499 usedDwarfWorklist.push_back(cast<DefinedAtom>(entry.second));
504 const DefinedAtom *cfiAtom = usedDwarfWorklist.back();
508 const DefinedAtom *cfiTarget = dyn_cast<DefinedAtom>(ref->target());
508 const DefinedAtom *cfiTarget = dyn_cast<DefinedAtom>(ref->target());
509 if (cfiTarget->contentType() == DefinedAtom::typeCFI)
516 if ((atom->contentType() == DefinedAtom::typeCFI) &&
524 const DefinedAtom *function,
tools/lld/lib/ReaderWriter/MachO/ExecutableAtoms.h 72 DefinedAtom::Scope symbolScope = DefinedAtom::scopeLinkageUnit;
72 DefinedAtom::Scope symbolScope = DefinedAtom::scopeLinkageUnit;
80 symbolScope = DefinedAtom::scopeGlobal;
112 DefinedAtom::typeMachHeader, DefinedAtom::mergeNo, false,
112 DefinedAtom::typeMachHeader, DefinedAtom::mergeNo, false,
118 *this, dsoHandleName, DefinedAtom::scopeLinkageUnit,
119 DefinedAtom::typeDSOHandle, DefinedAtom::mergeNo, false,
119 DefinedAtom::typeDSOHandle, DefinedAtom::mergeNo, false,
124 const AtomRange<DefinedAtom> defined() const override {
148 mutable AtomVector<DefinedAtom> _definedAtoms;
tools/lld/lib/ReaderWriter/MachO/File.h 40 DefinedAtom::ContentType type, DefinedAtom::Merge merge,
40 DefinedAtom::ContentType type, DefinedAtom::Merge merge,
52 DefinedAtom::Alignment align(
62 DefinedAtom::ContentType type, DefinedAtom::Merge merge,
62 DefinedAtom::ContentType type, DefinedAtom::Merge merge,
75 DefinedAtom::Alignment align(
94 DefinedAtom::Alignment align(
98 DefinedAtom::ContentType type = DefinedAtom::typeUnknown;
98 DefinedAtom::ContentType type = DefinedAtom::typeUnknown;
101 type = DefinedAtom::typeZeroFill;
104 type = DefinedAtom::typeTLVInitialZeroFill;
127 DefinedAtom::Alignment align, bool copyRefs) {
tools/lld/lib/ReaderWriter/MachO/FlatNamespaceFile.h 36 const AtomRange<DefinedAtom> defined() const override {
tools/lld/lib/ReaderWriter/MachO/GOTPass.cpp 59 return DefinedAtom::typeGOT;
71 return DefinedAtom::permRW_;
102 for (const DefinedAtom *atom : mergedFile.defined()) {
116 const DefinedAtom *gotEntry = makeGOTEntry(target);
145 const DefinedAtom *defTarget = dyn_cast<DefinedAtom>(target);
145 const DefinedAtom *defTarget = dyn_cast<DefinedAtom>(target);
147 defTarget->interposable() != DefinedAtom::interposeNo) {
156 const DefinedAtom *makeGOTEntry(const Atom *target) {
tools/lld/lib/ReaderWriter/MachO/LayoutPass.cpp 53 typedef llvm::DenseMap<const DefinedAtom *, const DefinedAtom *> AtomToAtomT;
53 typedef llvm::DenseMap<const DefinedAtom *, const DefinedAtom *> AtomToAtomT;
56 const DefinedAtom *definedAtom = dyn_cast<DefinedAtom>(atom);
56 const DefinedAtom *definedAtom = dyn_cast<DefinedAtom>(atom);
74 const DefinedAtom *atom) {
75 const DefinedAtom *start = atom;
98 const DefinedAtom *root) {
99 const DefinedAtom *tortoise = root;
100 const DefinedAtom *hare = followOnNexts[root];
112 const DefinedAtom *atom) {
121 const DefinedAtom *ap = i->second;
123 const DefinedAtom *next = followOnRoots[ap];
136 static void printDefinedAtoms(const File::AtomRange<DefinedAtom> &atomRange) {
137 for (const DefinedAtom *atom : atomRange) {
149 void LayoutPass::checkFollowonChain(const File::AtomRange<DefinedAtom> &range) {
153 std::set<const DefinedAtom *> roots;
156 for (const DefinedAtom *root : roots)
179 const DefinedAtom *left = lc._atom.get();
180 const DefinedAtom *right = rc._atom.get();
187 const DefinedAtom *leftRoot = lc._root;
188 const DefinedAtom *rightRoot = rc._root;
198 DefinedAtom::ContentPermissions leftPerms = leftRoot->permissions();
199 DefinedAtom::ContentPermissions rightPerms = rightRoot->permissions();
208 DefinedAtom::ContentType leftType = leftRoot->contentType();
209 DefinedAtom::ContentType rightType = rightRoot->contentType();
268 const DefinedAtom *LayoutPass::findAtomFollowedBy(
269 const DefinedAtom *targetAtom) {
272 const DefinedAtom *atom = _followOnRoots[targetAtom];
274 const DefinedAtom *prevAtom = atom;
289 bool LayoutPass::checkAllPrevAtomsZeroSize(const DefinedAtom *targetAtom) {
290 const DefinedAtom *atom = _followOnRoots[targetAtom];
306 void LayoutPass::setChainRoot(const DefinedAtom *targetAtom,
307 const DefinedAtom *root) {
334 void LayoutPass::buildFollowOnTable(const File::AtomRange<DefinedAtom> &range) {
340 for (const DefinedAtom *ai : range) {
345 const DefinedAtom *targetAtom = dyn_cast<DefinedAtom>(r->target());
345 const DefinedAtom *targetAtom = dyn_cast<DefinedAtom>(r->target());
364 const DefinedAtom *tmp = _followOnRoots[ai];
384 const DefinedAtom *targetPrevAtom = findAtomFollowedBy(targetAtom);
386 const DefinedAtom *tmp = _followOnRoots[targetPrevAtom];
403 LayoutPass::buildOrdinalOverrideMap(const File::AtomRange<DefinedAtom> &range) {
406 for (const DefinedAtom *ai : range) {
407 const DefinedAtom *atom = ai;
413 for (const DefinedAtom *nextAtom = start->second; nextAtom;
423 LayoutPass::decorate(File::AtomRange<DefinedAtom> &atomRange) const {
425 for (OwningAtomPtr<DefinedAtom> &atom : atomRange.owning_ptrs()) {
428 const auto *root = (ri == _followOnRoots.end()) ? atom.get() : ri->second;
435 void LayoutPass::undecorate(File::AtomRange<DefinedAtom> &atomRange,
447 File::AtomRange<DefinedAtom> atomRange = mergedFile.defined();
tools/lld/lib/ReaderWriter/MachO/LayoutPass.h 35 SortKey(OwningAtomPtr<DefinedAtom> &&atom,
36 const DefinedAtom *root, uint64_t override)
38 OwningAtomPtr<DefinedAtom> _atom;
39 const DefinedAtom *_root;
62 typedef std::function<bool (const DefinedAtom *left, const DefinedAtom *right,
62 typedef std::function<bool (const DefinedAtom *left, const DefinedAtom *right,
75 void buildFollowOnTable(const File::AtomRange<DefinedAtom> &range);
78 void buildOrdinalOverrideMap(const File::AtomRange<DefinedAtom> &range);
83 typedef llvm::DenseMap<const DefinedAtom *, const DefinedAtom *> AtomToAtomT;
83 typedef llvm::DenseMap<const DefinedAtom *, const DefinedAtom *> AtomToAtomT;
84 typedef llvm::DenseMap<const DefinedAtom *, uint64_t> AtomToOrdinalT;
101 const DefinedAtom *findAtomFollowedBy(const DefinedAtom *targetAtom);
101 const DefinedAtom *findAtomFollowedBy(const DefinedAtom *targetAtom);
102 bool checkAllPrevAtomsZeroSize(const DefinedAtom *targetAtom);
104 void setChainRoot(const DefinedAtom *targetAtom, const DefinedAtom *root);
104 void setChainRoot(const DefinedAtom *targetAtom, const DefinedAtom *root);
106 std::vector<SortKey> decorate(File::AtomRange<DefinedAtom> &atomRange) const;
108 void undecorate(File::AtomRange<DefinedAtom> &atomRange,
112 void checkFollowonChain(const File::AtomRange<DefinedAtom> &range);
tools/lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp 937 const DefinedAtom *atom,
960 bool MachOLinkingContext::customAtomOrderer(const DefinedAtom *left,
961 const DefinedAtom *right,
tools/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryUtils.h 202 void relocatableSectionInfoForContentType(DefinedAtom::ContentType atomType,
tools/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp 48 const DefinedAtom *atom;
115 void processAtomAttributes(const DefinedAtom *atom);
116 void assignAtomToSection(const DefinedAtom *atom);
149 typedef std::map<DefinedAtom::ContentType, SectionInfo*> TypeToSection;
155 SectionInfo *sectionForAtom(const DefinedAtom*);
156 SectionInfo *getRelocatableSection(DefinedAtom::ContentType type);
157 SectionInfo *getFinalSection(DefinedAtom::ContentType type);
158 void appendAtom(SectionInfo *sect, const DefinedAtom *atom);
163 uint16_t descBits(const DefinedAtom* atom);
167 const Atom *targetOfLazyPointer(const DefinedAtom *lpAtom);
168 const Atom *targetOfStub(const DefinedAtom *stubAtom);
169 llvm::Error getSymbolTableRegion(const DefinedAtom* atom,
174 void fixLazyReferenceImm(const DefinedAtom *atom, uint32_t offset,
200 const DefinedAtom *_entryAtom;
228 SectionInfo *Util::getRelocatableSection(DefinedAtom::ContentType type) {
263 DefinedAtom::ContentType atomType;
306 SectionInfo *Util::getFinalSection(DefinedAtom::ContentType atomType) {
312 case DefinedAtom::typeMachHeader:
313 case DefinedAtom::typeCode:
314 case DefinedAtom::typeStub:
315 case DefinedAtom::typeStubHelper:
318 case DefinedAtom::typeThunkTLV:
343 SectionInfo *Util::sectionForAtom(const DefinedAtom *atom) {
344 if (atom->sectionChoice() == DefinedAtom::sectionBasedOnContent) {
346 DefinedAtom::ContentType type = atom->contentType();
357 const DefinedAtom *firstAtom = sect->atomsAndOffsets.front().atom;
376 void Util::appendAtom(SectionInfo *sect, const DefinedAtom *atom) {
379 DefinedAtom::Alignment atomAlign = atom->alignment();
400 for (const DefinedAtom *atom : atomFile.defined()) {
406 void Util::processAtomAttributes(const DefinedAtom *atom) {
428 void Util::assignAtomToSection(const DefinedAtom *atom) {
429 if (atom->contentType() == DefinedAtom::typeMachHeader) {
434 } else if (atom->contentType() == DefinedAtom::typeDSOHandle)
745 if (lookForEntry && (info.atom->contentType() == DefinedAtom::typeCode) &&
770 if (auto *definedAtom = dyn_cast<DefinedAtom>(atom)) {
801 std::vector<const DefinedAtom*> atomsNeedingDebugNotes;
808 if (const DefinedAtom *atom = dyn_cast<DefinedAtom>(info.atom)) {
808 if (const DefinedAtom *atom = dyn_cast<DefinedAtom>(info.atom)) {
814 if (atom->contentType() == DefinedAtom::typeCFI ||
815 atom->contentType() == DefinedAtom::typeCString)
855 for (const DefinedAtom *atom : atomsNeedingDebugNotes) {
912 if (atom->contentType() == DefinedAtom::typeCode) {
947 uint16_t Util::descBits(const DefinedAtom* atom) {
950 case lld::DefinedAtom::mergeNo:
951 case lld::DefinedAtom::mergeAsTentative:
953 case lld::DefinedAtom::mergeAsWeak:
954 case lld::DefinedAtom::mergeAsWeakAndAddressUsed:
957 case lld::DefinedAtom::mergeSameNameAndSize:
958 case lld::DefinedAtom::mergeByLargestSection:
959 case lld::DefinedAtom::mergeByContent:
963 if (atom->contentType() == lld::DefinedAtom::typeResolver)
965 if (atom->contentType() == lld::DefinedAtom::typeMachHeader)
969 if (atom->deadStrip() == DefinedAtom::deadStripNever &&
971 if ((atom->contentType() != DefinedAtom::typeInitializerPtr)
972 && (atom->contentType() != DefinedAtom::typeTerminatorPtr))
983 llvm::Error Util::getSymbolTableRegion(const DefinedAtom* atom,
1058 const DefinedAtom *atom = info.atom;
1148 const Atom *Util::targetOfLazyPointer(const DefinedAtom *lpAtom) {
1157 const Atom *Util::targetOfStub(const DefinedAtom *stubAtom) {
1160 if (const DefinedAtom *lpAtom = dyn_cast<DefinedAtom>(ta)) {
1160 if (const DefinedAtom *lpAtom = dyn_cast<DefinedAtom>(ta)) {
1318 const DefinedAtom *atom = info.atom;
1323 if (si->relocsToDefinedCanBeImplicit && isa<DefinedAtom>(ref->target()))
1345 if (type == DefinedAtom::typeMachHeader) {
1349 if (type != DefinedAtom::typeCode)
1433 const DefinedAtom *atom = info.atom;
1440 if (isa<DefinedAtom>(targ)) {
1492 void Util::fixLazyReferenceImm(const DefinedAtom *atom, uint32_t offset,
1495 const DefinedAtom *da = dyn_cast<DefinedAtom>(ref->target());
1495 const DefinedAtom *da = dyn_cast<DefinedAtom>(ref->target());
1539 const DefinedAtom *atom = info.atom;
1550 if (atom->merge() == DefinedAtom::mergeAsWeak)
tools/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp 58 DefinedAtom::ContentType atomType;
105 DefinedAtom::ContentType atomTypeFromSection(const Section §ion,
110 p->atomType != DefinedAtom::typeUnknown; ++p) {
122 return DefinedAtom::typeCode;
124 return DefinedAtom::typeUnknown;
139 void sectionParseInfo(DefinedAtom::ContentType atomType,
141 DefinedAtom::Scope &scope,
142 DefinedAtom::Merge &merge,
145 DefinedAtom::ContentType atomType;
147 DefinedAtom::Scope scope;
148 DefinedAtom::Merge merge;
207 scope = DefinedAtom::scopeGlobal;
208 merge = DefinedAtom::mergeNo;
239 void atomFromSymbol(DefinedAtom::ContentType atomType, const Section §ion,
252 DefinedAtom::Merge merge = (symbolDescFlags & N_WEAK_DEF)
253 ? DefinedAtom::mergeAsWeak : DefinedAtom::mergeNo;
253 ? DefinedAtom::mergeAsWeak : DefinedAtom::mergeNo;
255 if (atomType == DefinedAtom::typeUnknown) {
265 if ((atomType == lld::DefinedAtom::typeCode) &&
267 atomType = lld::DefinedAtom::typeResolver;
275 llvm::Error processSymboledSection(DefinedAtom::ContentType atomType,
380 llvm::Error processSection(DefinedAtom::ContentType atomType,
391 DefinedAtom::Scope scope;
392 DefinedAtom::Merge merge;
1139 DefinedAtom::reference_iterator CurrentRef = atom->begin();
1193 DefinedAtom::reference_iterator CurrentRef = atom->begin();
1455 DefinedAtom::ContentType atomType = atomTypeFromSection(sect,
1549 for (const DefinedAtom* defAtom : file->defined()) {
1590 void relocatableSectionInfoForContentType(DefinedAtom::ContentType atomType,
1598 p->atomType != DefinedAtom::typeUnknown; ++p) {
1609 if (atomType == DefinedAtom::typeCode)
1611 if (atomType == DefinedAtom::typeCFI)
tools/lld/lib/ReaderWriter/MachO/ObjCPass.cpp 64 return DefinedAtom::typeObjCImageInfo;
76 return DefinedAtom::permR__;
113 const DefinedAtom* getImageInfo() {
tools/lld/lib/ReaderWriter/MachO/SectCreateFile.h 71 const AtomRange<DefinedAtom> defined() const override {
95 AtomVector<DefinedAtom> _definedAtoms;
tools/lld/lib/ReaderWriter/MachO/ShimPass.cpp 51 for (const DefinedAtom *atom : mergedFile.defined()) {
58 if (const lld::DefinedAtom *daTarget = dyn_cast<DefinedAtom>(target)) {
58 if (const lld::DefinedAtom *daTarget = dyn_cast<DefinedAtom>(target)) {
71 std::vector<const DefinedAtom *> shims;
82 for (const DefinedAtom *shim : shims)
90 void updateBranchToUseShim(bool thumbToArm, const DefinedAtom& target,
93 const DefinedAtom *shim = this->getShim(thumbToArm, target);
99 const DefinedAtom* getShim(bool thumbToArm, const DefinedAtom& target) {
99 const DefinedAtom* getShim(bool thumbToArm, const DefinedAtom& target) {
107 const DefinedAtom *shim = _archHandler.createShim(_file, thumbToArm,
118 llvm::DenseMap<const Atom*, const DefinedAtom*> _targetToShim;
tools/lld/lib/ReaderWriter/MachO/StubsPass.cpp 42 return DefinedAtom::typeLazyPointer;
54 return DefinedAtom::permRW_;
90 return DefinedAtom::permRW_;
115 return DefinedAtom::typeStub;
127 return DefinedAtom::permR_X;
149 return DefinedAtom::typeStubHelper;
161 return DefinedAtom::permR_X;
184 return DefinedAtom::typeStubHelper;
196 return DefinedAtom::permR_X;
223 for (const DefinedAtom *atom : mergedFile.defined()) {
235 const DefinedAtom *defTarget = dyn_cast<DefinedAtom>(target);
235 const DefinedAtom *defTarget = dyn_cast<DefinedAtom>(target);
236 if (defTarget && defTarget->interposable() != DefinedAtom::interposeNo){
tools/lld/lib/ReaderWriter/MachO/TLVPass.cpp 35 return DefinedAtom::typeTLVInitializerPtr;
47 return DefinedAtom::permRW_;
77 for (const DefinedAtom *atom : mergedFile.defined()) {
91 const DefinedAtom *tlvpEntry = makeTLVPEntry(target);
112 const DefinedAtom *makeTLVPEntry(const Atom *target) {
tools/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp 78 for (const lld::DefinedAtom *atom : file.defined()) {
210 using Ty = std::vector<OwningAtomPtr<T>>;
303 static void enumeration(IO &io, lld::DefinedAtom::SectionChoice &value) {
304 io.enumCase(value, "content", lld::DefinedAtom::sectionBasedOnContent);
305 io.enumCase(value, "custom", lld::DefinedAtom::sectionCustomPreferred);
307 lld::DefinedAtom::sectionCustomRequired);
312 static void enumeration(IO &io, lld::DefinedAtom::Interposable &value) {
313 io.enumCase(value, "no", DefinedAtom::interposeNo);
314 io.enumCase(value, "yes", DefinedAtom::interposeYes);
315 io.enumCase(value, "yes-and-weak", DefinedAtom::interposeYesAndRuntimeWeak);
320 static void enumeration(IO &io, lld::DefinedAtom::Merge &value) {
321 io.enumCase(value, "no", lld::DefinedAtom::mergeNo);
322 io.enumCase(value, "as-tentative", lld::DefinedAtom::mergeAsTentative);
323 io.enumCase(value, "as-weak", lld::DefinedAtom::mergeAsWeak);
325 lld::DefinedAtom::mergeAsWeakAndAddressUsed);
326 io.enumCase(value, "by-content", lld::DefinedAtom::mergeByContent);
328 lld::DefinedAtom::mergeSameNameAndSize);
329 io.enumCase(value, "largest", lld::DefinedAtom::mergeByLargestSection);
334 static void enumeration(IO &io, lld::DefinedAtom::DeadStripKind &value) {
335 io.enumCase(value, "normal", lld::DefinedAtom::deadStripNormal);
336 io.enumCase(value, "never", lld::DefinedAtom::deadStripNever);
337 io.enumCase(value, "always", lld::DefinedAtom::deadStripAlways);
342 static void enumeration(IO &io, lld::DefinedAtom::DynamicExport &value) {
343 io.enumCase(value, "normal", lld::DefinedAtom::dynamicExportNormal);
344 io.enumCase(value, "always", lld::DefinedAtom::dynamicExportAlways);
349 static void enumeration(IO &io, lld::DefinedAtom::CodeModel &value) {
350 io.enumCase(value, "none", lld::DefinedAtom::codeNA);
351 io.enumCase(value, "mips-pic", lld::DefinedAtom::codeMipsPIC);
352 io.enumCase(value, "mips-micro", lld::DefinedAtom::codeMipsMicro);
353 io.enumCase(value, "mips-micro-pic", lld::DefinedAtom::codeMipsMicroPIC);
354 io.enumCase(value, "mips-16", lld::DefinedAtom::codeMips16);
355 io.enumCase(value, "arm-thumb", lld::DefinedAtom::codeARMThumb);
356 io.enumCase(value, "arm-a", lld::DefinedAtom::codeARM_a);
357 io.enumCase(value, "arm-d", lld::DefinedAtom::codeARM_d);
358 io.enumCase(value, "arm-t", lld::DefinedAtom::codeARM_t);
364 static void enumeration(IO &io, lld::DefinedAtom::ContentPermissions &value) {
365 io.enumCase(value, "---", lld::DefinedAtom::perm___);
366 io.enumCase(value, "r--", lld::DefinedAtom::permR__);
367 io.enumCase(value, "r-x", lld::DefinedAtom::permR_X);
368 io.enumCase(value, "rw-", lld::DefinedAtom::permRW_);
369 io.enumCase(value, "rwx", lld::DefinedAtom::permRWX);
370 io.enumCase(value, "rw-l", lld::DefinedAtom::permRW_L);
371 io.enumCase(value, "unknown", lld::DefinedAtom::permUnknown);
376 static void enumeration(IO &io, lld::DefinedAtom::ContentType &value) {
377 io.enumCase(value, "unknown", DefinedAtom::typeUnknown);
378 io.enumCase(value, "code", DefinedAtom::typeCode);
379 io.enumCase(value, "stub", DefinedAtom::typeStub);
380 io.enumCase(value, "constant", DefinedAtom::typeConstant);
381 io.enumCase(value, "data", DefinedAtom::typeData);
382 io.enumCase(value, "quick-data", DefinedAtom::typeDataFast);
383 io.enumCase(value, "zero-fill", DefinedAtom::typeZeroFill);
384 io.enumCase(value, "zero-fill-quick", DefinedAtom::typeZeroFillFast);
385 io.enumCase(value, "const-data", DefinedAtom::typeConstData);
386 io.enumCase(value, "got", DefinedAtom::typeGOT);
387 io.enumCase(value, "resolver", DefinedAtom::typeResolver);
388 io.enumCase(value, "branch-island", DefinedAtom::typeBranchIsland);
389 io.enumCase(value, "branch-shim", DefinedAtom::typeBranchShim);
390 io.enumCase(value, "stub-helper", DefinedAtom::typeStubHelper);
391 io.enumCase(value, "c-string", DefinedAtom::typeCString);
392 io.enumCase(value, "utf16-string", DefinedAtom::typeUTF16String);
393 io.enumCase(value, "unwind-cfi", DefinedAtom::typeCFI);
394 io.enumCase(value, "unwind-lsda", DefinedAtom::typeLSDA);
395 io.enumCase(value, "const-4-byte", DefinedAtom::typeLiteral4);
396 io.enumCase(value, "const-8-byte", DefinedAtom::typeLiteral8);
397 io.enumCase(value, "const-16-byte", DefinedAtom::typeLiteral16);
398 io.enumCase(value, "lazy-pointer", DefinedAtom::typeLazyPointer);
400 DefinedAtom::typeLazyDylibPointer);
401 io.enumCase(value, "cfstring", DefinedAtom::typeCFString);
403 DefinedAtom::typeInitializerPtr);
405 DefinedAtom::typeTerminatorPtr);
406 io.enumCase(value, "c-string-pointer",DefinedAtom::typeCStringPtr);
408 DefinedAtom::typeObjCClassPtr);
410 DefinedAtom::typeObjC2CategoryList);
412 DefinedAtom::typeObjCImageInfo);
414 DefinedAtom::typeObjCMethodList);
415 io.enumCase(value, "objc-class1", DefinedAtom::typeObjC1Class);
416 io.enumCase(value, "dtraceDOF", DefinedAtom::typeDTraceDOF);
418 DefinedAtom::typeInterposingTuples);
419 io.enumCase(value, "lto-temp", DefinedAtom::typeTempLTO);
420 io.enumCase(value, "compact-unwind", DefinedAtom::typeCompactUnwindInfo);
421 io.enumCase(value, "unwind-info", DefinedAtom::typeProcessedUnwindInfo);
422 io.enumCase(value, "tlv-thunk", DefinedAtom::typeThunkTLV);
423 io.enumCase(value, "tlv-data", DefinedAtom::typeTLVInitialData);
424 io.enumCase(value, "tlv-zero-fill", DefinedAtom::typeTLVInitialZeroFill);
426 DefinedAtom::typeTLVInitializerPtr);
427 io.enumCase(value, "mach_header", DefinedAtom::typeMachHeader);
428 io.enumCase(value, "dso_handle", DefinedAtom::typeDSOHandle);
429 io.enumCase(value, "sectcreate", DefinedAtom::typeSectCreate);
462 static void output(const lld::DefinedAtom::Alignment &value, void *ctxt,
472 lld::DefinedAtom::Alignment &value) {
518 static size_t size(IO &io, AtomList<T> &seq) { return seq._atoms.size(); }
519 static T *&element(IO &io, AtomList<T> &seq, size_t index) {
519 static T *&element(IO &io, AtomList<T> &seq, size_t index) {
528 static size_t size(IO &io, File::AtomRange<T> &seq) { return seq.size(); }
529 static T *&element(IO &io, File::AtomRange<T> &seq, size_t index) {
529 static T *&element(IO &io, File::AtomRange<T> &seq, size_t index) {
584 const AtomRange<lld::DefinedAtom> defined() const override {
609 for (const lld::DefinedAtom *atom : member._content->defined())
647 const AtomRange<lld::DefinedAtom> defined() const override {
681 AtomList<lld::DefinedAtom> _definedAtoms;
685 AtomRange<lld::DefinedAtom> _definedAtomsRef;
807 class NormalizedAtom : public lld::DefinedAtom {
815 NormalizedAtom(IO &io, const lld::DefinedAtom *atom)
837 const lld::DefinedAtom *denormalize(IO &io) {
941 static void mapping(IO &io, const lld::DefinedAtom *&atom) {
943 MappingNormalizationHeap<NormalizedAtom, const lld::DefinedAtom *> keys(
960 DefinedAtom::scopeTranslationUnit);
962 DefinedAtom::typeCode);
966 DefinedAtom::interposeNo);
967 io.mapOptional("merge", keys->_merge, DefinedAtom::mergeNo);
971 DefinedAtom::sectionBasedOnContent);
975 DefinedAtom::deadStripNormal);
977 DefinedAtom::dynamicExportNormal);
978 io.mapOptional("code-model", keys->_codeModel, DefinedAtom::codeNA);
981 DefinedAtom::permissions(
988 static void mapping(IO &io, lld::DefinedAtom *&atom) {
989 const lld::DefinedAtom *atomPtr = atom;
990 MappingTraits<const lld::DefinedAtom *>::mapping(io, atomPtr);
1221 typedef MappingTraits<const lld::DefinedAtom *>::NormalizedAtom
1223 for (const lld::DefinedAtom *a : file->defined()) {
1249 typedef MappingTraits<const lld::DefinedAtom *>::NormalizedAtom
1254 for (const lld::DefinedAtom *a : this->defined()) {
tools/lld/unittests/MachOTests/MachONormalizedFileToAtomsTests.cpp 75 const lld::DefinedAtom *atom1 = *it;
77 const lld::DefinedAtom *atom2 = *it;
79 const lld::DefinedAtom *atom3 = *it;