blob: fa3c6b7b5cde54a436d7a940eb303334b7bed480 [file] [log] [blame]
//===- bolt/Passes/StackAllocationAnalysis.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_STACKALLOCATIONANALYSIS_H
#define BOLT_PASSES_STACKALLOCATIONANALYSIS_H
#include "bolt/Passes/DataflowAnalysis.h"
#include "llvm/Support/CommandLine.h"
namespace opts {
extern llvm::cl::opt<bool> TimeOpts;
}
namespace llvm {
namespace bolt {
class StackPointerTracking;
/// Perform a dataflow analysis to track the value of SP as an offset relative
/// to the CFA.
class StackAllocationAnalysis
: public InstrsDataflowAnalysis<StackAllocationAnalysis,
/*Backward=*/false> {
friend class DataflowAnalysis<StackAllocationAnalysis, BitVector>;
StackPointerTracking &SPT;
public:
StackAllocationAnalysis(BinaryFunction &BF, StackPointerTracking &SPT,
MCPlusBuilder::AllocatorIdTy AllocId)
: InstrsDataflowAnalysis<StackAllocationAnalysis, false>(BF, AllocId),
SPT(SPT) {}
virtual ~StackAllocationAnalysis() {}
void run() { InstrsDataflowAnalysis<StackAllocationAnalysis, false>::run(); }
protected:
void preflight();
BitVector getStartingStateAtBB(const BinaryBasicBlock &BB);
BitVector getStartingStateAtPoint(const MCInst &Point);
void doConfluence(BitVector &StateOut, const BitVector &StateIn);
BitVector doKill(const MCInst &Point, const BitVector &StateIn,
int DeallocSize);
void doConfluenceWithLP(BitVector &StateOut, const BitVector &StateIn,
const MCInst &Invoke);
BitVector computeNext(const MCInst &Point, const BitVector &Cur);
StringRef getAnnotationName() const {
return StringRef("StackAllocationAnalysis");
}
};
} // end namespace bolt
} // end namespace llvm
#endif