| //===- 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 |