[Lldb-commits] [lldb] r367441 - Don't crash when pass by value struct has no definition.

Greg Clayton via lldb-commits lldb-commits at lists.llvm.org
Mon Aug 5 10:01:11 PDT 2019


The issue is found when parsing the "hb_font_make_immutable" function:


0x00084270: DW_TAG_subprogram
              DW_AT_low_pc	(0x0000000000002fb0)
              DW_AT_high_pc	(0x0000000000002fe4)
              DW_AT_frame_base	(DW_OP_reg29 W29)
              DW_AT_name	("hb_font_make_immutable")
              DW_AT_decl_file	(".harfbuzz/src/hb-font.cc")
              DW_AT_decl_line	(1514)
              DW_AT_external	(0x01)
              DW_AT_APPLE_optimized	(0x01)

0x0008428d:   DW_TAG_formal_parameter
                DW_AT_location	(0x00008852
                   [0x0000000000002fb0,  0x0000000000002fc0): DW_OP_reg0 W0
                   [0x0000000000002fc0,  0x0000000000002fe0): DW_OP_reg19 W19)
                DW_AT_name	("font")
                DW_AT_decl_file	(".harfbuzz/src/hb-font.cc")
                DW_AT_decl_line	(1514)
                DW_AT_type	(0x0008431c "hb_font_t*")


The parameter has type 0x0008431c:

0x0008431c: DW_TAG_pointer_type
              DW_AT_type	(0x00084322 "hb_font_t")

Which points to 0x00084322:

0x00084322: DW_TAG_typedef
              DW_AT_type	(0x00084202 "hb_font_t")
              DW_AT_name	("hb_font_t")
              DW_AT_decl_file	(".harfbuzz/src/hb-font.h")
              DW_AT_decl_line	(40)

which points to:

0x00084202: DW_TAG_structure_type
              DW_AT_calling_convention	(DW_CC_pass_by_value)
              DW_AT_name	("hb_font_t")
              DW_AT_byte_size	(0x68)
              DW_AT_declaration	(0x01)

Boom we crash when parsing the function type. This was compiled with a derivative of clang version 6.0.0.

My attempt at a minimal test case was:

$ cat main.cpp
#include "ByValue.h"

void f(ByValueTD *arg) {}

int main() {
  return 0;
}
$ cat ByValue.h
struct ByValue {
   ~ByValue() = default;
};
typedef ByValue ByValueTD;


The I try to compile with:

$ clang++ -g -O0 -std=gnu++11 -stdlib=libc++ -flimit-debug-info main.cpp

But the DWARF from more recent clangs will remove the DW_CC_pass_by_value from the ByValue. See the DIE at 0x00000082 in the DWARF below, it doesn't contain the "DW_AT_calling_convention	(DW_CC_pass_by_value)" anymore.


0x0000000b: DW_TAG_compile_unit
              DW_AT_producer	("Apple LLVM version 10.0.1 (clang-1001.0.46.4)")
              DW_AT_language	(DW_LANG_C_plus_plus)
              DW_AT_name	("main.cpp")
              DW_AT_stmt_list	(0x00000000)
              DW_AT_comp_dir	("/Users/gclayton/Documents/src/cc_calling")
              DW_AT_low_pc	(0x0000000100000f90)
              DW_AT_high_pc	(0x0000000100000faf)

0x0000002a:   DW_TAG_subprogram
                DW_AT_low_pc	(0x0000000100000f90)
                DW_AT_high_pc	(0x0000000100000f9a)
                DW_AT_frame_base	(DW_OP_reg6 RBP)
                DW_AT_linkage_name	("_Z1fP7ByValue")
                DW_AT_name	("f")
                DW_AT_decl_file	("/Users/gclayton/Documents/src/cc_calling/main.cpp")
                DW_AT_decl_line	(3)
                DW_AT_external	(true)

0x00000043:     DW_TAG_formal_parameter
                  DW_AT_location	(DW_OP_fbreg -8)
                  DW_AT_name	("arg")
                  DW_AT_decl_file	("/Users/gclayton/Documents/src/cc_calling/main.cpp")
                  DW_AT_decl_line	(3)
                  DW_AT_type	(0x0000000000000072 "ByValueTD*")

0x00000051:     NULL

0x00000052:   DW_TAG_subprogram
                DW_AT_low_pc	(0x0000000100000fa0)
                DW_AT_high_pc	(0x0000000100000faf)
                DW_AT_frame_base	(DW_OP_reg6 RBP)
                DW_AT_name	("main")
                DW_AT_decl_file	("/Users/gclayton/Documents/src/cc_calling/main.cpp")
                DW_AT_decl_line	(5)
                DW_AT_type	(0x000000000000006b "int")
                DW_AT_external	(true)

0x0000006b:   DW_TAG_base_type
                DW_AT_name	("int")
                DW_AT_encoding	(DW_ATE_signed)
                DW_AT_byte_size	(0x04)

0x00000072:   DW_TAG_pointer_type
                DW_AT_type	(0x0000000000000077 "ByValueTD")

0x00000077:   DW_TAG_typedef
                DW_AT_type	(0x0000000000000082 "ByValue")
                DW_AT_name	("ByValueTD")
                DW_AT_decl_file	("/Users/gclayton/Documents/src/cc_calling/./ByValue.h")
                DW_AT_decl_line	(4)

0x00000082:   DW_TAG_structure_type
                DW_AT_name	("ByValue")
                DW_AT_declaration	(true)

0x00000087:   NULL


If we compile with -fno-limit-debug-info we get the "DW_AT_calling_convention (DW_CC_pass_by_value)":

0x0000000b: DW_TAG_compile_unit
              DW_AT_producer	("Apple LLVM version 10.0.1 (clang-1001.0.46.4)")
              DW_AT_language	(DW_LANG_C_plus_plus)
              DW_AT_name	("main.cpp")
              DW_AT_stmt_list	(0x00000000)
              DW_AT_comp_dir	("/Users/gclayton/Documents/src/cc_calling")
              DW_AT_low_pc	(0x0000000100000f90)
              DW_AT_high_pc	(0x0000000100000faf)

0x0000002a:   DW_TAG_subprogram
                DW_AT_low_pc	(0x0000000100000f90)
                DW_AT_high_pc	(0x0000000100000f9a)
                DW_AT_frame_base	(DW_OP_reg6 RBP)
                DW_AT_linkage_name	("_Z1fP7ByValue")
                DW_AT_name	("f")
                DW_AT_decl_file	("/Users/gclayton/Documents/src/cc_calling/main.cpp")
                DW_AT_decl_line	(3)
                DW_AT_external	(true)

0x00000043:     DW_TAG_formal_parameter
                  DW_AT_location	(DW_OP_fbreg -8)
                  DW_AT_name	("arg")
                  DW_AT_decl_file	("/Users/gclayton/Documents/src/cc_calling/main.cpp")
                  DW_AT_decl_line	(3)
                  DW_AT_type	(0x0000000000000072 "ByValueTD*")

0x00000051:     NULL

0x00000052:   DW_TAG_subprogram
                DW_AT_low_pc	(0x0000000100000fa0)
                DW_AT_high_pc	(0x0000000100000faf)
                DW_AT_frame_base	(DW_OP_reg6 RBP)
                DW_AT_name	("main")
                DW_AT_decl_file	("/Users/gclayton/Documents/src/cc_calling/main.cpp")
                DW_AT_decl_line	(5)
                DW_AT_type	(0x000000000000006b "int")
                DW_AT_external	(true)

0x0000006b:   DW_TAG_base_type
                DW_AT_name	("int")
                DW_AT_encoding	(DW_ATE_signed)
                DW_AT_byte_size	(0x04)

0x00000072:   DW_TAG_pointer_type
                DW_AT_type	(0x0000000000000077 "ByValueTD")

0x00000077:   DW_TAG_typedef
                DW_AT_type	(0x0000000000000082 "ByValue")
                DW_AT_name	("ByValueTD")
                DW_AT_decl_file	("/Users/gclayton/Documents/src/cc_calling/./ByValue.h")
                DW_AT_decl_line	(4)

0x00000082:   DW_TAG_structure_type
                DW_AT_calling_convention	(DW_CC_pass_by_value)
                DW_AT_name	("ByValue")
                DW_AT_byte_size	(0x01)
                DW_AT_decl_file	("/Users/gclayton/Documents/src/cc_calling/./ByValue.h")
                DW_AT_decl_line	(1)

0x0000008b:     DW_TAG_subprogram
                  DW_AT_name	("~ByValue")
                  DW_AT_decl_file	("/Users/gclayton/Documents/src/cc_calling/./ByValue.h")
                  DW_AT_decl_line	(2)
                  DW_AT_declaration	(true)
                  DW_AT_external	(true)

0x00000092:       DW_TAG_formal_parameter
                    DW_AT_type	(0x0000000000000099 "ByValue*")
                    DW_AT_artificial	(true)

0x00000097:       NULL

0x00000098:     NULL

0x00000099:   DW_TAG_pointer_type
                DW_AT_type	(0x0000000000000082 "ByValue")

0x0000009e:   NULL


> On Aug 4, 2019, at 11:28 AM, Saleem Abdulrasool <compnerd at compnerd.org> wrote:
> 
> On Wed, Jul 31, 2019 at 11:29 AM Greg Clayton via lldb-commits <lldb-commits at lists.llvm.org <mailto:lldb-commits at lists.llvm.org>> wrote:
> 
> 
> > On Jul 31, 2019, at 10:57 AM, Raphael Isemann <teemperor at gmail.com <mailto:teemperor at gmail.com>> wrote:
> > 
> > It seems that patch is lacking a test (which doesn't seem too hard to provide).
> 
> I am not the original author of this patch that was causing the crash, just fixing a crash that was introduced by the patch. 
> 
> Perhaps we should identify the original change and revert that instead?
>  
> I am all ears for anyone that can provide me with DWARF to help reproduce this scenario where we have a DW_CC_pass_by_value struct with no definition. Not sure how you would have a compiler that is passing a struct to a function as a parameter and yet does not emit debug info for that struct it is clearly using in the debug info.
> 
> Was this something that you noticed by inspection?  It doesn't sound like it, so we should be able to reduce something from what caused it to be triggered.  lldb has been better about adding test coverage, and I think that we should be encouraging that.  It really does help make it easier to make changes to the project where we can be sure that we don't cause regressions.
>  
> 
> > 
> > Am Mi., 31. Juli 2019 um 18:24 Uhr schrieb Greg Clayton via
> > lldb-commits <lldb-commits at lists.llvm.org <mailto:lldb-commits at lists.llvm.org>>:
> >> 
> >> Author: gclayton
> >> Date: Wed Jul 31 09:24:55 2019
> >> New Revision: 367441
> >> 
> >> URL: http://llvm.org/viewvc/llvm-project?rev=367441&view=rev <http://llvm.org/viewvc/llvm-project?rev=367441&view=rev>
> >> Log:
> >> Don't crash when pass by value struct has no definition.
> >> 
> >> 
> >> 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=367441&r1=367440&r2=367441&view=diff <http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp?rev=367441&r1=367440&r2=367441&view=diff>
> >> ==============================================================================
> >> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp (original)
> >> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp Wed Jul 31 09:24:55 2019
> >> @@ -1010,7 +1010,7 @@ TypeSP DWARFASTParserClang::ParseTypeFro
> >>     if (attrs.calling_convention == llvm::dwarf::DW_CC_pass_by_value) {
> >>       clang::CXXRecordDecl *record_decl =
> >>           m_ast.GetAsCXXRecordDecl(clang_type.GetOpaqueQualType());
> >> -      if (record_decl) {
> >> +      if (record_decl && record_decl->getDefinition()) {
> >>         record_decl->setHasTrivialSpecialMemberForCall();
> >>       }
> >>     }
> >> 
> >> 
> >> _______________________________________________
> >> lldb-commits mailing list
> >> lldb-commits at lists.llvm.org <mailto:lldb-commits at lists.llvm.org>
> >> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits <https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits>
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org <mailto:lldb-commits at lists.llvm.org>
> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits <https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits>
> 
> 
> -- 
> Saleem Abdulrasool
> compnerd (at) compnerd (dot) org

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20190805/0a36b2b4/attachment-0001.html>


More information about the lldb-commits mailing list