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

Devang Patel dpatel at apple.com
Tue Jan 27 13:18:46 PST 2009


Author: dpatel
Date: Tue Jan 27 15:18:46 2009
New Revision: 63133

URL: http://llvm.org/viewvc/llvm-project?rev=63133&view=rev
Log:
Keep track of context info. findRegion() is not comprehensive enough to find appropriate scope in all cases, but it is significantly better then what llvm-gcc ever did for debug info.


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=63133&r1=63132&r2=63133&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp Tue Jan 27 15:18:46 2009
@@ -214,39 +214,51 @@
   const char *FnName = GetNodeName(FnDecl);
   const char *LinkageName = getLinkageName(FnDecl);
 
-  tree func_type = TREE_TYPE(FnDecl);
-  llvm::SmallVector<llvm::DIDescriptor, 16> ArgTys;
-  // Add the result type at least.
-  ArgTys.push_back(getOrCreateType(TREE_TYPE(func_type)));
-
-  // Set up remainder of arguments.
-  for (tree arg = TYPE_ARG_TYPES(func_type); arg; arg = TREE_CHAIN(arg)) {
-    tree formal_type = TREE_VALUE(arg);
-    if (formal_type == void_type_node) break;
-   ArgTys.push_back(getOrCreateType(formal_type));
-  }
-      
-  llvm::DIArray FnTypeArray =
-    DebugFactory.GetOrCreateArray(&ArgTys[0], ArgTys.size());
-
-  llvm::DICompositeType  FnTy = 
-    DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type,
-                                     MainCompileUnit, "", 
-                                     MainCompileUnit, 0, 0, 0, 0, 0,
-                                     llvm::DIType(), FnTypeArray);
-
-  DISubprogram SP = DebugFactory.CreateSubprogram(MainCompileUnit, 
-                                                  FnName, FnName, LinkageName,
-                                                  MainCompileUnit, CurLineNo, 
-                                                  FnTy, 
-                                                  Fn->hasInternalLinkage(),
-                                                  true /*definition*/,
-                                                  &Filename, &Directory);
+  DISubprogram SP = 
+    DebugFactory.CreateSubprogram(findRegion(FnDecl),
+                                  FnName, FnName, LinkageName,
+                                  MainCompileUnit, CurLineNo, 
+                                  getOrCreateType(TREE_TYPE(FnDecl)),
+                                  Fn->hasInternalLinkage(),
+                                  true /*definition*/,
+                                  &Filename, &Directory);
 
   DebugFactory.InsertSubprogramStart(SP, CurBB);
 
   // Push function on region stack.
   RegionStack.push_back(SP);
+  RegionMap[FnDecl] = SP;
+}
+
+  /// findRegion - Find tree_node N's region.
+DIDescriptor DebugInfo::findRegion(tree Node) {
+  if (Node == NULL_TREE)
+    return MainCompileUnit;
+
+  std::map<tree_node *, DIDescriptor>::iterator I = RegionMap.find(Node);
+  if (I != RegionMap.end())
+    return I->second;
+
+  if (TYPE_P (Node)) {
+    if (TYPE_CONTEXT (Node))
+      return findRegion (TYPE_CONTEXT(Node));
+  } else if (DECL_P (Node)) {
+    tree decl = Node;
+    tree context = NULL_TREE;
+    if (TREE_CODE (decl) != FUNCTION_DECL || ! DECL_VINDEX (decl))
+      context = DECL_CONTEXT (decl);
+    else
+      context = TYPE_MAIN_VARIANT
+        (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)))));
+    
+    if (context && !TYPE_P (context))
+      context = NULL_TREE;
+    if (context != NULL_TREE)
+      return findRegion(context);
+  }
+
+  // Otherwise main compile unit covers everything.
+  return MainCompileUnit;
 }
 
 /// EmitRegionStart- Constructs the debug code for entering a declarative
@@ -397,7 +409,7 @@
     DebugFactory.GetOrCreateArray(&EltTys[0], EltTys.size());
   
   return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type,
-                                          MainCompileUnit, "", 
+                                          findRegion(type), "", 
                                           MainCompileUnit, 0, 0, 0, 0, 0,
                                           llvm::DIType(), EltTypeArray);
 }
@@ -412,7 +424,7 @@
                   TREE_CODE(type) == BLOCK_POINTER_TYPE) ?
     DW_TAG_pointer_type :
     DW_TAG_reference_type;
-  return  DebugFactory.CreateDerivedType(Tag, MainCompileUnit, "", 
+  return  DebugFactory.CreateDerivedType(Tag, findRegion(type), "", 
                                          MainCompileUnit, 0 /*line no*/, 
                                          NodeSizeInBits(type),
                                          NodeAlignInBits(type),
@@ -466,7 +478,7 @@
     DebugFactory.GetOrCreateArray(&Subscripts[0], Subscripts.size());
   
   return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_array_type,
-                                          MainCompileUnit, "", 
+                                          findRegion(type), "", 
                                           MainCompileUnit,
                                           0, NodeSizeInBits(type), 
                                           NodeAlignInBits(type), 0, 0,
@@ -500,7 +512,7 @@
     DirectoryAndFile(Loc.file, Directory, Filename);
   }
   return DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_enumeration_type,
-                                          MainCompileUnit, GetNodeName(type), 
+                                          findRegion(type), GetNodeName(type), 
                                           MainCompileUnit, Loc.line,
                                           NodeSizeInBits(type), 
                                           NodeAlignInBits(type), 0, 0,
@@ -526,7 +538,9 @@
   std::string Filename, Directory;
   DirectoryAndFile(Loc.file, Directory, Filename);
   llvm::DIType FwdDecl =
-    DebugFactory.CreateCompositeType(Tag, MainCompileUnit, GetNodeName(type),
+    DebugFactory.CreateCompositeType(Tag, 
+                                     findRegion(type),
+                                     GetNodeName(type),
                                      MainCompileUnit, Loc.line, 
                                      0, 0, 0, llvm::DIType::FlagFwdDecl,
                                      llvm::DIType(), llvm::DIArray(),
@@ -554,7 +568,7 @@
       // FIXME : name, size, align etc...
       DIType DTy = 
         DebugFactory.CreateDerivedType(DW_TAG_inheritance, 
-                                       MainCompileUnit,"", 
+                                       findRegion(type),"", 
                                        MainCompileUnit, 0,0,0, 
                                        getInt64(BINFO_OFFSET(BInfo), 0),
                                        0, BaseClass);
@@ -595,7 +609,7 @@
         Flags = llvm::DIType::FlagPrivate;
       
       DIType DTy =
-        DebugFactory.CreateDerivedType(DW_TAG_member, MainCompileUnit, 
+        DebugFactory.CreateDerivedType(DW_TAG_member, findRegion(Member),
                                        MemberName, MainCompileUnit,
                                        MemLoc.line, NodeSizeInBits(Member),
                                        NodeAlignInBits(FieldNodeType),
@@ -622,7 +636,7 @@
     const char *LinkageName = getLinkageName(Member);
     DIType SPTy = getOrCreateType(TREE_TYPE(Member));
     DISubprogram SP = 
-      DebugFactory.CreateSubprogram(MainCompileUnit, MemberName, MemberName,
+      DebugFactory.CreateSubprogram(findRegion(Member), MemberName, MemberName,
                                     LinkageName, MainCompileUnit, 
                                     MemLoc.line, SPTy, false, false,
                                     &MemFilename, &MemDirectory);
@@ -634,7 +648,7 @@
     DebugFactory.GetOrCreateArray(&EltTys[0], EltTys.size());
   
   llvm::DIType RealDecl =
-    DebugFactory.CreateCompositeType(Tag, MainCompileUnit, 
+    DebugFactory.CreateCompositeType(Tag, findRegion(type),
                                      GetNodeName(type),
                                      MainCompileUnit, Loc.line, 
                                      NodeSizeInBits(type), NodeAlignInBits(type),
@@ -657,7 +671,7 @@
       expanded_location TypeDefLoc = GetNodeLocation(Name);
       std::string Filename, Directory;
       DirectoryAndFile(TypeDefLoc.file, Directory, Filename);
-      Ty = DebugFactory.CreateDerivedType(DW_TAG_typedef, MainCompileUnit,
+      Ty = DebugFactory.CreateDerivedType(DW_TAG_typedef, findRegion(type),
                                           GetNodeName(Name), 
                                           MainCompileUnit, TypeDefLoc.line,
                                           0 /*size*/,
@@ -673,7 +687,7 @@
 
   if (TYPE_VOLATILE(type)) {
     Ty = DebugFactory.CreateDerivedType(DW_TAG_volatile_type, 
-                                        MainCompileUnit, "", 
+                                        findRegion(type), "", 
                                         MainCompileUnit, 0 /*line no*/, 
                                         NodeSizeInBits(type),
                                         NodeAlignInBits(type),
@@ -685,7 +699,7 @@
 
   if (TYPE_READONLY(type)) 
     Ty =  DebugFactory.CreateDerivedType(DW_TAG_const_type, 
-                                         MainCompileUnit, "", 
+                                         findRegion(type), "", 
                                          MainCompileUnit, 0 /*line no*/, 
                                          NodeSizeInBits(type),
                                          NodeAlignInBits(type),

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=63133&r1=63132&r2=63133&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-debug.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-debug.h Tue Jan 27 15:18:46 2009
@@ -66,6 +66,7 @@
   std::vector<DIDescriptor> RegionStack;
                                         // Stack to track declarative scopes.
   
+  std::map<tree_node *, DIDescriptor> RegionMap;
 public:
   DebugInfo(Module *m);
 
@@ -126,7 +127,9 @@
 
   /// createCompileUnit - Create a new compile unit.
   DICompileUnit createCompileUnit(const std::string &FullPath);
-  
+
+  /// findRegion - Find tree_node N's region.
+  DIDescriptor findRegion(tree_node *n);
 };
 
 } // end namespace llvm





More information about the llvm-commits mailing list