You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.2 KiB
81 lines
2.2 KiB
7 months ago
|
//===- 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_
|