//===- bolt/Passes/LongJmp.h ------------------------------------*- 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_LONGJMP_H #define BOLT_PASSES_LONGJMP_H #include "bolt/Passes/BinaryPasses.h" namespace llvm { namespace bolt { /// LongJmp is veneer-insertion pass originally written for AArch64 that /// compensates for its short-range branches, typically done during linking. We /// pull this pass inside BOLT because here we can do a better job at stub /// inserting by manipulating the CFG, something linkers can't do. /// /// We iteratively repeat the following until no modification is done: we do a /// tentative layout with the current function sizes; then we add stubs for /// branches that we know are out of range or we expand smaller stubs (28-bit) /// to a large one if necessary (32 or 64). /// /// This expansion inserts the equivalent of "linker stubs", small /// blocks of code that load a 64-bit address into a pre-allocated register and // then executes an unconditional indirect branch on this register. By using a /// 64-bit range, we guarantee it can reach any code location. /// class LongJmpPass : public BinaryFunctionPass { … }; } // namespace bolt } // namespace llvm #endif