From 04b6e803818592a469fef8fd4576b0a904a6c989 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Wed, 10 Apr 2013 20:50:44 +0000 Subject: [PATCH] Use a real union for IdentifyingPassPtr. This avoids a nasty const correctness issue (AnalysisIDs are const, Pass* isn't). llvm-svn: 179213 --- llvm/include/llvm/CodeGen/Passes.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/llvm/include/llvm/CodeGen/Passes.h b/llvm/include/llvm/CodeGen/Passes.h index 7b0aa8fab7a0..b02f63e70b9f 100644 --- a/llvm/include/llvm/CodeGen/Passes.h +++ b/llvm/include/llvm/CodeGen/Passes.h @@ -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; } };