//===- IdenticalCodeFolding.h ---------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_LD_IDENTICALCODEFOLDING_H_ #define MCLD_LD_IDENTICALCODEFOLDING_H_ #include #include #include namespace mcld { class Input; class LDSection; class LinkerConfig; class Module; class Relocation; class TargetLDBackend; /** \class IdenticalCodeFolding * \brief Implementation of identical code folding for --icf=[none|all|safe] * @ref Safe ICF: Pointer Safe and Unwinding Aware Identical Code Folding in * Gold, http://research.google.com/pubs/pub36912.html */ class IdenticalCodeFolding { public: typedef std::pair ObjectAndId; typedef llvm::MapVector KeptSections; private: class FoldingCandidate { public: FoldingCandidate() : sect(NULL), reloc_sect(NULL), obj(NULL) {} FoldingCandidate(LDSection* pCode, LDSection* pReloc, Input* pInput) : sect(pCode), reloc_sect(pReloc), obj(pInput) {} void initConstantContent( const TargetLDBackend& pBackend, const IdenticalCodeFolding::KeptSections& pKeptSections); std::string getContentWithVariables( const TargetLDBackend& pBackend, const IdenticalCodeFolding::KeptSections& pKeptSections); LDSection* sect; LDSection* reloc_sect; Input* obj; std::string content; std::vector variable_relocs; }; typedef std::vector FoldingCandidates; public: IdenticalCodeFolding(const LinkerConfig& pConfig, const TargetLDBackend& pBackend, Module& pModule); void foldIdenticalCode(); private: void findCandidates(FoldingCandidates& pCandidateList); bool matchCandidates(FoldingCandidates& pCandidateList); private: const LinkerConfig& m_Config; const TargetLDBackend& m_Backend; Module& m_Module; KeptSections m_KeptSections; }; } // namespace mcld #endif // MCLD_LD_IDENTICALCODEFOLDING_H_