[objc-arc] Move initialization of ARCMDKindCache into the class itself. I also made...
authorMichael Gottesman <mgottesman@apple.com>
Mon, 16 Mar 2015 07:02:27 +0000 (07:02 +0000)
committerMichael Gottesman <mgottesman@apple.com>
Mon, 16 Mar 2015 07:02:27 +0000 (07:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232348 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/ObjCARC/ARCRuntimeEntryPoints.h
lib/Transforms/ObjCARC/ObjCARC.h
lib/Transforms/ObjCARC/ObjCARCContract.cpp
lib/Transforms/ObjCARC/ObjCARCOpts.cpp
lib/Transforms/ObjCARC/PtrState.cpp
lib/Transforms/ObjCARC/PtrState.h

index 2aee25cb9a8be155c6185a6c493e0c20e0ac2432..87de33b839c0a35f61bf59647e6f330cce647457 100644 (file)
@@ -56,7 +56,7 @@ public:
 
   ~ARCRuntimeEntryPoints() { }
 
-  void Initialize(Module *M) {
+  void init(Module *M) {
     TheModule = M;
     AutoreleaseRV = nullptr;
     Release = nullptr;
index 1b31e744a3d2dbacda54d4a4dd7596ea03b61506..b99b111da2cadafb64ae364b011566d1db2ba65f 100644 (file)
@@ -24,6 +24,7 @@
 #define LLVM_LIB_TRANSFORMS_OBJCARC_OBJCARC_H
 
 #include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/Optional.h"
 #include "llvm/Analysis/AliasAnalysis.h"
 #include "llvm/Analysis/Passes.h"
 #include "llvm/Analysis/ValueTracking.h"
@@ -258,16 +259,52 @@ static inline bool IsObjCIdentifiedObject(const Value *V) {
   return false;
 }
 
+enum class ARCMDKindID {
+  ImpreciseRelease,
+  CopyOnEscape,
+  NoObjCARCExceptions,
+};
+
 /// A cache of MDKinds used by various ARC optimizations.
-struct ARCMDKindCache {
+class ARCMDKindCache {
+  Module *M;
+
   /// The Metadata Kind for clang.imprecise_release metadata.
-  unsigned ImpreciseReleaseMDKind;
+  llvm::Optional<unsigned> ImpreciseReleaseMDKind;
 
   /// The Metadata Kind for clang.arc.copy_on_escape metadata.
-  unsigned CopyOnEscapeMDKind;
+  llvm::Optional<unsigned> CopyOnEscapeMDKind;
 
   /// The Metadata Kind for clang.arc.no_objc_arc_exceptions metadata.
-  unsigned NoObjCARCExceptionsMDKind;
+  llvm::Optional<unsigned> NoObjCARCExceptionsMDKind;
+
+public:
+  void init(Module *Mod) {
+    M = Mod;
+    ImpreciseReleaseMDKind = NoneType::None;
+    CopyOnEscapeMDKind = NoneType::None;
+    NoObjCARCExceptionsMDKind = NoneType::None;
+  }
+
+  unsigned get(ARCMDKindID ID) {
+    switch (ID) {
+    case ARCMDKindID::ImpreciseRelease:
+      if (!ImpreciseReleaseMDKind)
+        ImpreciseReleaseMDKind =
+            M->getContext().getMDKindID("clang.imprecise_release");
+      return *ImpreciseReleaseMDKind;
+    case ARCMDKindID::CopyOnEscape:
+      if (!CopyOnEscapeMDKind)
+        CopyOnEscapeMDKind =
+            M->getContext().getMDKindID("clang.arc.copy_on_escape");
+      return *CopyOnEscapeMDKind;
+    case ARCMDKindID::NoObjCARCExceptions:
+      if (!NoObjCARCExceptionsMDKind)
+        NoObjCARCExceptionsMDKind =
+            M->getContext().getMDKindID("clang.arc.no_objc_arc_exceptions");
+      return *NoObjCARCExceptionsMDKind;
+    }
+  }
 };
 
 } // end namespace objcarc
index 5b5fe3ca5d34c551cd410434ab619b74eb77552c..741f5291536ba78c6afbeec67328b62f93b74f26 100644 (file)
@@ -647,7 +647,7 @@ bool ObjCARCContract::doInitialization(Module &M) {
   if (!Run)
     return false;
 
-  EP.Initialize(&M);
+  EP.init(&M);
 
   // Initialize RetainRVMarker.
   RetainRVMarker = nullptr;
index 016f875ee7b05213b82e09d2ba48068218607b01..5a73bc378f72b0f1b5d7d175f9d5c52bb5011c36 100644 (file)
@@ -712,7 +712,7 @@ void ObjCARCOpt::OptimizeIndividualCalls(Function &F) {
         Constant *Decl = EP.get(ARCRuntimeEntryPointKind::Release);
         CallInst *NewCall = CallInst::Create(Decl, Call->getArgOperand(0), "",
                                              Call);
-        NewCall->setMetadata(MDKindCache.ImpreciseReleaseMDKind,
+        NewCall->setMetadata(MDKindCache.get(ARCMDKindID::ImpreciseRelease),
                              MDNode::get(C, None));
 
         DEBUG(dbgs() << "Replacing autorelease{,RV}(x) with objc_release(x) "
@@ -1379,7 +1379,8 @@ bool ObjCARCOpt::Visit(Function &F,
   SmallVector<BasicBlock *, 16> PostOrder;
   SmallVector<BasicBlock *, 16> ReverseCFGPostOrder;
   ComputePostOrders(F, PostOrder, ReverseCFGPostOrder,
-                    MDKindCache.NoObjCARCExceptionsMDKind, BBStates);
+                    MDKindCache.get(ARCMDKindID::NoObjCARCExceptions),
+                    BBStates);
 
   // Use reverse-postorder on the reverse CFG for bottom-up.
   bool BottomUpNestingDetected = false;
@@ -1429,7 +1430,7 @@ void ObjCARCOpt::MoveCalls(Value *Arg, RRInfo &RetainsToMove,
     CallInst *Call = CallInst::Create(Decl, MyArg, "", InsertPt);
     // Attach a clang.imprecise_release metadata tag, if appropriate.
     if (MDNode *M = ReleasesToMove.ReleaseMetadata)
-      Call->setMetadata(MDKindCache.ImpreciseReleaseMDKind, M);
+      Call->setMetadata(MDKindCache.get(ARCMDKindID::ImpreciseRelease), M);
     Call->setDoesNotThrow();
     if (ReleasesToMove.IsTailCallRelease)
       Call->setTailCall();
@@ -2098,20 +2099,13 @@ bool ObjCARCOpt::doInitialization(Module &M) {
   if (!Run)
     return false;
 
-  // Identify the imprecise release metadata kind.
-  MDKindCache.ImpreciseReleaseMDKind =
-      M.getContext().getMDKindID("clang.imprecise_release");
-  MDKindCache.CopyOnEscapeMDKind =
-      M.getContext().getMDKindID("clang.arc.copy_on_escape");
-  MDKindCache.NoObjCARCExceptionsMDKind =
-      M.getContext().getMDKindID("clang.arc.no_objc_arc_exceptions");
-
   // Intuitively, objc_retain and others are nocapture, however in practice
   // they are not, because they return their argument value. And objc_release
   // calls finalizers which can have arbitrary side effects.
+  MDKindCache.init(&M);
 
   // Initialize our runtime entry point cache.
-  EP.Initialize(&M);
+  EP.init(&M);
 
   return false;
 }
index 1fcd127931d836980236fbce42ca4468763c3fc9..d360179fee25af5f42d5f4ae56aa52f8c2e15150 100644 (file)
@@ -174,7 +174,8 @@ bool BottomUpPtrState::InitBottomUp(ARCMDKindCache &Cache, Instruction *I) {
     NestingDetected = true;
   }
 
-  MDNode *ReleaseMetadata = I->getMetadata(Cache.ImpreciseReleaseMDKind);
+  MDNode *ReleaseMetadata =
+      I->getMetadata(Cache.get(ARCMDKindID::ImpreciseRelease));
   Sequence NewSeq = ReleaseMetadata ? S_MovableRelease : S_Release;
   ResetSequenceProgress(NewSeq);
   SetReleaseMetadata(ReleaseMetadata);
@@ -319,7 +320,8 @@ bool TopDownPtrState::MatchWithRelease(ARCMDKindCache &Cache,
 
   Sequence OldSeq = GetSeq();
 
-  MDNode *ReleaseMetadata = Release->getMetadata(Cache.ImpreciseReleaseMDKind);
+  MDNode *ReleaseMetadata =
+      Release->getMetadata(Cache.get(ARCMDKindID::ImpreciseRelease));
 
   switch (OldSeq) {
   case S_Retain:
index 1efc92ea5bb30318e7a979452b4c31b4f875be0b..e45e1ea96c5360d7d48dbd2a278109f709ef1fa5 100644 (file)
@@ -27,7 +27,7 @@
 namespace llvm {
 namespace objcarc {
 
-struct ARCMDKindCache;
+class ARCMDKindCache;
 class ProvenanceAnalysis;
 
 /// \enum Sequence