#include "bolt/Passes/ReorderData.h"
#include "llvm/ADT/MapVector.h"
#include <algorithm>
#undef DEBUG_TYPE
#define DEBUG_TYPE …
usingnamespacellvm;
usingnamespacebolt;
namespace opts {
extern cl::OptionCategory BoltCategory;
extern cl::OptionCategory BoltOptCategory;
extern cl::opt<JumpTableSupportLevel> JumpTables;
static cl::opt<bool>
PrintReorderedData("print-reordered-data",
cl::desc("print section contents after reordering"),
cl::Hidden, cl::cat(BoltCategory));
cl::list<std::string>
ReorderData("reorder-data",
cl::CommaSeparated,
cl::desc("list of sections to reorder"),
cl::value_desc("section1,section2,section3,..."),
cl::cat(BoltOptCategory));
enum ReorderAlgo : char { … };
static cl::opt<ReorderAlgo>
ReorderAlgorithm("reorder-data-algo",
cl::desc("algorithm used to reorder data sections"),
cl::init(REORDER_COUNT),
cl::values(
clEnumValN(REORDER_COUNT,
"count",
"sort hot data by read counts"),
clEnumValN(REORDER_FUNCS,
"funcs",
"sort hot data by hot function usage and count")),
cl::ZeroOrMore,
cl::cat(BoltOptCategory));
static cl::opt<unsigned>
ReorderDataMaxSymbols("reorder-data-max-symbols",
cl::desc("maximum number of symbols to reorder"),
cl::init(std::numeric_limits<unsigned>::max()),
cl::cat(BoltOptCategory));
static cl::opt<unsigned> ReorderDataMaxBytes(
"reorder-data-max-bytes", cl::desc("maximum number of bytes to reorder"),
cl::init(std::numeric_limits<unsigned>::max()), cl::cat(BoltOptCategory));
static cl::list<std::string>
ReorderSymbols("reorder-symbols",
cl::CommaSeparated,
cl::desc("list of symbol names that can be reordered"),
cl::value_desc("symbol1,symbol2,symbol3,..."),
cl::Hidden,
cl::cat(BoltCategory));
static cl::list<std::string>
SkipSymbols("reorder-skip-symbols",
cl::CommaSeparated,
cl::desc("list of symbol names that cannot be reordered"),
cl::value_desc("symbol1,symbol2,symbol3,..."),
cl::Hidden,
cl::cat(BoltCategory));
static cl::opt<bool> ReorderInplace("reorder-data-inplace",
cl::desc("reorder data sections in place"),
cl::cat(BoltOptCategory));
}
namespace llvm {
namespace bolt {
namespace {
static constexpr uint16_t MinAlignment = …;
bool isSupported(const BinarySection &BS) { … }
bool filterSymbol(const BinaryData *BD) { … }
}
DataOrder;
void ReorderData::printOrder(BinaryContext &BC, const BinarySection &Section,
DataOrder::const_iterator Begin,
DataOrder::const_iterator End) const { … }
DataOrder ReorderData::baseOrder(BinaryContext &BC,
const BinarySection &Section) const { … }
void ReorderData::assignMemData(BinaryContext &BC) { … }
std::pair<DataOrder, unsigned>
ReorderData::sortedByFunc(BinaryContext &BC, const BinarySection &Section,
std::map<uint64_t, BinaryFunction> &BFs) const { … }
std::pair<DataOrder, unsigned>
ReorderData::sortedByCount(BinaryContext &BC,
const BinarySection &Section) const { … }
void ReorderData::setSectionOrder(BinaryContext &BC,
BinarySection &OutputSection,
DataOrder::iterator Begin,
DataOrder::iterator End) { … }
bool ReorderData::markUnmoveableSymbols(BinaryContext &BC,
BinarySection &Section) const { … }
Error ReorderData::runOnFunctions(BinaryContext &BC) { … }
}
}