diff options
author | John McCall <rjmccall@apple.com> | 2013-03-13 03:10:54 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2013-03-13 03:10:54 +0000 |
commit | 5b07e8077a20b80fee90bd76c43c6150c676e4a8 (patch) | |
tree | 6f93262867be60a728d721269a95eacee6c023ae /lib/CodeGen/CGValue.h | |
parent | 365bc037d67220dae412b45281f04a96140168da (diff) | |
download | clang-5b07e8077a20b80fee90bd76c43c6150c676e4a8.tar.gz |
Tighten up the rules for precise lifetime and document
the requirements on the ARC optimizer.
rdar://13407451
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176924 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGValue.h')
-rw-r--r-- | lib/CodeGen/CGValue.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/CodeGen/CGValue.h b/lib/CodeGen/CGValue.h index 6b0c271a08..b7591a76fb 100644 --- a/lib/CodeGen/CGValue.h +++ b/lib/CodeGen/CGValue.h @@ -97,6 +97,10 @@ public: } }; +/// Does an ARC strong l-value have precise lifetime? +enum ARCPreciseLifetime_t { + ARCImpreciseLifetime, ARCPreciseLifetime, +}; /// LValue - This represents an lvalue references. Because C/C++ allow /// bitfields, this is not a simple LLVM pointer, it may be a pointer plus a @@ -147,6 +151,10 @@ class LValue { // Lvalue is a thread local reference bool ThreadLocalRef : 1; + // Lvalue has ARC imprecise lifetime. We store this inverted to try + // to make the default bitfield pattern all-zeroes. + bool ImpreciseLifetime : 1; + Expr *BaseIvarExp; /// TBAAInfo - TBAA information to attach to dereferences of this LValue. @@ -164,6 +172,7 @@ private: // Initialize Objective-C flags. this->Ivar = this->ObjIsArray = this->NonGC = this->GlobalObjCRef = false; + this->ImpreciseLifetime = false; this->ThreadLocalRef = false; this->BaseIvarExp = 0; this->TBAAInfo = TBAAInfo; @@ -202,6 +211,13 @@ public: bool isThreadLocalRef() const { return ThreadLocalRef; } void setThreadLocalRef(bool Value) { ThreadLocalRef = Value;} + ARCPreciseLifetime_t isARCPreciseLifetime() const { + return ARCPreciseLifetime_t(!ImpreciseLifetime); + } + void setARCPreciseLifetime(ARCPreciseLifetime_t value) { + ImpreciseLifetime = (value == ARCImpreciseLifetime); + } + bool isObjCWeak() const { return Quals.getObjCGCAttr() == Qualifiers::Weak; } |