[Lldb-commits] [lldb] r268098 - Make sure LLDB can deal with forward declarations to enums without crashing or asserting.
Chaoren Lin via lldb-commits
lldb-commits at lists.llvm.org
Fri Apr 29 16:33:02 PDT 2016
+ self.expect('frame variable f.op', DATA_TYPES_DISPLAYED_CORRECTLY,
substrs = ['ops *', 'f.op', '*0x0000000000000000*'])
+ self.expect('frame variable *f.op', DATA_TYPES_DISPLAYED_CORRECTLY,
substrs = ['ops', '*f.op', '<parent is NULL>'])
+ self.expect('expr f.op', DATA_TYPES_DISPLAYED_CORRECTLY, substrs =
['ops *', '$', '*0x0000000000000000*'])
+ self.expect('expr *f.op', DATA_TYPES_DISPLAYED_CORRECTLY, substrs
= ['error:'], error = True)
These break on 32 bit machines I think. We should probably use something
like 0x0+.
On Fri, Apr 29, 2016 at 1:48 PM, Greg Clayton via lldb-commits <
lldb-commits at lists.llvm.org> wrote:
> Author: gclayton
> Date: Fri Apr 29 15:48:39 2016
> New Revision: 268098
>
> URL: http://llvm.org/viewvc/llvm-project?rev=268098&view=rev
> Log:
> Make sure LLDB can deal with forward declarations to enums without
> crashing or asserting.
>
> <rdar://problem/23776428>
>
>
> Modified:
>
> lldb/trunk/packages/Python/lldbsuite/test/lang/c/enum_types/TestEnumTypes.py
> lldb/trunk/packages/Python/lldbsuite/test/lang/c/enum_types/main.c
> lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
> lldb/trunk/source/Symbol/ClangASTContext.cpp
>
> Modified:
> lldb/trunk/packages/Python/lldbsuite/test/lang/c/enum_types/TestEnumTypes.py
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/c/enum_types/TestEnumTypes.py?rev=268098&r1=268097&r2=268098&view=diff
>
> ==============================================================================
> ---
> lldb/trunk/packages/Python/lldbsuite/test/lang/c/enum_types/TestEnumTypes.py
> (original)
> +++
> lldb/trunk/packages/Python/lldbsuite/test/lang/c/enum_types/TestEnumTypes.py
> Fri Apr 29 15:48:39 2016
> @@ -63,7 +63,14 @@ class EnumTypesTestCase(TestBase):
> 'Sunday',
> 'kNumDays',
> '5'];
> -
> +
> + # Make sure a pointer to an anonymous enum type does crash LLDB
> and displays correctly using
> + # frame variable and expression commands
> + self.expect('frame variable f.op',
> DATA_TYPES_DISPLAYED_CORRECTLY, substrs = ['ops *', 'f.op',
> '0x0000000000000000'])
> + self.expect('frame variable *f.op',
> DATA_TYPES_DISPLAYED_CORRECTLY, substrs = ['ops', '*f.op', '<parent is
> NULL>'])
> + self.expect('expr f.op', DATA_TYPES_DISPLAYED_CORRECTLY, substrs
> = ['ops *', '$', '0x0000000000000000'])
> + self.expect('expr *f.op', DATA_TYPES_DISPLAYED_CORRECTLY, substrs
> = ['error:'], error = True)
> +
> bkpt = self.target().FindBreakpointByID(bkpt_id)
> for enum_value in enum_values:
> self.expect("frame variable day", 'check for valid
> enumeration value',
>
> Modified:
> lldb/trunk/packages/Python/lldbsuite/test/lang/c/enum_types/main.c
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/c/enum_types/main.c?rev=268098&r1=268097&r2=268098&view=diff
>
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/c/enum_types/main.c
> (original)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/c/enum_types/main.c Fri
> Apr 29 15:48:39 2016
> @@ -8,6 +8,15 @@
>
> //===----------------------------------------------------------------------===//
> #include <stdio.h>
>
> +#include <stdio.h>
> +
> +// Forward declare an enumeration (only works in C, not C++)
> +typedef enum ops ops;
> +
> +struct foo {
> + ops *op;
> +};
> +
> int main (int argc, char const *argv[])
> {
> enum days {
> @@ -21,6 +30,8 @@ int main (int argc, char const *argv[])
> kNumDays
> };
> enum days day;
> + struct foo f;
> + f.op = NULL;
> for (day = Monday - 1; day <= kNumDays + 1; day++)
> {
> printf("day as int is %i\n", (int)day); // Set break point at
> this line.
>
> 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=268098&r1=268097&r2=268098&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
> (original)
> +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp Fri
> Apr 29 15:48:39 2016
> @@ -1011,9 +1011,18 @@ DWARFASTParserClang::ParseTypeFromDWARF
> }
>
> if (!enumerator_clang_type)
> - enumerator_clang_type =
> m_ast.GetBuiltinTypeForDWARFEncodingAndBitSize (NULL,
> -
> DW_ATE_signed,
> -
> byte_size * 8);
> + {
> + if (byte_size > 0)
> + {
> + enumerator_clang_type =
> m_ast.GetBuiltinTypeForDWARFEncodingAndBitSize(NULL,
> +
> DW_ATE_signed,
> +
> byte_size * 8);
> + }
> + else
> + {
> + enumerator_clang_type =
> m_ast.GetBasicType(eBasicTypeInt);
> + }
> + }
>
> clang_type = m_ast.CreateEnumerationType
> (type_name_cstr,
>
> GetClangDeclContextContainingDIE (die, nullptr),
>
> Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=268098&r1=268097&r2=268098&view=diff
>
> ==============================================================================
> --- lldb/trunk/source/Symbol/ClangASTContext.cpp (original)
> +++ lldb/trunk/source/Symbol/ClangASTContext.cpp Fri Apr 29 15:48:39 2016
> @@ -8545,24 +8545,28 @@ ClangASTContext::CompleteTagDeclarationD
> clang::ASTContext *ast = lldb_ast->getASTContext();
>
> /// TODO This really needs to be fixed.
> -
> - unsigned NumPositiveBits = 1;
> - unsigned NumNegativeBits = 0;
> -
> - clang::QualType promotion_qual_type;
> - // If the enum integer type is less than an integer
> in bit width,
> - // then we must promote it to an integer size.
> - if (ast->getTypeSize(enum_decl->getIntegerType()) <
> ast->getTypeSize(ast->IntTy))
> +
> + QualType integer_type(enum_decl->getIntegerType());
> + if (!integer_type.isNull())
> {
> - if
> (enum_decl->getIntegerType()->isSignedIntegerType())
> - promotion_qual_type = ast->IntTy;
> + unsigned NumPositiveBits = 1;
> + unsigned NumNegativeBits = 0;
> +
> + clang::QualType promotion_qual_type;
> + // If the enum integer type is less than an
> integer in bit width,
> + // then we must promote it to an integer size.
> + if (ast->getTypeSize(enum_decl->getIntegerType())
> < ast->getTypeSize(ast->IntTy))
> + {
> + if
> (enum_decl->getIntegerType()->isSignedIntegerType())
> + promotion_qual_type = ast->IntTy;
> + else
> + promotion_qual_type = ast->UnsignedIntTy;
> + }
> else
> - promotion_qual_type = ast->UnsignedIntTy;
> + promotion_qual_type =
> enum_decl->getIntegerType();
> +
> +
> enum_decl->completeDefinition(enum_decl->getIntegerType(),
> promotion_qual_type, NumPositiveBits, NumNegativeBits);
> }
> - else
> - promotion_qual_type = enum_decl->getIntegerType();
> -
> -
> enum_decl->completeDefinition(enum_decl->getIntegerType(),
> promotion_qual_type, NumPositiveBits, NumNegativeBits);
> }
> return true;
> }
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160429/898d21dd/attachment.html>
More information about the lldb-commits
mailing list