Author: gclayton
Date: Thu Jan 21 16:26:13 2016
New Revision: 258443

URL: http://llvm.org/viewvc/llvm-project?rev=258443&view=rev
Log:
Always try to read DW_TAG_typedef types from DWO files first if we can. 

A lot of C code uses code like:

typedef struct 
{
   int a;
} FooType;
          
This creates debug info with an anonymous struct (a DW_TAG_structure_type with 
no DW_AT_name) and then a DW_TAG_typedef that points to the anonymous structure 
type. When a typedef is from a module and clang uses -gmodules and -fmodules, 
then we can end up trying to resolve an anonymous structure type in a DWO 
symbol file. This doesn't work very well when the structuture has no name, so 
we now check if a typedef comes from a module, and we directly resolve the 
typedef type in the module and copy it over. The version we copy from the 
module of course is correctly able to find the structure in the DWO symbol 
file, so this fixes the issues we run into.

<rdar://problem/24092915> 


Modified:
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp?rev=258443&r1=258442&r2=258443&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp 
(original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp Thu Jan 
21 16:26:13 2016
@@ -252,11 +252,34 @@ DWARFASTParserClang::ParseTypeFromDWARF
 
             switch (tag)
             {
+                case DW_TAG_typedef:
+                    // Try to parse a typedef from the DWO file first as 
modules
+                    // can contain typedef'ed structures that have no names 
like:
+                    //
+                    //  typedef struct { int a; } Foo;
+                    //
+                    // In this case we will have a structure with no name and a
+                    // typedef named "Foo" that points to this unnamed 
structure.
+                    // The name in the typedef is the only identifier for the 
struct,
+                    // so always try to get typedefs from DWO files if 
possible.
+                    //
+                    // The type_sp returned will be empty if the typedef 
doesn't exist
+                    // in a DWO file, so it is cheap to call this function 
just to check.
+                    //
+                    // If we don't do this we end up creating a TypeSP that 
says this
+                    // is a typedef to type 0x123 (the DW_AT_type value would 
be 0x123
+                    // in the DW_TAG_typedef), and this is the unnamed 
structure type.
+                    // We will have a hard time tracking down an unnammed 
structure
+                    // type in the module DWO file, so we make sure we don't 
get into
+                    // this situation by always resolving typedefs from the 
DWO file.
+                    type_sp = ParseTypeFromDWO(die, log);
+                    if (type_sp)
+                        return type_sp;
+
                 case DW_TAG_base_type:
                 case DW_TAG_pointer_type:
                 case DW_TAG_reference_type:
                 case DW_TAG_rvalue_reference_type:
-                case DW_TAG_typedef:
                 case DW_TAG_const_type:
                 case DW_TAG_restrict_type:
                 case DW_TAG_volatile_type:


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to