[llvm-commits] [llvm-gcc-4.2] r81586 - in /llvm-gcc-4.2/trunk/gcc: llvm-debug.cpp llvm-debug.h

Devang Patel dpatel at apple.com
Fri Sep 11 16:57:27 PDT 2009


Author: dpatel
Date: Fri Sep 11 18:57:27 2009
New Revision: 81586

URL: http://llvm.org/viewvc/llvm-project?rev=81586&view=rev
Log:
Use weak handle to keep track of MDNodes.


Modified:
    llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp
    llvm-gcc-4.2/trunk/gcc/llvm-debug.h

Modified: llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp?rev=81586&r1=81585&r2=81586&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp Fri Sep 11 18:57:27 2009
@@ -661,7 +661,7 @@
     return FwdDecl;
   
   // Insert into the TypeCache so that recursive uses will find it.
-  TypeCache[type] =  FwdDecl.getNode();
+  TypeCache[type] =  WeakVH(FwdDecl.getNode());
   
   // Convert all the elements.
   llvm::SmallVector<llvm::DIDescriptor, 16> EltTys;
@@ -772,9 +772,10 @@
   
   DIType Ty;
   if (tree TyDef = TYPE_NAME(type)) {
-      std::map<tree_node *, MDNode *>::iterator I = TypeCache.find(TyDef);
+      std::map<tree_node *, WeakVH >::iterator I = TypeCache.find(TyDef);
       if (I != TypeCache.end())
-        return DIType(I->second);
+	if (Value *M = I->second)
+	  return DIType(cast<MDNode>(M));
     if (TREE_CODE(TyDef) == TYPE_DECL &&  DECL_ORIGINAL_TYPE(TyDef)) {
       expanded_location TypeDefLoc = GetNodeLocation(TyDef);
       Ty = DebugFactory.CreateDerivedType(DW_TAG_typedef, findRegion(TyDef),
@@ -786,7 +787,7 @@
                                           0 /*offset */, 
                                           0 /*flags*/, 
                                           MainTy);
-      TypeCache[TyDef] = Ty.getNode();
+      TypeCache[TyDef] = WeakVH(Ty.getNode());
       return Ty;
     }
   }
@@ -816,7 +817,7 @@
                                          MainTy);
   
   if (TYPE_VOLATILE(type) || TYPE_READONLY(type)) {
-    TypeCache[type] = Ty.getNode();
+    TypeCache[type] = WeakVH(Ty.getNode());
     return Ty;
   }
 
@@ -836,9 +837,10 @@
   if (TREE_CODE(type) == VOID_TYPE) return DIType();
   
   // Check to see if the compile unit already has created this type.
-  std::map<tree_node *, MDNode *>::iterator I = TypeCache.find(type);
+  std::map<tree_node *, WeakVH >::iterator I = TypeCache.find(type);
   if (I != TypeCache.end())
-    return DIType(I->second);
+    if (Value *M = I->second)
+      return DIType(cast<MDNode>(M));
 
   DIType MainTy;
   if (type != TYPE_MAIN_VARIANT(type) && TYPE_MAIN_VARIANT(type))
@@ -905,7 +907,7 @@
       Ty = createBasicType(type);
       break;
   }
-  TypeCache[type] = Ty.getNode();
+  TypeCache[type] = WeakVH(Ty.getNode());
   return Ty;
 }
 
@@ -931,9 +933,10 @@
                                                 bool isMain) {
   if (!FullPath)
     FullPath = main_input_filename;
-  MDNode *&CU = CUCache[FullPath];
-  if (CU)
-    return DICompileUnit(CU);
+  std::map<std::string, WeakVH >::iterator I = CUCache.find(FullPath);
+  if (I != CUCache.end())
+    if (Value *M = I->second)
+      return DICompileUnit(cast<MDNode>(M));
 
   // Get source file information.
   std::string Directory;
@@ -962,24 +965,24 @@
   else
     LangTag = DW_LANG_C89;
 
-   const char *Flags = "";
-   // Do this only when RC_DEBUG_OPTIONS environment variable is set to
-   // a nonempty string. This is intended only for internal Apple use.
-   char * debugopt = getenv("RC_DEBUG_OPTIONS");
-   if (debugopt && debugopt[0])
-     Flags = get_arguments();
-
-   // flag_objc_abi represents Objective-C runtime version number. It is zero
-   // for all other language.
-   unsigned ObjcRunTimeVer = 0;
-   if (flag_objc_abi != 0 && flag_objc_abi != -1)
-     ObjcRunTimeVer = flag_objc_abi;
-   DICompileUnit NewCU = DebugFactory.CreateCompileUnit(LangTag, FileName, 
-                                                        Directory, 
-                                                        version_string, isMain,
-                                                        optimize, Flags,
-                                                        ObjcRunTimeVer);
-  CU = NewCU.getNode();
+  const char *Flags = "";
+  // Do this only when RC_DEBUG_OPTIONS environment variable is set to
+  // a nonempty string. This is intended only for internal Apple use.
+  char * debugopt = getenv("RC_DEBUG_OPTIONS");
+  if (debugopt && debugopt[0])
+    Flags = get_arguments();
+  
+  // flag_objc_abi represents Objective-C runtime version number. It is zero
+  // for all other language.
+  unsigned ObjcRunTimeVer = 0;
+  if (flag_objc_abi != 0 && flag_objc_abi != -1)
+    ObjcRunTimeVer = flag_objc_abi;
+  DICompileUnit NewCU = DebugFactory.CreateCompileUnit(LangTag, FileName, 
+						       Directory, 
+						       version_string, isMain,
+						       optimize, Flags,
+						       ObjcRunTimeVer);
+  CUCache[FullPath] = WeakVH(NewCU.getNode());
   return NewCU;
 }
 

Modified: llvm-gcc-4.2/trunk/gcc/llvm-debug.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-debug.h?rev=81586&r1=81585&r2=81586&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-debug.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-debug.h Fri Sep 11 18:57:27 2009
@@ -30,6 +30,7 @@
 
 #include "llvm/Analysis/DebugInfo.h"
 #include "llvm/Support/Dwarf.h"
+#include "llvm/Support/ValueHandle.h"
 
 extern "C" {
 #include "llvm.h"
@@ -59,8 +60,8 @@
   const char *PrevFullPath;             // Previous location file encountered.
   int PrevLineNo;                       // Previous location line# encountered.
   BasicBlock *PrevBB;                   // Last basic block encountered.
-  std::map<std::string, MDNode *> CUCache;
-  std::map<tree_node *, MDNode *> TypeCache;
+  std::map<std::string, WeakVH > CUCache;
+  std::map<tree_node *, WeakVH > TypeCache;
                                         // Cache of previously constructed 
                                         // Types.
   std::vector<DIDescriptor> RegionStack;





More information about the llvm-commits mailing list