X-Git-Url: https://git.saurik.com/apple/ld64.git/blobdiff_plain/b2fa67a80bc53211e4d1ea81f23e9f953ee1dd6c..bee7e226299dacc6d80d9cf6f1585c3d5d0645e0:/src/ld/Resolver.h diff --git a/src/ld/Resolver.h b/src/ld/Resolver.h index 65e2006..06b7a8b 100644 --- a/src/ld/Resolver.h +++ b/src/ld/Resolver.h @@ -42,6 +42,7 @@ #include #include +#include #include "Options.h" #include "ld.hpp" @@ -57,11 +58,13 @@ namespace tool { class Resolver : public ld::File::AtomHandler { public: - Resolver(const Options& opts, const InputFiles& inputs, ld::Internal& state) + Resolver(const Options& opts, InputFiles& inputs, ld::Internal& state) : _options(opts), _inputFiles(inputs), _internal(state), _symbolTable(opts, state.indirectBindingTable), - _haveLLVMObjs(false), _addToFinalSection(false), - _completedInitialObjectFiles(false) {} + _haveLLVMObjs(false), + _completedInitialObjectFiles(false), + _ltoCodeGenFinished(false), + _haveAliases(false) {} virtual void doAtom(const ld::Atom&); @@ -69,7 +72,7 @@ public: void resolve(); - + private: struct WhyLiveBackChain { @@ -80,7 +83,7 @@ private: void initializeState(); void buildAtomList(); void addInitialUndefines(); - void deadStripOptimize(); + void deadStripOptimize(bool force=false); void resolveUndefines(); void checkUndefines(bool force=false); void checkDylibSymbolCollisions(); @@ -88,20 +91,22 @@ private: void fillInInternalState(); void fillInHelpersInInternalState(); void removeCoalescedAwayAtoms(); + void syncAliases(); + void fillInEntryPoint(); void linkTimeOptimize(); void convertReferencesToIndirect(const ld::Atom& atom); const ld::Atom* entryPoint(bool searchArchives); void markLive(const ld::Atom& atom, WhyLiveBackChain* previous); bool isDtraceProbe(ld::Fixup::Kind kind); void liveUndefines(std::vector&); + void remainingUndefines(std::vector&); bool printReferencedBy(const char* name, SymbolTable::IndirectBindingSlot slot); - + void tweakWeakness(); + void buildArchivesList(); + void doLinkerOption(const std::vector& linkerOption, const char* fileName); + void dumpAtoms(); - class CStringEquals { - public: - bool operator()(const char* left, const char* right) const { return (strcmp(left, right) == 0); } - }; - typedef __gnu_cxx::hash_set, CStringEquals> StringSet; + typedef std::unordered_set StringSet; class NotLive { public: @@ -118,15 +123,18 @@ private: }; const Options& _options; - const InputFiles& _inputFiles; + InputFiles& _inputFiles; ld::Internal& _internal; std::vector _atoms; std::set _deadStripRoots; + std::vector _dontDeadStripIfReferencesLive; std::vector _atomsWithUnresolvedReferences; + std::vector _aliasesFromCmdLine; SymbolTable _symbolTable; bool _haveLLVMObjs; - bool _addToFinalSection; bool _completedInitialObjectFiles; + bool _ltoCodeGenFinished; + bool _haveAliases; };