/Users/buildslave/jenkins/sharedspace/clang-stage2-coverage-R@2/llvm/lib/Transforms/ObjCARC/ProvenanceAnalysis.h
Line | Count | Source |
1 | | //===- ProvenanceAnalysis.h - ObjC ARC Optimization ---*- C++ -*-----------===// |
2 | | // |
3 | | // The LLVM Compiler Infrastructure |
4 | | // |
5 | | // This file is distributed under the University of Illinois Open Source |
6 | | // License. See LICENSE.TXT for details. |
7 | | // |
8 | | //===----------------------------------------------------------------------===// |
9 | | /// \file |
10 | | /// |
11 | | /// This file declares a special form of Alias Analysis called ``Provenance |
12 | | /// Analysis''. The word ``provenance'' refers to the history of the ownership |
13 | | /// of an object. Thus ``Provenance Analysis'' is an analysis which attempts to |
14 | | /// use various techniques to determine if locally |
15 | | /// |
16 | | /// WARNING: This file knows about certain library functions. It recognizes them |
17 | | /// by name, and hardwires knowledge of their semantics. |
18 | | /// |
19 | | /// WARNING: This file knows about how certain Objective-C library functions are |
20 | | /// used. Naive LLVM IR transformations which would otherwise be |
21 | | /// behavior-preserving may break these assumptions. |
22 | | /// |
23 | | //===----------------------------------------------------------------------===// |
24 | | |
25 | | #ifndef LLVM_LIB_TRANSFORMS_OBJCARC_PROVENANCEANALYSIS_H |
26 | | #define LLVM_LIB_TRANSFORMS_OBJCARC_PROVENANCEANALYSIS_H |
27 | | |
28 | | #include "llvm/ADT/DenseMap.h" |
29 | | #include "llvm/Analysis/AliasAnalysis.h" |
30 | | |
31 | | namespace llvm { |
32 | | class Value; |
33 | | class DataLayout; |
34 | | class PHINode; |
35 | | class SelectInst; |
36 | | } |
37 | | |
38 | | namespace llvm { |
39 | | namespace objcarc { |
40 | | |
41 | | /// \brief This is similar to BasicAliasAnalysis, and it uses many of the same |
42 | | /// techniques, except it uses special ObjC-specific reasoning about pointer |
43 | | /// relationships. |
44 | | /// |
45 | | /// In this context ``Provenance'' is defined as the history of an object's |
46 | | /// ownership. Thus ``Provenance Analysis'' is defined by using the notion of |
47 | | /// an ``independent provenance source'' of a pointer to determine whether or |
48 | | /// not two pointers have the same provenance source and thus could |
49 | | /// potentially be related. |
50 | | class ProvenanceAnalysis { |
51 | | AliasAnalysis *AA; |
52 | | |
53 | | typedef std::pair<const Value *, const Value *> ValuePairTy; |
54 | | typedef DenseMap<ValuePairTy, bool> CachedResultsTy; |
55 | | CachedResultsTy CachedResults; |
56 | | |
57 | | bool relatedCheck(const Value *A, const Value *B, const DataLayout &DL); |
58 | | bool relatedSelect(const SelectInst *A, const Value *B); |
59 | | bool relatedPHI(const PHINode *A, const Value *B); |
60 | | |
61 | | void operator=(const ProvenanceAnalysis &) = delete; |
62 | | ProvenanceAnalysis(const ProvenanceAnalysis &) = delete; |
63 | | |
64 | | public: |
65 | 16.6k | ProvenanceAnalysis() {} |
66 | | |
67 | 296 | void setAA(AliasAnalysis *aa) { AA = aa; } |
68 | | |
69 | 3.10k | AliasAnalysis *getAA() const { return AA; } |
70 | | |
71 | | bool related(const Value *A, const Value *B, const DataLayout &DL); |
72 | | |
73 | 249 | void clear() { |
74 | 249 | CachedResults.clear(); |
75 | 249 | } |
76 | | }; |
77 | | |
78 | | } // end namespace objcarc |
79 | | } // end namespace llvm |
80 | | |
81 | | #endif |