reference, declarationdefinition
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 &section,
  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 &section,
  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;