diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-09 21:23:57 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-09 21:23:57 +0000 | 
| commit | 6f2913059696064e80328b389e44b199c1af526d (patch) | |
| tree | 8d2b2aaa047af4efa941f90ee220f8099c1d1650 | |
| parent | a4092fcbfb39b4d32a8e152a110d20132779d538 (diff) | |
Vendor import of lldb trunk r291476:vendor/lldb/lldb-trunk-r291476
6 files changed, 120 insertions, 37 deletions
diff --git a/packages/Python/lldbsuite/test/python_api/value/empty_class/Makefile b/packages/Python/lldbsuite/test/python_api/value/empty_class/Makefile new file mode 100644 index 000000000000..314f1cb2f077 --- /dev/null +++ b/packages/Python/lldbsuite/test/python_api/value/empty_class/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules diff --git a/packages/Python/lldbsuite/test/python_api/value/empty_class/TestValueAPIEmptyClass.py b/packages/Python/lldbsuite/test/python_api/value/empty_class/TestValueAPIEmptyClass.py new file mode 100644 index 000000000000..c4b1e282590c --- /dev/null +++ b/packages/Python/lldbsuite/test/python_api/value/empty_class/TestValueAPIEmptyClass.py @@ -0,0 +1,60 @@ +from __future__ import print_function + +import os +import time +import re +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class ValueAPIEmptyClassTestCase(TestBase): + +    mydir = TestBase.compute_mydir(__file__) + +    @add_test_categories(['pyapi']) +    def test(self): +        self.build() +        exe = os.path.join(os.getcwd(), 'a.out') +        line = line_number('main.cpp', '// Break at this line') + +        # Create a target by the debugger. +        target = self.dbg.CreateTarget(exe) +        self.assertTrue(target, VALID_TARGET) + +        # Create the breakpoint inside function 'main'. +        breakpoint = target.BreakpointCreateByLocation('main.cpp', line) +        self.assertTrue(breakpoint, VALID_BREAKPOINT) + +        # Now launch the process, and do not stop at entry point. +        process = target.LaunchSimple( +            None, None, self.get_process_working_directory()) +        self.assertTrue(process, PROCESS_IS_VALID) + +        # Get Frame #0. +        self.assertTrue(process.GetState() == lldb.eStateStopped) +        thread = lldbutil.get_stopped_thread( +            process, lldb.eStopReasonBreakpoint) +        self.assertTrue( +            thread.IsValid(), +            "There should be a thread stopped due to breakpoint condition") +        frame0 = thread.GetFrameAtIndex(0) + +        # Verify that we can access to a frame variable with an empty class type +        e = frame0.FindVariable('e') +        self.assertTrue(e.IsValid(), VALID_VARIABLE) +        self.DebugSBValue(e) +        self.assertEqual(e.GetNumChildren(), 0) + +        # Verify that we can acces to a frame variable what is a pointer to an +        # empty class +        ep = frame0.FindVariable('ep') +        self.assertTrue(ep.IsValid(), VALID_VARIABLE) +        self.DebugSBValue(ep) + +        # Verify that we can dereference a pointer to an empty class +        epd = ep.Dereference() +        self.assertTrue(epd.IsValid(), VALID_VARIABLE) +        self.DebugSBValue(epd) +        self.assertEqual(epd.GetNumChildren(), 0) + diff --git a/packages/Python/lldbsuite/test/python_api/value/empty_class/main.cpp b/packages/Python/lldbsuite/test/python_api/value/empty_class/main.cpp new file mode 100644 index 000000000000..96b203526dbd --- /dev/null +++ b/packages/Python/lldbsuite/test/python_api/value/empty_class/main.cpp @@ -0,0 +1,16 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +class Empty {}; + +int main (int argc, char const *argv[]) { +  Empty e; +  Empty* ep = new Empty; +  return 0; // Break at this line +} diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt index 18389c6c69d5..fad841b37c09 100644 --- a/scripts/CMakeLists.txt +++ b/scripts/CMakeLists.txt @@ -11,8 +11,13 @@ set(SWIG_HEADERS  include(FindPythonInterp) -set(SWIG_PYTHON_DIR -  ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}) +if (NOT CMAKE_SYSTEM_NAME MATCHES "Windows") +  set(SWIG_PYTHON_DIR +    ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}) +else() +  set(SWIG_PYTHON_DIR ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/site-packages) +endif() +  set(SWIG_INSTALL_DIR lib${LLVM_LIBDIR_SUFFIX})  # Generating the LLDB framework correctly is a bit complicated because the @@ -48,10 +53,8 @@ set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/lldb.py PROPERTIES GENER  add_custom_target(swig_wrapper ALL DEPENDS ${LLDB_WRAP_PYTHON}) -# Install the LLDB python module on all operating systems (except Windows) -if (NOT CMAKE_SYSTEM_NAME MATCHES "Windows") -  install(DIRECTORY ${SWIG_PYTHON_DIR} DESTINATION ${SWIG_INSTALL_DIR}) -endif() +# Install the LLDB python module +install(DIRECTORY ${SWIG_PYTHON_DIR} DESTINATION ${SWIG_INSTALL_DIR})  # build Python modules  add_subdirectory(Python/modules) diff --git a/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp index 554b71a36c4f..c064d61d71d4 100644 --- a/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -2647,7 +2647,7 @@ bool DWARFASTParserClang::ParseChildMembers(    // 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; +      parent_die.GetAttributeValueAsUnsigned(DW_AT_byte_size, UINT64_MAX);    const uint64_t parent_bit_size =        parent_byte_size == UINT64_MAX ? UINT64_MAX : parent_byte_size * 8; diff --git a/source/Symbol/ClangASTContext.cpp b/source/Symbol/ClangASTContext.cpp index 3c817a409b03..3d37b7083b74 100644 --- a/source/Symbol/ClangASTContext.cpp +++ b/source/Symbol/ClangASTContext.cpp @@ -6752,43 +6752,42 @@ CompilerType ClangASTContext::GetChildCompilerTypeAtIndex(      }      break; -  case clang::Type::Pointer: -    if (idx_is_valid) { -      CompilerType pointee_clang_type(GetPointeeType(type)); +  case clang::Type::Pointer: { +    CompilerType pointee_clang_type(GetPointeeType(type)); -      // Don't dereference "void *" pointers -      if (pointee_clang_type.IsVoidType()) -        return CompilerType(); +    // Don't dereference "void *" pointers +    if (pointee_clang_type.IsVoidType()) +      return CompilerType(); -      if (transparent_pointers && pointee_clang_type.IsAggregateType()) { -        child_is_deref_of_parent = false; -        bool tmp_child_is_deref_of_parent = false; -        return pointee_clang_type.GetChildCompilerTypeAtIndex( -            exe_ctx, idx, transparent_pointers, omit_empty_base_classes, -            ignore_array_bounds, child_name, child_byte_size, child_byte_offset, -            child_bitfield_bit_size, child_bitfield_bit_offset, -            child_is_base_class, tmp_child_is_deref_of_parent, valobj, -            language_flags); -      } else { -        child_is_deref_of_parent = true; +    if (transparent_pointers && pointee_clang_type.IsAggregateType()) { +      child_is_deref_of_parent = false; +      bool tmp_child_is_deref_of_parent = false; +      return pointee_clang_type.GetChildCompilerTypeAtIndex( +          exe_ctx, idx, transparent_pointers, omit_empty_base_classes, +          ignore_array_bounds, child_name, child_byte_size, child_byte_offset, +          child_bitfield_bit_size, child_bitfield_bit_offset, +          child_is_base_class, tmp_child_is_deref_of_parent, valobj, +          language_flags); +    } else { +      child_is_deref_of_parent = true; -        const char *parent_name = -            valobj ? valobj->GetName().GetCString() : NULL; -        if (parent_name) { -          child_name.assign(1, '*'); -          child_name += parent_name; -        } +      const char *parent_name = +          valobj ? valobj->GetName().GetCString() : NULL; +      if (parent_name) { +        child_name.assign(1, '*'); +        child_name += parent_name; +      } -        // We have a pointer to an simple type -        if (idx == 0) { -          child_byte_size = pointee_clang_type.GetByteSize( -              exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL); -          child_byte_offset = 0; -          return pointee_clang_type; -        } +      // We have a pointer to an simple type +      if (idx == 0) { +        child_byte_size = pointee_clang_type.GetByteSize( +            exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL); +        child_byte_offset = 0; +        return pointee_clang_type;        }      }      break; +  }    case clang::Type::LValueReference:    case clang::Type::RValueReference:  | 
