//===- bolt/Passes/FrameAnalysis.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_FRAMEANALYSIS_H #define BOLT_PASSES_FRAMEANALYSIS_H #include "bolt/Passes/StackPointerTracking.h" namespace llvm { namespace bolt { class BinaryFunctionCallGraph; /// Alias analysis information attached to each instruction that accesses a /// frame position. This is called a "frame index" by LLVM Target libs when /// it is building a MachineFunction frame, and we use the same name here /// because we are essentially doing the job of frame reconstruction. struct FrameIndexEntry { … }; /// Record an access to an argument in stack. This should be attached to /// call instructions, so StackOffset and Size are determined in the context /// of the caller. This information helps the caller understand how the callee /// may access its private stack. struct ArgInStackAccess { … }; /// The set of all args-in-stack accesses for a given instruction. If /// AssumeEverything is true, then the set should be ignored and the /// corresponding instruction should be treated as accessing the entire /// stack for the purposes of analysis and optimization. struct ArgAccesses { … }; raw_ostream &operator<<(raw_ostream &OS, const FrameIndexEntry &FIE); /// This pass attaches stack access information to instructions. If a load/store /// instruction accesses a stack position, it will identify the CFA offset and /// size information of this access, where CFA is the Canonical Frame Address /// (using DWARF terminology). /// /// This pass also computes frame usage information obtained by a bottom-up call /// graph traversal: which registers are clobbered by functions (including their /// callees as determined by the call graph), whether a function accesses its /// caller's stack frame and whether a function demands its stack to be aligned /// due to the use of SSE aligned load/store operations present in itself or any /// of its direct or indirect callees. /// /// Initialization: /// /// FrameAnalysis FA(PrintPass); /// FA.runOnFunctions(BC); /// /// Usage (fetching frame access information about a given instruction): /// /// auto FIE = FA.getFIEFor(BC, Instruction); /// if (FIE && FIE->IsSimple) { /// ... = FIE->StackOffset /// ... = FIE->Size /// } /// /// Usage (determining the set of stack positions accessed by the target of a /// call: /// /// auto Args = FA.getArgAccessesFor(BC, CallInst); /// if (Args && Args->AssumeEverything) { /// ... callee may access any position of our current stack frame /// } /// class FrameAnalysis { … }; } // namespace bolt } // namespace llvm #endif