If clang is generating bad debug info, do you think you should file a bug
against clang for that?

On Fri, Apr 29, 2016 at 2:32 PM Greg Clayton via lldb-commits <
lldb-commits@lists.llvm.org> wrote:

> Author: gclayton
> Date: Fri Apr 29 16:26:46 2016
> New Revision: 268110
>
> URL: http://llvm.org/viewvc/llvm-project?rev=268110&view=rev
> Log:
> Watch out for compilers that generate bad bitfield info. If the bit size
> of a bitfield member doesn't lie within the bit bounds of the type itself,
> just leave it out so we don't get clang asserting and killing our IDE when
> it gets unhappy with the information.
>
> https://llvm.org/bugs/show_bug.cgi?id=27515
> <rdar://problem/21082998>
>
>
> Modified:
>
> lldb/trunk/packages/Python/lldbsuite/test/lang/c/bitfields/TestBitfields.py
>     lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
>
> Modified:
> lldb/trunk/packages/Python/lldbsuite/test/lang/c/bitfields/TestBitfields.py
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/c/bitfields/TestBitfields.py?rev=268110&r1=268109&r2=268110&view=diff
>
> ==============================================================================
> ---
> lldb/trunk/packages/Python/lldbsuite/test/lang/c/bitfields/TestBitfields.py
> (original)
> +++
> lldb/trunk/packages/Python/lldbsuite/test/lang/c/bitfields/TestBitfields.py
> Fri Apr 29 16:26:46 2016
> @@ -22,7 +22,6 @@ class BitfieldsTestCase(TestBase):
>
>      @skipIfWindows # BitFields exhibit crashes in record layout on
> Windows (http://llvm.org/pr21800)
>      @skipIf("llvm.org/pr27510", oslist=["linux"], compiler="clang",
> compiler_version=[">=", "3.9"]) # expectedFailure, skip to avoid crash
> -    @skipIf("llvm.org/pr27515", oslist=["macosx"]) # Assertion failed:
> (Offset >= Size), function insertPadding CGRecordLayoutBuilder.cpp
>      def test_and_run_command(self):
>          """Test 'frame variable ...' on a variable with bitfields."""
>          self.build()
>
> 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=268110&r1=268109&r2=268110&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
> (original)
> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp Fri
> Apr 29 16:26:46 2016
> @@ -2645,6 +2645,10 @@ DWARFASTParserClang::ParseChildMembers(c
>      if (!parent_die)
>          return 0;
>
> +    // Get the parent byte size so we can verify any members will fit
> +    const uint64_t parent_byte_size =
> parent_die.GetAttributeValueAsUnsigned(DW_AT_byte_size, UINT64_MAX) * 8;
> +    const uint64_t parent_bit_size = parent_byte_size == UINT64_MAX ?
> UINT64_MAX : parent_byte_size * 8;
> +
>      uint32_t member_idx = 0;
>      BitfieldInfo last_field_info;
>
> @@ -2890,10 +2894,23 @@ DWARFASTParserClang::ParseChildMembers(c
>                                      if (byte_size == 0)
>                                          byte_size =
> member_type->GetByteSize();
>
> -                                    if
> (die.GetDWARF()->GetObjectFile()->GetByteOrder() == eByteOrderLittle)
> +                                    ObjectFile *objfile =
> die.GetDWARF()->GetObjectFile();
> +                                    if (objfile->GetByteOrder() ==
> eByteOrderLittle)
>                                      {
>                                          this_field_info.bit_offset +=
> byte_size * 8;
>                                          this_field_info.bit_offset -=
> (bit_offset + bit_size);
> +
> +                                        if (this_field_info.bit_offset >=
> parent_bit_size)
> +                                        {
> +
> objfile->GetModule()->ReportWarning("0x%8.8" PRIx64 ": %s bitfield named
> \"%s\" has invalid bit offset (0x%8.8" PRIx64 ") member will be ignored.
> Please file a bug against the compiler and include the preprocessed output
> for %s\n",
> +
>       die.GetID(),
> +
>       DW_TAG_value_to_name(tag),
> +
>       name,
> +
>       this_field_info.bit_offset,
> +
>       sc.comp_unit ? sc.comp_unit->GetPath().c_str() : "the source file");
> +                                            this_field_info.Clear();
> +                                            continue;
> +                                        }
>                                      }
>                                      else
>                                      {
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to