annotate lib/Analysis/AliasAnalysisSummary.cpp @ 120:1172e4bd9c6f

update 4.0.0
author mir3636
date Fri, 25 Nov 2016 19:14:25 +0900
parents
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
1 #include "AliasAnalysisSummary.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 #include "llvm/IR/Argument.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
3 #include "llvm/IR/Type.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
4 #include "llvm/Support/Compiler.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
5
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6 namespace llvm {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
7 namespace cflaa {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
8
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
9 namespace {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 const unsigned AttrEscapedIndex = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11 const unsigned AttrUnknownIndex = 1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12 const unsigned AttrGlobalIndex = 2;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13 const unsigned AttrCallerIndex = 3;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14 const unsigned AttrFirstArgIndex = 4;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15 const unsigned AttrLastArgIndex = NumAliasAttrs;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16 const unsigned AttrMaxNumArgs = AttrLastArgIndex - AttrFirstArgIndex;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
18 // It would be *slightly* prettier if we changed these to AliasAttrs, but it
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
19 // seems that both GCC and MSVC emit dynamic initializers for const bitsets.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
20 using AliasAttr = unsigned;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
21 const AliasAttr AttrNone = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22 const AliasAttr AttrEscaped = 1 << AttrEscapedIndex;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
23 const AliasAttr AttrUnknown = 1 << AttrUnknownIndex;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24 const AliasAttr AttrGlobal = 1 << AttrGlobalIndex;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
25 const AliasAttr AttrCaller = 1 << AttrCallerIndex;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
26 const AliasAttr ExternalAttrMask = AttrEscaped | AttrUnknown | AttrGlobal;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
27 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 AliasAttrs getAttrNone() { return AttrNone; }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31 AliasAttrs getAttrUnknown() { return AttrUnknown; }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32 bool hasUnknownAttr(AliasAttrs Attr) { return Attr.test(AttrUnknownIndex); }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34 AliasAttrs getAttrCaller() { return AttrCaller; }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35 bool hasCallerAttr(AliasAttrs Attr) { return Attr.test(AttrCaller); }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
36 bool hasUnknownOrCallerAttr(AliasAttrs Attr) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37 return Attr.test(AttrUnknownIndex) || Attr.test(AttrCallerIndex);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
40 AliasAttrs getAttrEscaped() { return AttrEscaped; }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41 bool hasEscapedAttr(AliasAttrs Attr) { return Attr.test(AttrEscapedIndex); }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
42
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43 static AliasAttr argNumberToAttr(unsigned ArgNum) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44 if (ArgNum >= AttrMaxNumArgs)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45 return AttrUnknown;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46 // N.B. MSVC complains if we use `1U` here, since AliasAttr' ctor takes
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47 // an unsigned long long.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 return AliasAttr(1ULL << (ArgNum + AttrFirstArgIndex));
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 AliasAttrs getGlobalOrArgAttrFromValue(const Value &Val) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52 if (isa<GlobalValue>(Val))
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
53 return AttrGlobal;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55 if (auto *Arg = dyn_cast<Argument>(&Val))
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
56 // Only pointer arguments should have the argument attribute,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
57 // because things can't escape through scalars without us seeing a
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
58 // cast, and thus, interaction with them doesn't matter.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
59 if (!Arg->hasNoAliasAttr() && Arg->getType()->isPointerTy())
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
60 return argNumberToAttr(Arg->getArgNo());
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 return AttrNone;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64 bool isGlobalOrArgAttr(AliasAttrs Attr) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 return Attr.reset(AttrEscapedIndex)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
66 .reset(AttrUnknownIndex)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
67 .reset(AttrCallerIndex)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
68 .any();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
69 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
70
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
71 AliasAttrs getExternallyVisibleAttrs(AliasAttrs Attr) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
72 return Attr & AliasAttrs(ExternalAttrMask);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
73 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
74
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
75 Optional<InstantiatedValue> instantiateInterfaceValue(InterfaceValue IValue,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
76 CallSite CS) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
77 auto Index = IValue.Index;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
78 auto Value = (Index == 0) ? CS.getInstruction() : CS.getArgument(Index - 1);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
79 if (Value->getType()->isPointerTy())
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
80 return InstantiatedValue{Value, IValue.DerefLevel};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
81 return None;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
82 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
83
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
84 Optional<InstantiatedRelation>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
85 instantiateExternalRelation(ExternalRelation ERelation, CallSite CS) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
86 auto From = instantiateInterfaceValue(ERelation.From, CS);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
87 if (!From)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
88 return None;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
89 auto To = instantiateInterfaceValue(ERelation.To, CS);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
90 if (!To)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
91 return None;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
92 return InstantiatedRelation{*From, *To, ERelation.Offset};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
93 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
94
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
95 Optional<InstantiatedAttr> instantiateExternalAttribute(ExternalAttribute EAttr,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
96 CallSite CS) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
97 auto Value = instantiateInterfaceValue(EAttr.IValue, CS);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
98 if (!Value)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
99 return None;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
100 return InstantiatedAttr{*Value, EAttr.Attr};
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
101 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
102 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
103 }