Author: gclayton Date: Fri Jun 24 18:48:00 2016 New Revision: 273750 URL: http://llvm.org/viewvc/llvm-project?rev=273750&view=rev Log: Made templates that have Enumeration values as arguments work correctly.
We were checking for integer types only before this. So I added the ability for CompilerType objects to check for integer and enum types. Then I searched for places that were using the CompilerType::IsIntegerType(...) function. Many of these places also wanted to be checking for enumeration types as well, so I have fixed those places. These are in the ABI plug-ins where we are figuring out which arguments would go in where in regisers/stack when making a function call, or determining where the return value would live. The real fix for this is to use clang to compiler a CGFunctionInfo and then modify the code to be able to take the IR and a calling convention and have the backend answer the questions correctly for us so we don't need to create a really bad copy of the ABI in each plug-in, but that is beyond the scope of this bug fix. Also added a test case to ensure this doesn't regress in the future. Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h lldb/trunk/include/lldb/Symbol/CompilerType.h lldb/trunk/include/lldb/Symbol/TypeSystem.h lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/template/TestTemplateIntegerArgs.py lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/template/main.cpp lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp lldb/trunk/source/Plugins/ABI/MacOSX-arm64/ABIMacOSX_arm64.cpp lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp lldb/trunk/source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp lldb/trunk/source/Plugins/ABI/SysV-arm64/ABISysV_arm64.cpp lldb/trunk/source/Plugins/ABI/SysV-i386/ABISysV_i386.cpp lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.cpp lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.cpp lldb/trunk/source/Plugins/ABI/SysV-ppc/ABISysV_ppc.cpp lldb/trunk/source/Plugins/ABI/SysV-ppc64/ABISysV_ppc64.cpp lldb/trunk/source/Plugins/ABI/SysV-s390x/ABISysV_s390x.cpp lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp lldb/trunk/source/Symbol/ClangASTContext.cpp lldb/trunk/source/Symbol/CompilerType.cpp Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTContext.h?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/ClangASTContext.h (original) +++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h Fri Jun 24 18:48:00 2016 @@ -689,7 +689,10 @@ public: bool IsIntegerType (lldb::opaque_compiler_type_t type, bool &is_signed) override; - + + bool + IsEnumerationType (lldb::opaque_compiler_type_t type, bool &is_signed) override; + static bool IsObjCClassType (const CompilerType& type); Modified: lldb/trunk/include/lldb/Symbol/CompilerType.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/CompilerType.h?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/CompilerType.h (original) +++ lldb/trunk/include/lldb/Symbol/CompilerType.h Fri Jun 24 18:48:00 2016 @@ -153,7 +153,13 @@ public: bool IsIntegerType (bool &is_signed) const; - + + bool + IsEnumerationType (bool &is_signed) const; + + bool + IsIntegerOrEnumerationType (bool &is_signed) const; + bool IsPolymorphicClass () const; Modified: lldb/trunk/include/lldb/Symbol/TypeSystem.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/TypeSystem.h?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/TypeSystem.h (original) +++ lldb/trunk/include/lldb/Symbol/TypeSystem.h Fri Jun 24 18:48:00 2016 @@ -208,7 +208,14 @@ public: virtual bool IsIntegerType (lldb::opaque_compiler_type_t type, bool &is_signed) = 0; - + + virtual bool + IsEnumerationType (lldb::opaque_compiler_type_t type, bool &is_signed) + { + is_signed = false; + return false; + } + virtual bool IsPossibleDynamicType (lldb::opaque_compiler_type_t type, CompilerType *target_type, // Can pass NULL Modified: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/template/TestTemplateIntegerArgs.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/template/TestTemplateIntegerArgs.py?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/template/TestTemplateIntegerArgs.py (original) +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/template/TestTemplateIntegerArgs.py Fri Jun 24 18:48:00 2016 @@ -47,6 +47,7 @@ class TemplateIntegerArgsTestCase(TestBa testpos = frame.FindVariable('testpos') self.assertTrue(testpos.IsValid(), 'make sure we find a local variabble named "testpos"') self.assertTrue(testpos.GetType().GetName() == 'TestObj<1>') + expr_result = frame.EvaluateExpression("testpos.getArg()") self.assertTrue(expr_result.IsValid(), 'got a valid expression result from expression "testpos.getArg()"'); self.assertTrue(expr_result.GetValue() == "1", "testpos.getArg() == 1") @@ -60,3 +61,23 @@ class TemplateIntegerArgsTestCase(TestBa self.assertTrue(expr_result.IsValid(), 'got a valid expression result from expression "testneg.getArg()"'); self.assertTrue(expr_result.GetValue() == "-1", "testneg.getArg() == -1") self.assertTrue(expr_result.GetType().GetName() == "int", 'expr_result.GetType().GetName() == "int"') + + # Make sure "member" can be displayed and also used in an expression correctly + member = frame.FindVariable('member') + self.assertTrue(member.IsValid(), 'make sure we find a local variabble named "member"') + self.assertTrue(member.GetType().GetName() == 'EnumTemplate<EnumType::Member>') + + expr_result = frame.EvaluateExpression("member.getMember()") + self.assertTrue(expr_result.IsValid(), 'got a valid expression result from expression "member.getMember()"'); + self.assertTrue(expr_result.GetValue() == "123", "member.getMember() == 123") + self.assertTrue(expr_result.GetType().GetName() == "int", 'expr_result.GetType().GetName() == "int"') + + # Make sure "subclass" can be displayed and also used in an expression correctly + subclass = frame.FindVariable('subclass') + self.assertTrue(subclass.IsValid(), 'make sure we find a local variabble named "subclass"') + self.assertTrue(subclass.GetType().GetName() == 'EnumTemplate<EnumType::Subclass>') + + expr_result = frame.EvaluateExpression("subclass.getMember()") + self.assertTrue(expr_result.IsValid(), 'got a valid expression result from expression "subclass.getMember()"'); + self.assertTrue(expr_result.GetValue() == "246", "subclass.getMember() == 246") + self.assertTrue(expr_result.GetType().GetName() == "int", 'expr_result.GetType().GetName() == "int"') Modified: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/template/main.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/template/main.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/template/main.cpp (original) +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/template/main.cpp Fri Jun 24 18:48:00 2016 @@ -17,9 +17,56 @@ public: } }; +//---------------------------------------------------------------------- +// Define a template class that we can specialize with an enumeration +//---------------------------------------------------------------------- +enum class EnumType +{ + Member, + Subclass +}; + +template <EnumType Arg> class EnumTemplate; + +//---------------------------------------------------------------------- +// Specialization for use when "Arg" is "EnumType::Member" +//---------------------------------------------------------------------- +template <> +class EnumTemplate<EnumType::Member> +{ +public: + EnumTemplate(int m) : + m_member(m) + { + } + + int getMember() const + { + return m_member; + } + +protected: + int m_member; +}; + +//---------------------------------------------------------------------- +// Specialization for use when "Arg" is "EnumType::Subclass" +//---------------------------------------------------------------------- +template <> +class EnumTemplate<EnumType::Subclass> : + public EnumTemplate<EnumType::Member> +{ +public: + EnumTemplate(int m) : EnumTemplate<EnumType::Member>(m) + { + } +}; + int main(int argc, char **argv) { TestObj<1> testpos; TestObj<-1> testneg; - return testpos.getArg() - testneg.getArg(); // Breakpoint 1 + EnumTemplate<EnumType::Member> member(123); + EnumTemplate<EnumType::Subclass> subclass(123*2); + return testpos.getArg() - testneg.getArg() + member.getMember()*2 - subclass.getMember(); // Breakpoint 1 } Modified: lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp (original) +++ lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp Fri Jun 24 18:48:00 2016 @@ -341,7 +341,7 @@ ABIMacOSX_arm::GetArgumentValues (Thread { bool is_signed = false; size_t bit_width = 0; - if (compiler_type.IsIntegerType (is_signed)) + if (compiler_type.IsIntegerOrEnumerationType (is_signed)) { bit_width = compiler_type.GetBitSize(&thread); } @@ -459,7 +459,7 @@ ABIMacOSX_arm::GetReturnValueObjectImpl // when reading data const RegisterInfo *r0_reg_info = reg_ctx->GetRegisterInfoByName("r0", 0); - if (compiler_type.IsIntegerType (is_signed)) + if (compiler_type.IsIntegerOrEnumerationType (is_signed)) { size_t bit_width = compiler_type.GetBitSize(&thread); @@ -598,7 +598,7 @@ ABIMacOSX_arm::SetReturnValueObject(lldb RegisterContext *reg_ctx = thread->GetRegisterContext().get(); bool set_it_simple = false; - if (compiler_type.IsIntegerType (is_signed) || compiler_type.IsPointerType()) + if (compiler_type.IsIntegerOrEnumerationType (is_signed) || compiler_type.IsPointerType()) { DataExtractor data; Error data_error; Modified: lldb/trunk/source/Plugins/ABI/MacOSX-arm64/ABIMacOSX_arm64.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-arm64/ABIMacOSX_arm64.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ABI/MacOSX-arm64/ABIMacOSX_arm64.cpp (original) +++ lldb/trunk/source/Plugins/ABI/MacOSX-arm64/ABIMacOSX_arm64.cpp Fri Jun 24 18:48:00 2016 @@ -327,7 +327,7 @@ ABIMacOSX_arm64::GetArgumentValues (Thre { bool is_signed = false; size_t bit_width = 0; - if (value_type.IsIntegerType (is_signed)) + if (value_type.IsIntegerOrEnumerationType (is_signed)) { bit_width = value_type.GetBitSize(&thread); } Modified: lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp (original) +++ lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp Fri Jun 24 18:48:00 2016 @@ -315,7 +315,7 @@ ABIMacOSX_i386::GetArgumentValues (Threa { bool is_signed; - if (compiler_type.IsIntegerType (is_signed)) + if (compiler_type.IsIntegerOrEnumerationType (is_signed)) { ReadIntegerArgument(value->GetScalar(), compiler_type.GetBitSize(&thread), @@ -363,7 +363,7 @@ ABIMacOSX_i386::SetReturnValueObject(lld RegisterContext *reg_ctx = thread->GetRegisterContext().get(); bool set_it_simple = false; - if (compiler_type.IsIntegerType (is_signed) || compiler_type.IsPointerType()) + if (compiler_type.IsIntegerOrEnumerationType (is_signed) || compiler_type.IsPointerType()) { DataExtractor data; Error data_error; @@ -436,7 +436,7 @@ ABIMacOSX_i386::GetReturnValueObjectImpl bool is_signed; - if (compiler_type.IsIntegerType (is_signed)) + if (compiler_type.IsIntegerOrEnumerationType (is_signed)) { size_t bit_width = compiler_type.GetBitSize(&thread); Modified: lldb/trunk/source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp (original) +++ lldb/trunk/source/Plugins/ABI/SysV-arm/ABISysV_arm.cpp Fri Jun 24 18:48:00 2016 @@ -341,7 +341,7 @@ ABISysV_arm::GetArgumentValues (Thread & { bool is_signed = false; size_t bit_width = 0; - if (compiler_type.IsIntegerType (is_signed)) + if (compiler_type.IsIntegerOrEnumerationType (is_signed)) { bit_width = compiler_type.GetBitSize(&thread); } @@ -463,7 +463,7 @@ ABISysV_arm::GetReturnValueObjectImpl (T size_t bit_width = compiler_type.GetBitSize(&thread); size_t byte_size = compiler_type.GetByteSize(&thread); - if (compiler_type.IsIntegerType (is_signed)) + if (compiler_type.IsIntegerOrEnumerationType (is_signed)) { switch (bit_width) { @@ -775,7 +775,7 @@ ABISysV_arm::SetReturnValueObject(lldb:: RegisterContext *reg_ctx = thread->GetRegisterContext().get(); bool set_it_simple = false; - if (compiler_type.IsIntegerType (is_signed) || compiler_type.IsPointerType()) + if (compiler_type.IsIntegerOrEnumerationType (is_signed) || compiler_type.IsPointerType()) { DataExtractor data; Error data_error; Modified: lldb/trunk/source/Plugins/ABI/SysV-arm64/ABISysV_arm64.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-arm64/ABISysV_arm64.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ABI/SysV-arm64/ABISysV_arm64.cpp (original) +++ lldb/trunk/source/Plugins/ABI/SysV-arm64/ABISysV_arm64.cpp Fri Jun 24 18:48:00 2016 @@ -322,7 +322,7 @@ ABISysV_arm64::GetArgumentValues (Thread { bool is_signed = false; size_t bit_width = 0; - if (value_type.IsIntegerType (is_signed)) + if (value_type.IsIntegerOrEnumerationType (is_signed)) { bit_width = value_type.GetBitSize(&thread); } Modified: lldb/trunk/source/Plugins/ABI/SysV-i386/ABISysV_i386.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-i386/ABISysV_i386.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ABI/SysV-i386/ABISysV_i386.cpp (original) +++ lldb/trunk/source/Plugins/ABI/SysV-i386/ABISysV_i386.cpp Fri Jun 24 18:48:00 2016 @@ -325,7 +325,7 @@ ABISysV_i386::GetArgumentValues (Thread if (compiler_type) { bool is_signed; - if (compiler_type.IsIntegerType (is_signed)) + if (compiler_type.IsIntegerOrEnumerationType (is_signed)) { ReadIntegerArgument(value->GetScalar(), compiler_type.GetBitSize(&thread), Modified: lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.cpp (original) +++ lldb/trunk/source/Plugins/ABI/SysV-mips/ABISysV_mips.cpp Fri Jun 24 18:48:00 2016 @@ -322,7 +322,7 @@ ABISysV_mips::SetReturnValueObject(lldb: RegisterContext *reg_ctx = thread->GetRegisterContext().get(); bool set_it_simple = false; - if (compiler_type.IsIntegerType (is_signed) || compiler_type.IsPointerType()) + if (compiler_type.IsIntegerOrEnumerationType (is_signed) || compiler_type.IsPointerType()) { DataExtractor data; Error data_error; @@ -414,7 +414,7 @@ ABISysV_mips::GetReturnValueObjectImpl ( // In MIPS register "r2" (v0) holds the integer function return values const RegisterInfo *r2_reg_info = reg_ctx->GetRegisterInfoByName("r2", 0); size_t bit_width = return_compiler_type.GetBitSize(&thread); - if (return_compiler_type.IsIntegerType (is_signed)) + if (return_compiler_type.IsIntegerOrEnumerationType (is_signed)) { switch (bit_width) { Modified: lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.cpp (original) +++ lldb/trunk/source/Plugins/ABI/SysV-mips64/ABISysV_mips64.cpp Fri Jun 24 18:48:00 2016 @@ -686,7 +686,7 @@ ABISysV_mips64::GetReturnValueObjectImpl uint32_t field_byte_offset = field_bit_offset/8; - if (field_compiler_type.IsIntegerType (is_signed) + if (field_compiler_type.IsIntegerOrEnumerationType (is_signed) || field_compiler_type.IsPointerType () || field_compiler_type.IsFloatingPointType (count, is_complex)) { Modified: lldb/trunk/source/Plugins/ABI/SysV-ppc/ABISysV_ppc.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-ppc/ABISysV_ppc.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ABI/SysV-ppc/ABISysV_ppc.cpp (original) +++ lldb/trunk/source/Plugins/ABI/SysV-ppc/ABISysV_ppc.cpp Fri Jun 24 18:48:00 2016 @@ -403,7 +403,7 @@ ABISysV_ppc::GetArgumentValues (Thread & return false; bool is_signed; - if (compiler_type.IsIntegerType (is_signed)) + if (compiler_type.IsIntegerOrEnumerationType (is_signed)) { ReadIntegerArgument(value->GetScalar(), compiler_type.GetBitSize(&thread), @@ -454,7 +454,7 @@ ABISysV_ppc::SetReturnValueObject(lldb:: RegisterContext *reg_ctx = thread->GetRegisterContext().get(); bool set_it_simple = false; - if (compiler_type.IsIntegerType (is_signed) || compiler_type.IsPointerType()) + if (compiler_type.IsIntegerOrEnumerationType (is_signed) || compiler_type.IsPointerType()) { const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName("r3", 0); @@ -755,7 +755,7 @@ ABISysV_ppc::GetReturnValueObjectImpl (T DataExtractor *copy_from_extractor = nullptr; uint32_t copy_from_offset = 0; - if (field_compiler_type.IsIntegerType (is_signed) || field_compiler_type.IsPointerType ()) + if (field_compiler_type.IsIntegerOrEnumerationType (is_signed) || field_compiler_type.IsPointerType ()) { if (integer_bytes < 8) { @@ -819,7 +819,7 @@ ABISysV_ppc::GetReturnValueObjectImpl (T &next_field_bit_offset, nullptr, nullptr); - if (next_field_compiler_type.IsIntegerType (is_signed)) + if (next_field_compiler_type.IsIntegerOrEnumerationType (is_signed)) in_gpr = true; else { @@ -842,7 +842,7 @@ ABISysV_ppc::GetReturnValueObjectImpl (T &prev_field_bit_offset, nullptr, nullptr); - if (prev_field_compiler_type.IsIntegerType (is_signed)) + if (prev_field_compiler_type.IsIntegerOrEnumerationType (is_signed)) in_gpr = true; else { Modified: lldb/trunk/source/Plugins/ABI/SysV-ppc64/ABISysV_ppc64.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-ppc64/ABISysV_ppc64.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ABI/SysV-ppc64/ABISysV_ppc64.cpp (original) +++ lldb/trunk/source/Plugins/ABI/SysV-ppc64/ABISysV_ppc64.cpp Fri Jun 24 18:48:00 2016 @@ -403,7 +403,7 @@ ABISysV_ppc64::GetArgumentValues (Thread return false; bool is_signed; - if (compiler_type.IsIntegerType (is_signed)) + if (compiler_type.IsIntegerOrEnumerationType (is_signed)) { ReadIntegerArgument(value->GetScalar(), compiler_type.GetBitSize(&thread), @@ -454,7 +454,7 @@ ABISysV_ppc64::SetReturnValueObject(lldb RegisterContext *reg_ctx = thread->GetRegisterContext().get(); bool set_it_simple = false; - if (compiler_type.IsIntegerType (is_signed) || compiler_type.IsPointerType()) + if (compiler_type.IsIntegerOrEnumerationType (is_signed) || compiler_type.IsPointerType()) { const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName("r3", 0); @@ -755,7 +755,7 @@ ABISysV_ppc64::GetReturnValueObjectImpl DataExtractor *copy_from_extractor = nullptr; uint32_t copy_from_offset = 0; - if (field_compiler_type.IsIntegerType (is_signed) || field_compiler_type.IsPointerType ()) + if (field_compiler_type.IsIntegerOrEnumerationType (is_signed) || field_compiler_type.IsPointerType ()) { if (integer_bytes < 8) { @@ -820,7 +820,7 @@ ABISysV_ppc64::GetReturnValueObjectImpl &next_field_bit_offset, nullptr, nullptr); - if (next_field_compiler_type.IsIntegerType (is_signed)) + if (next_field_compiler_type.IsIntegerOrEnumerationType (is_signed)) in_gpr = true; else { @@ -843,7 +843,7 @@ ABISysV_ppc64::GetReturnValueObjectImpl &prev_field_bit_offset, nullptr, nullptr); - if (prev_field_compiler_type.IsIntegerType (is_signed)) + if (prev_field_compiler_type.IsIntegerOrEnumerationType (is_signed)) in_gpr = true; else { Modified: lldb/trunk/source/Plugins/ABI/SysV-s390x/ABISysV_s390x.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-s390x/ABISysV_s390x.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ABI/SysV-s390x/ABISysV_s390x.cpp (original) +++ lldb/trunk/source/Plugins/ABI/SysV-s390x/ABISysV_s390x.cpp Fri Jun 24 18:48:00 2016 @@ -396,7 +396,7 @@ ABISysV_s390x::GetArgumentValues(Thread return false; bool is_signed; - if (compiler_type.IsIntegerType(is_signed)) + if (compiler_type.IsIntegerOrEnumerationType(is_signed)) { ReadIntegerArgument(value->GetScalar(), compiler_type.GetBitSize(&thread), is_signed, thread, argument_register_ids, current_argument_register, current_stack_argument); @@ -437,7 +437,7 @@ ABISysV_s390x::SetReturnValueObject(lldb RegisterContext *reg_ctx = thread->GetRegisterContext().get(); bool set_it_simple = false; - if (compiler_type.IsIntegerType(is_signed) || compiler_type.IsPointerType()) + if (compiler_type.IsIntegerOrEnumerationType(is_signed) || compiler_type.IsPointerType()) { const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName("r2", 0); Modified: lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp (original) +++ lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp Fri Jun 24 18:48:00 2016 @@ -432,7 +432,7 @@ ABISysV_x86_64::GetArgumentValues (Threa return false; bool is_signed; - if (compiler_type.IsIntegerType (is_signed)) + if (compiler_type.IsIntegerOrEnumerationType (is_signed)) { ReadIntegerArgument(value->GetScalar(), compiler_type.GetBitSize(&thread), @@ -483,7 +483,7 @@ ABISysV_x86_64::SetReturnValueObject(lld RegisterContext *reg_ctx = thread->GetRegisterContext().get(); bool set_it_simple = false; - if (compiler_type.IsIntegerType (is_signed) || compiler_type.IsPointerType()) + if (compiler_type.IsIntegerOrEnumerationType (is_signed) || compiler_type.IsPointerType()) { const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName("rax", 0); @@ -844,7 +844,7 @@ ABISysV_x86_64::GetReturnValueObjectImpl DataExtractor *copy_from_extractor = nullptr; uint32_t copy_from_offset = 0; - if (field_compiler_type.IsIntegerType (is_signed) || field_compiler_type.IsPointerType ()) + if (field_compiler_type.IsIntegerOrEnumerationType (is_signed) || field_compiler_type.IsPointerType ()) { if (integer_bytes < 8) { @@ -914,7 +914,7 @@ ABISysV_x86_64::GetReturnValueObjectImpl &next_field_bit_offset, nullptr, nullptr); - if (next_field_compiler_type.IsIntegerType (is_signed)) + if (next_field_compiler_type.IsIntegerOrEnumerationType (is_signed)) in_gpr = true; else { @@ -937,7 +937,7 @@ ABISysV_x86_64::GetReturnValueObjectImpl &prev_field_bit_offset, nullptr, nullptr); - if (prev_field_compiler_type.IsIntegerType (is_signed)) + if (prev_field_compiler_type.IsIntegerOrEnumerationType (is_signed)) in_gpr = true; else { 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=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp Fri Jun 24 18:48:00 2016 @@ -1995,8 +1995,7 @@ DWARFASTParserClang::ParseTemplateDIE (c { DWARFAttributes attributes; const size_t num_attributes = die.GetAttributes (attributes); - const char *name = NULL; - Type *lldb_type = NULL; + const char *name = nullptr; CompilerType clang_type; uint64_t uval64 = 0; bool uval64_valid = false; @@ -2017,7 +2016,7 @@ DWARFASTParserClang::ParseTemplateDIE (c case DW_AT_type: if (attributes.ExtractFormValueAtIndex(i, form_value)) { - lldb_type = die.ResolveTypeUID(DIERef(form_value)); + Type *lldb_type = die.ResolveTypeUID(DIERef(form_value)); if (lldb_type) clang_type = lldb_type->GetForwardCompilerType (); } @@ -2047,12 +2046,12 @@ DWARFASTParserClang::ParseTemplateDIE (c else template_param_infos.names.push_back(NULL); - if (tag == DW_TAG_template_value_parameter && - lldb_type != NULL && - clang_type.IsIntegerType (is_signed) && - uval64_valid) + // Get the signed value for any integer or enumeration if available + clang_type.IsIntegerOrEnumerationType (is_signed); + + if (tag == DW_TAG_template_value_parameter && uval64_valid) { - llvm::APInt apint (lldb_type->GetByteSize() * 8, uval64, is_signed); + llvm::APInt apint (clang_type.GetBitSize(nullptr), uval64, is_signed); template_param_infos.args.push_back( clang::TemplateArgument(*ast, llvm::APSInt(apint, !is_signed), ClangUtil::GetQualType(clang_type))); } Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Symbol/ClangASTContext.cpp (original) +++ lldb/trunk/source/Symbol/ClangASTContext.cpp Fri Jun 24 18:48:00 2016 @@ -3293,6 +3293,23 @@ ClangASTContext::IsIntegerType (lldb::op } bool +ClangASTContext::IsEnumerationType(lldb::opaque_compiler_type_t type, bool &is_signed) +{ + if (type) + { + const clang::EnumType *enum_type = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type)->getCanonicalTypeInternal()); + + if (enum_type) + { + IsIntegerType(enum_type->getDecl()->getIntegerType().getAsOpaquePtr(), is_signed); + return true; + } + } + + return false; +} + +bool ClangASTContext::IsPointerType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type) { if (type) Modified: lldb/trunk/source/Symbol/CompilerType.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/CompilerType.cpp?rev=273750&r1=273749&r2=273750&view=diff ============================================================================== --- lldb/trunk/source/Symbol/CompilerType.cpp (original) +++ lldb/trunk/source/Symbol/CompilerType.cpp Fri Jun 24 18:48:00 2016 @@ -196,6 +196,20 @@ CompilerType::IsIntegerType (bool &is_si } bool +CompilerType::IsEnumerationType (bool &is_signed) const +{ + if (IsValid()) + return m_type_system->IsEnumerationType(m_type, is_signed); + return false; +} + +bool +CompilerType::IsIntegerOrEnumerationType (bool &is_signed) const +{ + return IsIntegerType(is_signed) || IsEnumerationType(is_signed); +} + +bool CompilerType::IsPointerType (CompilerType *pointee_type) const { if (IsValid()) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits