~LiveVariables() override;
/// Compute the liveness information for a given CFG.
- static LiveVariables *computeLiveness(AnalysisDeclContext &analysisContext,
- bool killAtAssign);
+ static std::unique_ptr<LiveVariables>
+ computeLiveness(AnalysisDeclContext &analysisContext, bool killAtAssign);
/// Return true if a variable is live at the end of a
/// specified block.
void runOnAllBlocks(Observer &obs);
- static LiveVariables *create(AnalysisDeclContext &analysisContext) {
+ static std::unique_ptr<LiveVariables>
+ create(AnalysisDeclContext &analysisContext) {
return computeLiveness(analysisContext, true);
}
class RelaxedLiveVariables : public LiveVariables {
public:
- static LiveVariables *create(AnalysisDeclContext &analysisContext) {
+ static std::unique_ptr<LiveVariables>
+ create(AnalysisDeclContext &analysisContext) {
return computeLiveness(analysisContext, false);
}
// Used by AnalyisContext to construct this object.
static const void *getTag();
- static PostOrderCFGView *create(AnalysisDeclContext &analysisContext);
+ static std::unique_ptr<PostOrderCFGView>
+ create(AnalysisDeclContext &analysisContext);
};
} // namespace clang
/// necessary or nullptr if the analysis could not run.
template <typename T> T *getAnalysis() {
const void *tag = T::getTag();
- ManagedAnalysis *&data = getAnalysisImpl(tag);
- if (!data) {
+ std::unique_ptr<ManagedAnalysis> &data = getAnalysisImpl(tag);
+ if (!data)
data = T::create(*this);
- }
- return static_cast<T *>(data);
+ return static_cast<T *>(data.get());
}
/// \returns Whether the root namespace of \p D is the \c std C++ namespace.
static bool isInStdNamespace(const Decl *D);
private:
- ManagedAnalysis *&getAnalysisImpl(const void *tag);
+ std::unique_ptr<ManagedAnalysis> &getAnalysisImpl(const void *tag);
LocationContextManager &getLocationContextManager();
};
using namespace clang;
-using ManagedAnalysisMap = llvm::DenseMap<const void *, ManagedAnalysis *>;
+using ManagedAnalysisMap = llvm::DenseMap<const void *, std::unique_ptr<ManagedAnalysis>>;
AnalysisDeclContext::AnalysisDeclContext(AnalysisDeclContextManager *ADCMgr,
const Decl *D,
return llvm::make_range(V->begin(), V->end());
}
-ManagedAnalysis *&AnalysisDeclContext::getAnalysisImpl(const void *tag) {
+std::unique_ptr<ManagedAnalysis> &AnalysisDeclContext::getAnalysisImpl(const void *tag) {
if (!ManagedAnalyses)
ManagedAnalyses = new ManagedAnalysisMap();
ManagedAnalysisMap *M = (ManagedAnalysisMap*) ManagedAnalyses;
AnalysisDeclContext::~AnalysisDeclContext() {
delete forcedBlkExprs;
delete ReferencedBlockVars;
- // Release the managed analyses.
- if (ManagedAnalyses) {
- ManagedAnalysisMap *M = (ManagedAnalysisMap*) ManagedAnalyses;
- llvm::DeleteContainerSeconds(*M);
- delete M;
- }
+ delete (ManagedAnalysisMap*) ManagedAnalyses;
}
LocationContext::~LocationContext() = default;
delete (LiveVariablesImpl*) impl;
}
-LiveVariables *
-LiveVariables::computeLiveness(AnalysisDeclContext &AC,
- bool killAtAssign) {
+std::unique_ptr<LiveVariables>
+LiveVariables::computeLiveness(AnalysisDeclContext &AC, bool killAtAssign) {
// No CFG? Bail out.
CFG *cfg = AC.getCFG();
worklist.enqueuePredecessors(block);
}
- return new LiveVariables(LV);
+ return std::unique_ptr<LiveVariables>(new LiveVariables(LV));
}
void LiveVariables::dumpBlockLiveness(const SourceManager &M) {
}
}
-PostOrderCFGView *PostOrderCFGView::create(AnalysisDeclContext &ctx) {
+std::unique_ptr<PostOrderCFGView>
+PostOrderCFGView::create(AnalysisDeclContext &ctx) {
const CFG *cfg = ctx.getCFG();
if (!cfg)
return nullptr;
- return new PostOrderCFGView(cfg);
+ return std::make_unique<PostOrderCFGView>(cfg);
}
const void *PostOrderCFGView::getTag() { static int x; return &x; }