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.
llvm-svn: 57641
diff --git a/llvm/lib/VMCore/Use.cpp b/llvm/lib/VMCore/Use.cpp
index d96a0e5..5eadaad 100644
--- a/llvm/lib/VMCore/Use.cpp
+++ b/llvm/lib/VMCore/Use.cpp
@@ -127,7 +127,7 @@
//===----------------------------------------------------------------------===//
struct AugmentedUse : Use {
- User *ref;
+ volatile User *ref;
AugmentedUse(); // not implemented
};
@@ -138,12 +138,10 @@
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;
}
//===----------------------------------------------------------------------===//