blob: a584fc6244e64e3acde3fe4288ef1d28542c150f [file] [log] [blame]
//===- 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 <llvm/ADT/MapVector.h>
#include <string>
#include <vector>
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<Input*, size_t> ObjectAndId;
typedef llvm::MapVector<LDSection*, ObjectAndId> 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<Relocation*> variable_relocs;
};
typedef std::vector<FoldingCandidate> 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_