Use a real union for IdentifyingPassPtr.
authorBenjamin Kramer <benny.kra@googlemail.com>
Wed, 10 Apr 2013 20:50:44 +0000 (20:50 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Wed, 10 Apr 2013 20:50:44 +0000 (20:50 +0000)
This avoids a nasty const correctness issue (AnalysisIDs are const, Pass* isn't).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179213 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/Passes.h

index 7b0aa8fab7a054a88d754db4a95c6d27456ae2bf..b02f63e70b9fce83cbc45996911875d2258b99ca 100644 (file)
@@ -50,24 +50,26 @@ class PassConfigImpl;
 ///
 /// AnalysisID is sadly char*, so PointerIntPair won't work.
 class IdentifyingPassPtr {
-  void *P;
+  union {
+    AnalysisID ID;
+    Pass *P;
+  };
   bool IsInstance;
 public:
-  IdentifyingPassPtr(): P(0), IsInstance(false) {}
-  IdentifyingPassPtr(AnalysisID IDPtr): P((void*)IDPtr), IsInstance(false) {}
-  IdentifyingPassPtr(Pass *InstancePtr)
-    : P((void*)InstancePtr), IsInstance(true) {}
+  IdentifyingPassPtr() : P(0), IsInstance(false) {}
+  IdentifyingPassPtr(AnalysisID IDPtr) : ID(IDPtr), IsInstance(false) {}
+  IdentifyingPassPtr(Pass *InstancePtr) : P(InstancePtr), IsInstance(true) {}
 
   bool isValid() const { return P; }
   bool isInstance() const { return IsInstance; }
 
   AnalysisID getID() const {
     assert(!IsInstance && "Not a Pass ID");
-    return (AnalysisID)P;
+    return ID;
   }
   Pass *getInstance() const {
     assert(IsInstance && "Not a Pass Instance");
-    return (Pass *)P;
+    return P;
   }
 };