blob: 65b7306521019b06dd563e50ab3037c95a7d3e11 [file] [log] [blame]
//===- bolt/Passes/ReorderSection.h - Reorder section data ------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef BOLT_PASSES_REORDER_DATA_H
#define BOLT_PASSES_REORDER_DATA_H
#include "bolt/Passes/BinaryPasses.h"
#include <unordered_map>
namespace llvm {
namespace bolt {
class ReorderData : public BinaryFunctionPass {
public:
using DataOrder = std::vector<std::pair<BinaryData *, uint64_t>>;
private:
DataOrder baseOrder(BinaryContext &BC, const BinarySection &Section) const;
std::unordered_map<BinaryData *, uint64_t> BinaryDataCounts;
void assignMemData(BinaryContext &BC);
/// Sort symbols by memory profiling data execution count. The output
/// is a vector of [address,count] pairs.
std::pair<DataOrder, unsigned>
sortedByCount(BinaryContext &BC, const BinarySection &Section) const;
std::pair<DataOrder, unsigned>
sortedByFunc(BinaryContext &BC, const BinarySection &Section,
std::map<uint64_t, BinaryFunction> &BFs) const;
void printOrder(const BinarySection &Section, DataOrder::const_iterator Begin,
DataOrder::const_iterator End) const;
/// Set the ordering of the section with \p SectionName. \p NewOrder is a
/// vector of [old address, size] pairs. The new symbol order is implicit
/// in the order of the vector.
void setSectionOrder(BinaryContext &BC, BinarySection &OutputSection,
DataOrder::iterator Begin, DataOrder::iterator End);
bool markUnmoveableSymbols(BinaryContext &BC, BinarySection &Section) const;
public:
explicit ReorderData() : BinaryFunctionPass(false) {}
const char *getName() const override { return "reorder-data"; }
void runOnFunctions(BinaryContext &BC) override;
};
} // namespace bolt
} // namespace llvm
#endif