summaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/ObjCARC/ProvenanceAnalysis.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/ObjCARC/ProvenanceAnalysis.h')
-rw-r--r--llvm/lib/Transforms/ObjCARC/ProvenanceAnalysis.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/ObjCARC/ProvenanceAnalysis.h b/llvm/lib/Transforms/ObjCARC/ProvenanceAnalysis.h
new file mode 100644
index 000000000000..8fd842fd42d6
--- /dev/null
+++ b/llvm/lib/Transforms/ObjCARC/ProvenanceAnalysis.h
@@ -0,0 +1,86 @@
+//===- ProvenanceAnalysis.h - ObjC ARC Optimization -------------*- 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
+//
+//===----------------------------------------------------------------------===//
+//
+/// \file
+///
+/// This file declares a special form of Alias Analysis called ``Provenance
+/// Analysis''. The word ``provenance'' refers to the history of the ownership
+/// of an object. Thus ``Provenance Analysis'' is an analysis which attempts to
+/// use various techniques to determine if locally
+///
+/// WARNING: This file knows about certain library functions. It recognizes them
+/// by name, and hardwires knowledge of their semantics.
+///
+/// WARNING: This file knows about how certain Objective-C library functions are
+/// used. Naive LLVM IR transformations which would otherwise be
+/// behavior-preserving may break these assumptions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_PROVENANCEANALYSIS_H
+#define LLVM_LIB_TRANSFORMS_OBJCARC_PROVENANCEANALYSIS_H
+
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/Analysis/AliasAnalysis.h"
+#include "llvm/IR/ValueHandle.h"
+#include <utility>
+
+namespace llvm {
+
+class DataLayout;
+class PHINode;
+class SelectInst;
+class Value;
+
+namespace objcarc {
+
+/// This is similar to BasicAliasAnalysis, and it uses many of the same
+/// techniques, except it uses special ObjC-specific reasoning about pointer
+/// relationships.
+///
+/// In this context ``Provenance'' is defined as the history of an object's
+/// ownership. Thus ``Provenance Analysis'' is defined by using the notion of
+/// an ``independent provenance source'' of a pointer to determine whether or
+/// not two pointers have the same provenance source and thus could
+/// potentially be related.
+class ProvenanceAnalysis {
+ AliasAnalysis *AA;
+
+ using ValuePairTy = std::pair<const Value *, const Value *>;
+ using CachedResultsTy = DenseMap<ValuePairTy, bool>;
+
+ CachedResultsTy CachedResults;
+
+ DenseMap<const Value *, WeakTrackingVH> UnderlyingObjCPtrCache;
+
+ bool relatedCheck(const Value *A, const Value *B, const DataLayout &DL);
+ bool relatedSelect(const SelectInst *A, const Value *B);
+ bool relatedPHI(const PHINode *A, const Value *B);
+
+public:
+ ProvenanceAnalysis() = default;
+ ProvenanceAnalysis(const ProvenanceAnalysis &) = delete;
+ ProvenanceAnalysis &operator=(const ProvenanceAnalysis &) = delete;
+
+ void setAA(AliasAnalysis *aa) { AA = aa; }
+
+ AliasAnalysis *getAA() const { return AA; }
+
+ bool related(const Value *A, const Value *B, const DataLayout &DL);
+
+ void clear() {
+ CachedResults.clear();
+ UnderlyingObjCPtrCache.clear();
+ }
+};
+
+} // end namespace objcarc
+
+} // end namespace llvm
+
+#endif // LLVM_LIB_TRANSFORMS_OBJCARC_PROVENANCEANALYSIS_H