X-Git-Url: https://git.saurik.com/apple/ld64.git/blobdiff_plain/b2fa67a80bc53211e4d1ea81f23e9f953ee1dd6c..ebf6f43431fe84b7b17822014a6d1f0169516e93:/src/ld/SymbolTable.h diff --git a/src/ld/SymbolTable.h b/src/ld/SymbolTable.h index f352a51..451d064 100644 --- a/src/ld/SymbolTable.h +++ b/src/ld/SymbolTable.h @@ -93,6 +93,9 @@ private: typedef std::map SlotToName; typedef __gnu_cxx::hash_map, CStringEquals> NameToMap; + + typedef std::vector DuplicatedSymbolAtomList; + typedef std::map DuplicateSymbols; public: @@ -126,17 +129,24 @@ public: byNameIterator begin() { return byNameIterator(_byNameTable.begin(),_indirectBindingTable); } byNameIterator end() { return byNameIterator(_byNameTable.end(),_indirectBindingTable); } void printStatistics(); - static const char* demangle(const char* sym); // from ld::IndirectBindingTable virtual const char* indirectName(IndirectBindingSlot slot) const; virtual const ld::Atom* indirectAtom(IndirectBindingSlot slot) const; + + // Prints the duplicated symbols to stderr and throws. Only valid to call if hasDuplicateSymbols() returns true. + void checkDuplicateSymbols() const; + private: bool addByName(const ld::Atom& atom, bool ignoreDuplicates); bool addByContent(const ld::Atom& atom); bool addByReferences(const ld::Atom& atom); void markCoalescedAway(const ld::Atom* atom); + + // Tracks duplicated symbols. Each call adds file to the list of files defining symbol. + // The file list is uniqued per symbol, so calling multiple times for the same symbol/file pair is permitted. + void addDuplicateSymbol(const char *symbol, const ld::Atom* atom); const Options& _options; NameToSlot _byNameTable; @@ -154,7 +164,7 @@ private: std::vector& _indirectBindingTable; bool _hasExternalTentativeDefinitions; - static bool _s_doDemangle; + DuplicateSymbols _duplicateSymbols; };