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 14#include <string> 15#include <vector> 16 17namespace mcld { 18 19class Input; 20class LDSection; 21class LinkerConfig; 22class Module; 23class Relocation; 24class TargetLDBackend; 25 26/** \class IdenticalCodeFolding 27 * \brief Implementation of identical code folding for --icf=[none|all|safe] 28 * @ref Safe ICF: Pointer Safe and Unwinding Aware Identical Code Folding in 29 * Gold, http://research.google.com/pubs/pub36912.html 30 */ 31class IdenticalCodeFolding { 32 public: 33 typedef std::pair<Input*, size_t> ObjectAndId; 34 typedef llvm::MapVector<LDSection*, ObjectAndId> KeptSections; 35 36 private: 37 class FoldingCandidate { 38 public: 39 FoldingCandidate() : sect(NULL), reloc_sect(NULL), obj(NULL) {} 40 FoldingCandidate(LDSection* pCode, LDSection* pReloc, Input* pInput) 41 : sect(pCode), reloc_sect(pReloc), obj(pInput) {} 42 43 void initConstantContent( 44 const TargetLDBackend& pBackend, 45 const IdenticalCodeFolding::KeptSections& pKeptSections); 46 std::string getContentWithVariables( 47 const TargetLDBackend& pBackend, 48 const IdenticalCodeFolding::KeptSections& pKeptSections); 49 50 LDSection* sect; 51 LDSection* reloc_sect; 52 Input* obj; 53 std::string content; 54 std::vector<Relocation*> variable_relocs; 55 }; 56 57 typedef std::vector<FoldingCandidate> FoldingCandidates; 58 59 public: 60 IdenticalCodeFolding(const LinkerConfig& pConfig, 61 const TargetLDBackend& pBackend, 62 Module& pModule); 63 64 void foldIdenticalCode(); 65 66 private: 67 void findCandidates(FoldingCandidates& pCandidateList); 68 69 bool matchCandidates(FoldingCandidates& pCandidateList); 70 71 private: 72 const LinkerConfig& m_Config; 73 const TargetLDBackend& m_Backend; 74 Module& m_Module; 75 KeptSections m_KeptSections; 76}; 77 78} // namespace mcld 79 80#endif // MCLD_LD_IDENTICALCODEFOLDING_H_ 81