diff options
author | Gabor Greif <ggreif@gmail.com> | 2008-10-16 15:33:02 +0000 |
---|---|---|
committer | Gabor Greif <ggreif@gmail.com> | 2008-10-16 15:33:02 +0000 |
commit | 023f84ecafa08a67101937ac80f0dfd9f5e69dfb (patch) | |
tree | 8831767019372b83349c401cfe91078e1b4b12d6 /lib/VMCore/Use.cpp | |
parent | cc30d9caa5d4a7b7f08c33915d8c2f438a1d8c2b (diff) |
Introduce a typing refinenement on tagged data
using the 'volatile' qualifier. This should not have any operational consequences
on code, because tags should always be stripped off (giving a non-volatile pointer)
before dereferencing. The new qualification is there to catch some attempts to use
tagged pointers in a context where an untagged pointer is appropriate.
Notably this approach does not catch dereferencing of tagged pointers, but helps
in separating the two concepts a bit.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@57641 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Use.cpp')
-rw-r--r-- | lib/VMCore/Use.cpp | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/lib/VMCore/Use.cpp b/lib/VMCore/Use.cpp index d96a0e57fd..5eadaadbb3 100644 --- a/lib/VMCore/Use.cpp +++ b/lib/VMCore/Use.cpp @@ -127,7 +127,7 @@ void Use::zap(Use *Start, const Use *Stop, bool del) { //===----------------------------------------------------------------------===// struct AugmentedUse : Use { - User *ref; + volatile User *ref; AugmentedUse(); // not implemented }; @@ -138,12 +138,10 @@ struct AugmentedUse : Use { User *Use::getUser() const { const Use *End = getImpliedUser(); - User *She = static_cast<const AugmentedUse*>(End - 1)->ref; - She = extractTag<Tag, tagOne>(She) + volatile User *She = static_cast<const AugmentedUse*>(End - 1)->ref; + return extractTag<Tag, tagOne>(She) ? llvm::stripTag<tagOne>(She) : reinterpret_cast<User*>(const_cast<Use*>(End)); - - return She; } //===----------------------------------------------------------------------===// |