Home | History | Annotate | Download | only in LD
      1 //===- IdenticalCodeFolding.h ---------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #ifndef MCLD_LD_IDENTICALCODEFOLDING_H
     10 #define MCLD_LD_IDENTICALCODEFOLDING_H
     11 
     12 #include <llvm/ADT/MapVector.h>
     13 #include <string>
     14 #include <vector>
     15 
     16 namespace mcld {
     17 class Input;
     18 class LDSection;
     19 class LinkerConfig;
     20 class Module;
     21 class Relocation;
     22 class TargetLDBackend;
     23 
     24 /** \class IdenticalCodeFolding
     25  *  \brief Implementation of identical code folding for --icf=[none|all|safe]
     26  *  @ref Safe ICF: Pointer Safe and Unwinding Aware Identical Code Folding in
     27  *       Gold, http://research.google.com/pubs/pub36912.html
     28  */
     29 class IdenticalCodeFolding {
     30 public:
     31   typedef std::pair<Input*, size_t> ObjectAndId;
     32   typedef llvm::MapVector<LDSection*, ObjectAndId> KeptSections;
     33 
     34 private:
     35   class FoldingCandidate {
     36   public:
     37     FoldingCandidate()
     38         : sect(NULL), reloc_sect(NULL), obj(NULL)
     39     { }
     40     FoldingCandidate(LDSection* pCode, LDSection* pReloc, Input* pInput)
     41         : sect(pCode), reloc_sect(pReloc), obj(pInput)
     42     { }
     43 
     44     void initConstantContent(const TargetLDBackend& pBackend,
     45         const IdenticalCodeFolding::KeptSections& pKeptSections);
     46     std::string getContentWithVariables(const TargetLDBackend& pBackend,
     47         const IdenticalCodeFolding::KeptSections& pKeptSections);
     48 
     49     LDSection* sect;
     50     LDSection* reloc_sect;
     51     Input* obj;
     52     std::string content;
     53     std::vector<Relocation*> variable_relocs;
     54   };
     55 
     56   typedef std::vector<FoldingCandidate> FoldingCandidates;
     57 
     58 public:
     59   IdenticalCodeFolding(const LinkerConfig& pConfig,
     60                        const TargetLDBackend& pBackend,
     61                        Module& pModule);
     62 
     63   void foldIdenticalCode();
     64 
     65 private:
     66   void findCandidates(FoldingCandidates& pCandidateList);
     67 
     68   bool matchCandidates(FoldingCandidates& pCandidateList);
     69 
     70 private:
     71   const LinkerConfig& m_Config;
     72   const TargetLDBackend& m_Backend;
     73   Module& m_Module;
     74   KeptSections m_KeptSections;
     75 };
     76 
     77 } // namespace of mcld
     78 
     79 #endif
     80