1//===- bolt/Passes/StackAllocationAnalysis.h --------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef BOLT_PASSES_STACKALLOCATIONANALYSIS_H
10#define BOLT_PASSES_STACKALLOCATIONANALYSIS_H
11
12#include "bolt/Passes/DataflowAnalysis.h"
13#include "llvm/Support/CommandLine.h"
14
15namespace opts {
16extern llvm::cl::opt<bool> TimeOpts;
17}
18
19namespace llvm {
20namespace bolt {
21class StackPointerTracking;
22
23/// Perform a dataflow analysis to track the value of SP as an offset relative
24/// to the CFA.
25class StackAllocationAnalysis
26 : public InstrsDataflowAnalysis<StackAllocationAnalysis,
27 /*Backward=*/false> {
28 friend class DataflowAnalysis<StackAllocationAnalysis, BitVector>;
29
30 StackPointerTracking &SPT;
31
32public:
33 StackAllocationAnalysis(BinaryFunction &BF, StackPointerTracking &SPT,
34 MCPlusBuilder::AllocatorIdTy AllocId)
35 : InstrsDataflowAnalysis<StackAllocationAnalysis, false>(BF, AllocId),
36 SPT(SPT) {}
37 virtual ~StackAllocationAnalysis() {}
38
39 void run() { InstrsDataflowAnalysis<StackAllocationAnalysis, false>::run(); }
40
41protected:
42 void preflight();
43
44 BitVector getStartingStateAtBB(const BinaryBasicBlock &BB);
45
46 BitVector getStartingStateAtPoint(const MCInst &Point);
47
48 void doConfluence(BitVector &StateOut, const BitVector &StateIn);
49
50 BitVector doKill(const MCInst &Point, const BitVector &StateIn,
51 int DeallocSize);
52
53 void doConfluenceWithLP(BitVector &StateOut, const BitVector &StateIn,
54 const MCInst &Invoke);
55
56 BitVector computeNext(const MCInst &Point, const BitVector &Cur);
57
58 StringRef getAnnotationName() const {
59 return StringRef("StackAllocationAnalysis");
60 }
61};
62
63} // end namespace bolt
64} // end namespace llvm
65
66#endif
67

source code of bolt/include/bolt/Passes/StackAllocationAnalysis.h