blob: 4cb44fdb121e8603e46ee4e2ce78b883ba237d25 [file] [log] [blame]
//===- bolt/Passes/Aligner.h - Pass for optimal code alignment --*- 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
//
//===----------------------------------------------------------------------===//
//
// This file contains the declaration of the Aligner class, which provides
// alignment for code, e.g. basic block and functions, with the goal to achieve
// the optimal performance.
//
//===----------------------------------------------------------------------===//
#ifndef BOLT_PASSES_ALIGNER_H
#define BOLT_PASSES_ALIGNER_H
#include "bolt/Passes/BinaryPasses.h"
#include "llvm/Support/RWMutex.h"
namespace llvm {
namespace bolt {
class AlignerPass : public BinaryFunctionPass {
private:
/// Stats for usage of max bytes for basic block alignment.
std::vector<uint32_t> AlignHistogram;
llvm::sys::RWMutex AlignHistogramMtx;
/// Stats: execution count of blocks that were aligned.
std::atomic<uint64_t> AlignedBlocksCount{0};
/// Assign alignment to basic blocks based on profile.
void alignBlocks(BinaryFunction &Function, const MCCodeEmitter *Emitter);
public:
explicit AlignerPass() : BinaryFunctionPass(false) {}
const char *getName() const override { return "aligner"; }
/// Pass entry point
void runOnFunctions(BinaryContext &BC) override;
};
} // namespace bolt
} // namespace llvm
#endif