diff options
Diffstat (limited to 'scripts/Python')
| -rw-r--r-- | scripts/Python/android/host_art_bt.py | 237 | ||||
| -rwxr-xr-x | scripts/Python/finish-swig-Python-LLDB.sh | 310 | ||||
| -rw-r--r-- | scripts/Python/finishSwigPythonLLDB.py | 945 | ||||
| -rw-r--r-- | scripts/Python/modify-python-lldb.py | 500 | ||||
| -rw-r--r-- | scripts/Python/modules/CMakeLists.txt | 11 | ||||
| -rw-r--r-- | scripts/Python/modules/readline/CMakeLists.txt | 27 | ||||
| -rw-r--r-- | scripts/Python/modules/readline/readline.cpp | 87 | ||||
| -rw-r--r-- | scripts/Python/prepare_binding_Python.py | 441 | ||||
| -rw-r--r-- | scripts/Python/python-extensions.swig | 1239 | ||||
| -rw-r--r-- | scripts/Python/python-swigsafecast.swig | 154 | ||||
| -rw-r--r-- | scripts/Python/python-typemaps.swig | 468 | ||||
| -rw-r--r-- | scripts/Python/python-wrapper.swig | 1080 | ||||
| -rwxr-xr-x | scripts/Python/remote-build.py | 312 | ||||
| -rw-r--r-- | scripts/Python/use_lldb_suite.py | 26 | 
14 files changed, 0 insertions, 5837 deletions
| diff --git a/scripts/Python/android/host_art_bt.py b/scripts/Python/android/host_art_bt.py deleted file mode 100644 index e359829fe5bd..000000000000 --- a/scripts/Python/android/host_art_bt.py +++ /dev/null @@ -1,237 +0,0 @@ -# Usage: -#   art/test/run-test --host --gdb [--64] [--interpreter] 004-JniTest -#   'b Java_Main_shortMethod' -#   'r' -#   'command script import host_art_bt.py' -#   'host_art_bt' - -import sys -import re - -import lldb - - -def host_art_bt(debugger, command, result, internal_dict): -    prettified_frames = [] -    lldb_frame_index = 0 -    art_frame_index = 0 -    target = debugger.GetSelectedTarget() -    process = target.GetProcess() -    thread = process.GetSelectedThread() -    while lldb_frame_index < thread.GetNumFrames(): -        frame = thread.GetFrameAtIndex(lldb_frame_index) -        if frame.GetModule() and re.match(r'JIT\(.*?\)', -                                          frame.GetModule().GetFileSpec().GetFilename()): -            # Compiled Java frame - -            # Get function/filename/lineno from symbol context -            symbol = frame.GetSymbol() -            if not symbol: -                print 'No symbol info for compiled Java frame: ', frame -                sys.exit(1) -            line_entry = frame.GetLineEntry() -            prettified_frames.append({ -                'function': symbol.GetName(), -                'file': str(line_entry.GetFileSpec()) if line_entry else None, -                'line': line_entry.GetLine() if line_entry else -1 -            }) - -            # Skip art frames -            while True: -                art_stack_visitor = frame.EvaluateExpression( -                    """struct GetStackVisitor : public StackVisitor { GetStackVisitor(int depth_) : StackVisitor(Thread::Current(), NULL), depth(depth_) {} bool VisitFrame() { if (cur_depth_ == depth) { return false; } else { return true; } } int depth; }; GetStackVisitor visitor(""" + -                    str(art_frame_index) + -                    """); visitor.WalkStack(true); visitor""") -                art_method = frame.EvaluateExpression( -                    art_stack_visitor.GetName() + """.GetMethod()""") -                if art_method.GetValueAsUnsigned() != 0: -                    art_method_name = frame.EvaluateExpression( -                        """art::PrettyMethod(""" + art_method.GetName() + """, true)""") -                    art_method_name_data = frame.EvaluateExpression( -                        art_method_name.GetName() + """.c_str()""").GetValueAsUnsigned() -                    art_method_name_size = frame.EvaluateExpression( -                        art_method_name.GetName() + """.length()""").GetValueAsUnsigned() -                    error = lldb.SBError() -                    art_method_name = process.ReadCStringFromMemory( -                        art_method_name_data, art_method_name_size + 1, error) -                    if not error.Success: -                        print 'Failed to read method name' -                        sys.exit(1) -                    if art_method_name != symbol.GetName(): -                        print 'Function names in native symbol and art runtime stack do not match: ', symbol.GetName(), ' != ', art_method_name -                    art_frame_index = art_frame_index + 1 -                    break -                art_frame_index = art_frame_index + 1 - -            # Skip native frames -            lldb_frame_index = lldb_frame_index + 1 -            if lldb_frame_index < thread.GetNumFrames(): -                frame = thread.GetFrameAtIndex(lldb_frame_index) -                if frame.GetModule() and re.match( -                        r'JIT\(.*?\)', frame.GetModule().GetFileSpec().GetFilename()): -                    # Another compile Java frame -                    # Don't skip; leave it to the next iteration -                    continue -                elif frame.GetSymbol() and (frame.GetSymbol().GetName() == 'art_quick_invoke_stub' or frame.GetSymbol().GetName() == 'art_quick_invoke_static_stub'): -                    # art_quick_invoke_stub / art_quick_invoke_static_stub -                    # Skip until we get past the next ArtMethod::Invoke() -                    while True: -                        lldb_frame_index = lldb_frame_index + 1 -                        if lldb_frame_index >= thread.GetNumFrames(): -                            print 'ArtMethod::Invoke not found below art_quick_invoke_stub/art_quick_invoke_static_stub' -                            sys.exit(1) -                        frame = thread.GetFrameAtIndex(lldb_frame_index) -                        if frame.GetSymbol() and frame.GetSymbol().GetName( -                        ) == 'art::mirror::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)': -                            lldb_frame_index = lldb_frame_index + 1 -                            break -                else: -                    print 'Invalid frame below compiled Java frame: ', frame -        elif frame.GetSymbol() and frame.GetSymbol().GetName() == 'art_quick_generic_jni_trampoline': -            # Interpreted JNI frame for x86_64 - -            # Skip art frames -            while True: -                art_stack_visitor = frame.EvaluateExpression( -                    """struct GetStackVisitor : public StackVisitor { GetStackVisitor(int depth_) : StackVisitor(Thread::Current(), NULL), depth(depth_) {} bool VisitFrame() { if (cur_depth_ == depth) { return false; } else { return true; } } int depth; }; GetStackVisitor visitor(""" + -                    str(art_frame_index) + -                    """); visitor.WalkStack(true); visitor""") -                art_method = frame.EvaluateExpression( -                    art_stack_visitor.GetName() + """.GetMethod()""") -                if art_method.GetValueAsUnsigned() != 0: -                    # Get function/filename/lineno from ART runtime -                    art_method_name = frame.EvaluateExpression( -                        """art::PrettyMethod(""" + art_method.GetName() + """, true)""") -                    art_method_name_data = frame.EvaluateExpression( -                        art_method_name.GetName() + """.c_str()""").GetValueAsUnsigned() -                    art_method_name_size = frame.EvaluateExpression( -                        art_method_name.GetName() + """.length()""").GetValueAsUnsigned() -                    error = lldb.SBError() -                    function = process.ReadCStringFromMemory( -                        art_method_name_data, art_method_name_size + 1, error) - -                    prettified_frames.append({ -                        'function': function, -                        'file': None, -                        'line': -1 -                    }) - -                    art_frame_index = art_frame_index + 1 -                    break -                art_frame_index = art_frame_index + 1 - -            # Skip native frames -            lldb_frame_index = lldb_frame_index + 1 -            if lldb_frame_index < thread.GetNumFrames(): -                frame = thread.GetFrameAtIndex(lldb_frame_index) -                if frame.GetSymbol() and (frame.GetSymbol().GetName() == -                                          'art_quick_invoke_stub' or frame.GetSymbol().GetName() == 'art_quick_invoke_static_stub'): -                    # art_quick_invoke_stub / art_quick_invoke_static_stub -                    # Skip until we get past the next ArtMethod::Invoke() -                    while True: -                        lldb_frame_index = lldb_frame_index + 1 -                        if lldb_frame_index >= thread.GetNumFrames(): -                            print 'ArtMethod::Invoke not found below art_quick_invoke_stub/art_quick_invoke_static_stub' -                            sys.exit(1) -                        frame = thread.GetFrameAtIndex(lldb_frame_index) -                        if frame.GetSymbol() and frame.GetSymbol().GetName( -                        ) == 'art::mirror::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)': -                            lldb_frame_index = lldb_frame_index + 1 -                            break -                else: -                    print 'Invalid frame below compiled Java frame: ', frame -        elif frame.GetSymbol() and re.search(r'art::interpreter::', frame.GetSymbol().GetName()): -            # Interpreted Java frame - -            while True: -                lldb_frame_index = lldb_frame_index + 1 -                if lldb_frame_index >= thread.GetNumFrames(): -                    print 'art::interpreter::Execute not found in interpreter frame' -                    sys.exit(1) -                frame = thread.GetFrameAtIndex(lldb_frame_index) -                if frame.GetSymbol() and frame.GetSymbol().GetName( -                ) == 'art::interpreter::Execute(art::Thread*, art::MethodHelper&, art::DexFile::CodeItem const*, art::ShadowFrame&, art::JValue)': -                    break - -            # Skip art frames -            while True: -                art_stack_visitor = frame.EvaluateExpression( -                    """struct GetStackVisitor : public StackVisitor { GetStackVisitor(int depth_) : StackVisitor(Thread::Current(), NULL), depth(depth_) {} bool VisitFrame() { if (cur_depth_ == depth) { return false; } else { return true; } } int depth; }; GetStackVisitor visitor(""" + -                    str(art_frame_index) + -                    """); visitor.WalkStack(true); visitor""") -                art_method = frame.EvaluateExpression( -                    art_stack_visitor.GetName() + """.GetMethod()""") -                if art_method.GetValueAsUnsigned() != 0: -                    # Get function/filename/lineno from ART runtime -                    art_method_name = frame.EvaluateExpression( -                        """art::PrettyMethod(""" + art_method.GetName() + """, true)""") -                    art_method_name_data = frame.EvaluateExpression( -                        art_method_name.GetName() + """.c_str()""").GetValueAsUnsigned() -                    art_method_name_size = frame.EvaluateExpression( -                        art_method_name.GetName() + """.length()""").GetValueAsUnsigned() -                    error = lldb.SBError() -                    function = process.ReadCStringFromMemory( -                        art_method_name_data, art_method_name_size + 1, error) - -                    line = frame.EvaluateExpression( -                        art_stack_visitor.GetName() + -                        """.GetMethod()->GetLineNumFromDexPC(""" + -                        art_stack_visitor.GetName() + -                        """.GetDexPc(true))""").GetValueAsUnsigned() - -                    file_name = frame.EvaluateExpression( -                        art_method.GetName() + """->GetDeclaringClassSourceFile()""") -                    file_name_data = file_name.GetValueAsUnsigned() -                    file_name_size = frame.EvaluateExpression( -                        """(size_t)strlen(""" + file_name.GetName() + """)""").GetValueAsUnsigned() -                    error = lldb.SBError() -                    file_name = process.ReadCStringFromMemory( -                        file_name_data, file_name_size + 1, error) -                    if not error.Success(): -                        print 'Failed to read source file name' -                        sys.exit(1) - -                    prettified_frames.append({ -                        'function': function, -                        'file': file_name, -                        'line': line -                    }) - -                    art_frame_index = art_frame_index + 1 -                    break -                art_frame_index = art_frame_index + 1 - -            # Skip native frames -            while True: -                lldb_frame_index = lldb_frame_index + 1 -                if lldb_frame_index >= thread.GetNumFrames(): -                    print 'Can not get past interpreter native frames' -                    sys.exit(1) -                frame = thread.GetFrameAtIndex(lldb_frame_index) -                if frame.GetSymbol() and not re.search( -                        r'art::interpreter::', frame.GetSymbol().GetName()): -                    break -        else: -            # Other frames. Add them as-is. -            frame = thread.GetFrameAtIndex(lldb_frame_index) -            lldb_frame_index = lldb_frame_index + 1 -            if frame.GetModule(): -                module_name = frame.GetModule().GetFileSpec().GetFilename() -                if not module_name in [ -                    'libartd.so', -                    'dalvikvm32', -                    'dalvikvm64', -                        'libc.so.6']: -                    prettified_frames.append({ -                        'function': frame.GetSymbol().GetName() if frame.GetSymbol() else None, -                        'file': str(frame.GetLineEntry().GetFileSpec()) if frame.GetLineEntry() else None, -                        'line': frame.GetLineEntry().GetLine() if frame.GetLineEntry() else -1 -                    }) - -    for prettified_frame in prettified_frames: -        print prettified_frame['function'], prettified_frame['file'], prettified_frame['line'] - - -def __lldb_init_module(debugger, internal_dict): -    debugger.HandleCommand( -        'command script add -f host_art_bt.host_art_bt host_art_bt') diff --git a/scripts/Python/finish-swig-Python-LLDB.sh b/scripts/Python/finish-swig-Python-LLDB.sh deleted file mode 100755 index 31bc2b349daf..000000000000 --- a/scripts/Python/finish-swig-Python-LLDB.sh +++ /dev/null @@ -1,310 +0,0 @@ -#!/bin/sh - -# finish-swig-Python.sh -# -# For the Python script interpreter (external to liblldb) to be able to import -# and use the lldb module, there must be two files, lldb.py and _lldb.so, that -# it can find. lldb.py is generated by SWIG at the same time it generates the -# C++ file.  _lldb.so is actually a symlink file that points to the -# LLDB shared library/framework. -# -# The Python script interpreter needs to be able to automatically find -# these two files. On Darwin systems it searches in the LLDB.framework, as -# well as in all the normal Python search paths.  On non-Darwin systems -# these files will need to be put someplace where Python will find them. -# -# This shell script creates the _lldb.so symlink in the appropriate place, -# and copies the lldb.py (and embedded_interpreter.py) file to the correct -# directory. -# - -# SRC_ROOT is the root of the lldb source tree. -# TARGET_DIR is where the lldb framework/shared library gets put. -# CONFIG_BUILD_DIR is where the build-swig-Python-LLDB.sh  shell script -#           put the lldb.py file it was generated from running SWIG. -# PYTHON_INSTALL_DIR is where non-Darwin systems want to put the .py and .so -#           files so that Python can find them automatically. -# debug_flag (optional) determines whether or not this script outputs -#           additional information when running. - -SRC_ROOT=$1 -TARGET_DIR=$2 -CONFIG_BUILD_DIR=$3 -PYTHON_INSTALL_DIR=$4 -debug_flag=$5 -makefile_flag=$6 - -# If we don't want Python, then just do nothing here. -# Note, at present iOS doesn't have Python, so if you're building for iOS be sure to -# set LLDB_DISABLE_PYTHON to 1. - -if [ ! "$LLDB_DISABLE_PYTHON" = "1" ] ; then - -if [ -n "$debug_flag" -a "$debug_flag" = "-debug" ] -then -    Debug=1 -else -    Debug=0 -fi - -if [ -n "$makefile_flag" -a "$makefile_flag" = "-m" ] -then -    MakefileCalled=1 -else -    MakefileCalled=0 -fi - -OS_NAME=`uname -s` -PYTHON=${PYTHON_EXECUTABLE:-/usr/bin/env python} -PYTHON_VERSION=`${PYTHON} --version 2>&1 | sed -e 's,Python ,,' -e 's,[.][0-9],,2' -e 's,[a-z][a-z][0-9],,'` - - -if [ $Debug -eq 1 ] -then -    echo "The current OS is $OS_NAME" -    echo "The Python version is $PYTHON_VERSION" -fi - -if [ ${OS_NAME} = "Darwin" ] -then -    SOEXT=".dylib" -else -    SOEXT=".so" -fi - -# -#  Determine where to put the files. - -if [ $MakefileCalled -eq 0 ] -then -    # We are being built by Xcode, so all the lldb Python files can go -    # into the LLDB.framework/Resources/Python subdirectory. - -    if [ ! -d "${TARGET_DIR}/LLDB.framework" ] -    then -        echo "Error:  Unable to find LLDB.framework" >&2 -        exit 1 -    else -        if [ $Debug -eq 1 ] -        then -            echo "Found ${TARGET_DIR}/LLDB.framework." -        fi -    fi - -    # Make the Python directory in the framework if it doesn't already exist - -    framework_python_dir="${TARGET_DIR}/LLDB.framework/Resources/Python/lldb" -else -    # We are being built by LLVM, so use the PYTHON_INSTALL_DIR argument, -    # and append the python version directory to the end of it.  Depending on -    # the system other stuff may need to be put here as well. - -    if [ -n "${PYTHON_INSTALL_DIR}" ] -    then -        framework_python_dir=`${PYTHON} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(True, False, \"${PYTHON_INSTALL_DIR}\");"`/lldb -    else -        framework_python_dir=`${PYTHON} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(True, False);"`/lldb -    fi -fi - -[ -n "${CONFIG_BUILD_DIR}" ] || CONFIG_BUILD_DIR=${framework_python_dir} - -# -# Look for the directory in which to put the Python files;  if it does not -# already exist, attempt to make it. -# - -if [ $Debug -eq 1 ] -then -    echo "Python files will be put in ${framework_python_dir}" -fi - -python_dirs="${framework_python_dir}" - -for python_dir in $python_dirs -do -    if [ ! -d "${python_dir}" ] -    then -        if [ $Debug -eq 1 ] -        then -            echo "Making directory ${python_dir}" -        fi -        mkdir -p "${python_dir}" -    else -        if [ $Debug -eq 1 ] -        then -            echo "${python_dir} already exists." -        fi -    fi - -    if [ ! -d "${python_dir}" ] -    then -        echo "Error: Unable to find or create ${python_dir}" >&2 -        exit 1 -    fi -done - -# Make the symlink that the script bridge for Python will need in the -# Python framework directory - -if [ ! -L "${framework_python_dir}/_lldb.so" ] -then -    if [ $Debug -eq 1 ] -    then -        echo "Creating symlink for _lldb.so" -    fi -    cd "${framework_python_dir}" -    if [ $MakefileCalled -eq 0 ] -    then -        ln -s "../../../LLDB" _lldb.so -	else -        ln -s "../../../liblldb${SOEXT}" _lldb.so -    fi -else -    if [ $Debug -eq 1 ] -    then -        echo "${framework_python_dir}/_lldb.so already exists." -    fi -fi - -# Make symlink for darwin-debug on Darwin -if [ ${OS_NAME} = "Darwin" ] && [ $MakefileCalled -ne 0 ] -then -    # We are being built by CMake on Darwin - -    if [ ! -L "${framework_python_dir}/darwin-debug" ] -    then -        if [ $Debug -eq 1 ] -        then -            echo "Creating symlink for darwin-debug" -        fi -        cd "${framework_python_dir}" -    else -        if [ $Debug -eq 1 ] -        then -            echo "${framework_python_dir}/darwin-debug already exists." -        fi -    fi -fi - -# Make symlink for lldb-argdumper on any platform -if [ $MakefileCalled -ne 0 ] -then -    # We are being built by CMake - -    if [ ! -L "${framework_python_dir}/lldb-argdumper" ] -    then -        if [ $Debug -eq 1 ] -        then -            echo "Creating symlink for lldb-argdumper" -        fi -        cd "${framework_python_dir}" -        ln -s "../../../../bin/lldb-argdumper" lldb-argdumper -    else -        if [ $Debug -eq 1 ] -        then -            echo "${framework_python_dir}/lldb-argdumper already exists." -        fi -    fi -fi - -create_python_package () { -    package_dir="${framework_python_dir}$1" -    package_files="$2" -    package_name=`echo $1 | tr '/' '.'` -    package_name="lldb${package_name}" - -    if [ ! -d "${package_dir}" ] -    then -        mkdir -p "${package_dir}" -    fi - -    for package_file in $package_files -    do -        if [ -f "${package_file}" ] -        then -            cp "${package_file}" "${package_dir}" -            package_file_basename=$(basename "${package_file}") -        fi -    done - - -    # Create a packate init file if there wasn't one -    package_init_file="${package_dir}/__init__.py" -    if [ ! -f "${package_init_file}" ] -    then -        printf "__all__ = [" > "${package_init_file}" -        python_module_separator="" -        for package_file in $package_files -        do -            if [ -f "${package_file}" ] -            then -                package_file_basename=$(basename "${package_file}") -                printf "${python_module_separator}\"${package_file_basename%.*}\"" >> "${package_init_file}" -                python_module_separator=", " -            fi -        done -        echo "]" >> "${package_init_file}" -        echo "for x in __all__:" >> "${package_init_file}" -        echo "    __import__('${package_name}.'+x)" >> "${package_init_file}" -    fi - - -} - -# Copy the lldb.py file into the lldb package directory and rename to __init_.py -cp "${CONFIG_BUILD_DIR}/lldb.py" "${framework_python_dir}/__init__.py" - -# lldb -package_files="${SRC_ROOT}/source/Interpreter/embedded_interpreter.py" -create_python_package "" "${package_files}" - -# lldb/formatters/cpp -package_files="${SRC_ROOT}/examples/synthetic/gnu_libstdcpp.py -${SRC_ROOT}/examples/synthetic/libcxx.py" -create_python_package "/formatters/cpp" "${package_files}" - -# make an empty __init__.py in lldb/runtime -# this is required for Python to recognize lldb.runtime as a valid package -# (and hence, lldb.runtime.objc as a valid contained package) -create_python_package "/runtime" "" - -# lldb/formatters -# having these files copied here ensures that lldb/formatters is a valid package itself -package_files="${SRC_ROOT}/examples/summaries/cocoa/cache.py -${SRC_ROOT}/examples/summaries/synth.py -${SRC_ROOT}/examples/summaries/cocoa/metrics.py -${SRC_ROOT}/examples/summaries/cocoa/attrib_fromdict.py -${SRC_ROOT}/examples/summaries/cocoa/Logger.py" -create_python_package "/formatters" "${package_files}" - -# lldb/utils -package_files="${SRC_ROOT}/examples/python/symbolication.py" -create_python_package "/utils" "${package_files}" - -if [ ${OS_NAME} = "Darwin" ] -then -    # lldb/macosx -    package_files="${SRC_ROOT}/examples/python/crashlog.py -    ${SRC_ROOT}/examples/darwin/heap_find/heap.py" -    create_python_package "/macosx" "${package_files}" - -    # lldb/diagnose -    package_files="${SRC_ROOT}/examples/python/diagnose_unwind.py -    ${SRC_ROOT}/examples/python/diagnose_nsstring.py" -    create_python_package "/diagnose" "${package_files}" - -    # Copy files needed by lldb/macosx/heap.py to build libheap.dylib -    heap_dir="${framework_python_dir}/macosx/heap" -    if [ ! -d "${heap_dir}" ] -    then -        mkdir -p "${heap_dir}" -        cp "${SRC_ROOT}/examples/darwin/heap_find/heap/heap_find.cpp" "${heap_dir}" -        cp "${SRC_ROOT}/examples/darwin/heap_find/heap/Makefile" "${heap_dir}" -    fi -fi - -fi - -exit 0 - diff --git a/scripts/Python/finishSwigPythonLLDB.py b/scripts/Python/finishSwigPythonLLDB.py deleted file mode 100644 index ff6a1318a19a..000000000000 --- a/scripts/Python/finishSwigPythonLLDB.py +++ /dev/null @@ -1,945 +0,0 @@ -""" Python SWIG post process script for each language - -    -------------------------------------------------------------------------- -    File:           finishSwigPythonLLDB.py - -    Overview:       Python script(s) to post process SWIG Python C++ Script -                    Bridge wrapper code on the Windows/LINUX/OSX platform. -                    The Python scripts are equivalent to the shell script (.sh) -                    files. -                    For the Python script interpreter (external to liblldb) to -                    be able to import and use the lldb module, there must be -                    two files, lldb.py and _lldb.so, that it can find. lldb.py -                    is generated by SWIG at the same time it generates the C++ -                    file.  _lldb.so is actually a symlink file that points to -                    the LLDB shared library/framework. -                    The Python script interpreter needs to be able to -                    automatically find these two files. On Darwin systems it -                    searches in the LLDB.framework, as well as in all the normal -                    Python search paths.  On non-Darwin systems these files will -                    need to be put some place where Python will find them. -                    This shell script creates the _lldb.so symlink in the -                    appropriate place, and copies the lldb.py (and -                    embedded_interpreter.py) file to the correct directory. - -    Gotchas:        Python debug complied pythonXX_d.lib is required for SWIG -                    to build correct LLDBWrapperPython.cpp in order for Visual -                    Studio to compile successfully. The release version of the -                    Python lib will not work (20/12/2013). -                    LLDB (dir) CMakeLists.txt uses windows environmental -                    variables $PYTHON_INCLUDE and $PYTHON_LIB to locate -                    Python files required for the build. - -    Copyright:      None. -    -------------------------------------------------------------------------- - -""" - -# Python modules: -import os           # Provide directory and file handling, determine OS information -import sys          # System specific parameters and functions -import shutil       # High-level operations on files and collections of files -import ctypes       # Invoke Windows API for creating symlinks - -# Third party modules: - -# In-house modules: -import utilsOsType      # Determine the OS type this script is running on -import utilsDebug       # Debug Python scripts - -# User facing text: -strMsgOsVersion = "The current OS is %s" -strMsgPyVersion = "The Python version is %d.%d" -strErrMsgProgFail = "Program failure: " -strErrMsgLLDBPyFileNotNotFound = "Unable to locate lldb.py at path '%s'" -strMsgCopyLLDBPy = "Copying lldb.py from '%s' to '%s'" -strErrMsgFrameWkPyDirNotExist = "Unable to find the LLDB.framework directory '%s'" -strMsgCreatePyPkgCopyPkgFile = "create_py_pkg: Copied file '%s' to folder '%s'" -strMsgCreatePyPkgInitFile = "create_py_pkg: Creating pakage init file '%s'" -strMsgCreatePyPkgMkDir = "create_py_pkg: Created folder '%s'" -strMsgConfigBuildDir = "Configuration build directory located at '%s'" -strMsgFoundLldbFrameWkDir = "Found '%s'" -strMsgPyFileLocatedHere = "Python file will be put in '%s'" -strMsgFrameWkPyExists = "Python output folder '%s' already exists" -strMsgFrameWkPyMkDir = "Python output folder '%s' will be created" -strErrMsgCreateFrmWkPyDirFailed = "Unable to create directory '%s' error: %s" -strMsgSymlinkExists = "Symlink for '%s' already exists" -strMsgSymlinkMk = "Creating symlink for %s  (%s -> %s)" -strErrMsgCpLldbpy = "copying lldb to lldb package directory" -strErrMsgCreatePyPkgMissingSlash = "Parameter 3 fn create_py_pkg() missing slash" -strErrMsgMkLinkExecute = "Command mklink failed: %s" -strErrMsgMakeSymlink = "creating symbolic link" -strErrMsgUnexpected = "Unexpected error: %s" -strMsgCopySixPy = "Copying six.py from '%s' to '%s'" -strErrMsgCopySixPyFailed = "Unable to copy '%s' to '%s'" - - -def is_debug_interpreter(): -    return hasattr(sys, 'gettotalrefcount') - -#++--------------------------------------------------------------------------- -# Details:  Copy files needed by lldb/macosx/heap.py to build libheap.dylib. -# Args:     vDictArgs               - (R) Program input parameters. -#           vstrFrameworkPythonDir  - (R) Python framework directory. -# Returns:  Bool - True = function success, False = failure. -#           Str - Error description on task failure. -# Throws:   None. -#-- - - -def macosx_copy_file_for_heap(vDictArgs, vstrFrameworkPythonDir): -    dbg = utilsDebug.CDebugFnVerbose( -        "Python script macosx_copy_file_for_heap()") -    bOk = True -    strMsg = "" - -    eOSType = utilsOsType.determine_os_type() -    if eOSType != utilsOsType.EnumOsType.Darwin: -        return (bOk, strMsg) - -    strHeapDir = os.path.join(vstrFrameworkPythonDir, "macosx", "heap") -    strHeapDir = os.path.normcase(strHeapDir) -    if os.path.exists(strHeapDir) and os.path.isdir(strHeapDir): -        return (bOk, strMsg) - -    os.makedirs(strHeapDir) - -    strRoot = os.path.normpath(vDictArgs["--srcRoot"]) -    strSrc = os.path.join( -        strRoot, -        "examples", -        "darwin", -        "heap_find", -        "heap", -        "heap_find.cpp") -    shutil.copy(strSrc, strHeapDir) -    strSrc = os.path.join( -        strRoot, -        "examples", -        "darwin", -        "heap_find", -        "heap", -        "Makefile") -    shutil.copy(strSrc, strHeapDir) - -    return (bOk, strMsg) - -#++--------------------------------------------------------------------------- -# Details:  Create Python packages and Python __init__ files. -# Args:     vDictArgs               - (R) Program input parameters. -#           vstrFrameworkPythonDir  - (R) Python framework directory. -#           vstrPkgDir              - (R) Destination for copied Python files. -#           vListPkgFiles           - (R) List of source Python files. -# Returns:  Bool - True = function success, False = failure. -#           Str - Error description on task failure. -# Throws:   None. -#-- - - -def create_py_pkg( -        vDictArgs, -        vstrFrameworkPythonDir, -        vstrPkgDir, -        vListPkgFiles): -    dbg = utilsDebug.CDebugFnVerbose("Python script create_py_pkg()") -    dbg.dump_object("Package file(s):", vListPkgFiles) -    bDbg = "-d" in vDictArgs - -    bOk = True -    strMsg = "" - -    if vstrPkgDir.__len__() != 0 and vstrPkgDir[0] != "/": -        bOk = False -        strMsg = strErrMsgCreatePyPkgMissingSlash -        return (bOk, strMsg) - -    strPkgName = vstrPkgDir -    strPkgName = "lldb" + strPkgName.replace("/", ".") - -    strPkgDir = vstrFrameworkPythonDir -    strPkgDir += vstrPkgDir -    strPkgDir = os.path.normcase(strPkgDir) - -    if not(os.path.exists(strPkgDir) and os.path.isdir(strPkgDir)): -        if bDbg: -            print((strMsgCreatePyPkgMkDir % strPkgDir)) -        os.makedirs(strPkgDir) - -    for strPkgFile in vListPkgFiles: -        if os.path.exists(strPkgFile) and os.path.isfile(strPkgFile): -            if bDbg: -                print((strMsgCreatePyPkgCopyPkgFile % (strPkgFile, strPkgDir))) -            shutil.copy(strPkgFile, strPkgDir) - -    # Create a packet init files if there wasn't one -    strPkgIniFile = os.path.normpath(os.path.join(strPkgDir, "__init__.py")) -    if os.path.exists(strPkgIniFile) and os.path.isfile(strPkgIniFile): -        return (bOk, strMsg) - -    strPyScript = "__all__ = [" -    strDelimiter = "" -    for strPkgFile in vListPkgFiles: -        if os.path.exists(strPkgFile) and os.path.isfile(strPkgFile): -            strBaseName = os.path.basename(strPkgFile) -            nPos = strBaseName.find(".") -            if nPos != -1: -                strBaseName = strBaseName[0: nPos] -            strPyScript += "%s\"%s\"" % (strDelimiter, strBaseName) -            strDelimiter = "," -    strPyScript += "]\n" -    strPyScript += "for x in __all__:\n" -    strPyScript += "\t__import__('%s.' + x)" % strPkgName - -    if bDbg: -        print((strMsgCreatePyPkgInitFile % strPkgIniFile)) -    file = open(strPkgIniFile, "w") -    file.write(strPyScript) -    file.close() - -    return (bOk, strMsg) - -#++--------------------------------------------------------------------------- -# Details:  Copy the lldb.py file into the lldb package directory and rename -#           to __init_.py. -# Args:     vDictArgs               - (R) Program input parameters. -#           vstrFrameworkPythonDir  - (R) Python framework directory. -#           vstrCfgBldDir           - (R) Config directory path. -# Returns:  Bool - True = function success, False = failure. -#           Str - Error description on task failure. -# Throws:   None. -#-- - - -def copy_lldbpy_file_to_lldb_pkg_dir( -        vDictArgs, -        vstrFrameworkPythonDir, -        vstrCfgBldDir): -    dbg = utilsDebug.CDebugFnVerbose( -        "Python script copy_lldbpy_file_to_lldb_pkg_dir()") -    bOk = True -    bDbg = "-d" in vDictArgs -    strMsg = "" - -    strSrc = os.path.join(vstrCfgBldDir, "lldb.py") -    strSrc = os.path.normcase(strSrc) -    strDst = os.path.join(vstrFrameworkPythonDir, "__init__.py") -    strDst = os.path.normcase(strDst) - -    if not os.path.exists(strSrc): -        strMsg = strErrMsgLLDBPyFileNotNotFound % strSrc -        return (bOk, strMsg) - -    try: -        if bDbg: -            print((strMsgCopyLLDBPy % (strSrc, strDst))) -        shutil.copyfile(strSrc, strDst) -    except IOError as e: -        bOk = False -        strMsg = "I/O error(%d): %s %s" % (e.errno, -                                           e.strerror, strErrMsgCpLldbpy) -        if e.errno == 2: -            strMsg += " Src:'%s' Dst:'%s'" % (strSrc, strDst) -    except: -        bOk = False -        strMsg = strErrMsgUnexpected % sys.exec_info()[0] - -    return (bOk, strMsg) - -#++--------------------------------------------------------------------------- -# Details:  Make the symbolic link on a Windows platform. -# Args:     vstrSrcFile             - (R) Source file name. -#           vstrTargetFile          - (R) Destination file name. -# Returns:  Bool - True = function success, False = failure. -#           Str - Error description on task failure. -# Throws:   None. -#-- - - -def make_symlink_windows(vstrSrcPath, vstrTargetPath): -    print(("Making symlink from %s to %s" % (vstrSrcPath, vstrTargetPath))) -    dbg = utilsDebug.CDebugFnVerbose("Python script make_symlink_windows()") -    bOk = True -    strErrMsg = "" -    # If the src file doesn't exist, this is an error and we should throw. -    src_stat = os.stat(vstrSrcPath) - -    try: -        target_stat = os.stat(vstrTargetPath) -        # If the target file exists but refers to a different file, delete it so that we can -        # re-create the link.  This can happen if you run this script once (creating a link) -        # and then delete the source file (so that a brand new file gets created the next time -        # you compile and link), and then re-run this script, so that both the target hardlink -        # and the source file exist, but the target refers to an old copy of -        # the source. -        if (target_stat.st_ino == src_stat.st_ino) and ( -                target_stat.st_dev == src_stat.st_dev): -            return (bOk, strErrMsg) - -        os.remove(vstrTargetPath) -    except: -        # If the target file don't exist, ignore this exception, we will link -        # it shortly. -        pass - -    try: -        csl = ctypes.windll.kernel32.CreateHardLinkW -        csl.argtypes = (ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint32) -        csl.restype = ctypes.c_ubyte -        if csl(vstrTargetPath, vstrSrcPath, 0) == 0: -            raise ctypes.WinError() -    except Exception as e: -        if e.errno != 17: -            bOk = False -            strErrMsg = "WinError(%d): %s %s" % ( -                e.errno, e.strerror, strErrMsgMakeSymlink) -            strErrMsg += " Src:'%s' Target:'%s'" % ( -                vstrSrcPath, vstrTargetPath) - -    return (bOk, strErrMsg) - -#++--------------------------------------------------------------------------- -# Details:  Make the symbolic link on a UNIX style platform. -# Args:     vstrSrcFile             - (R) Source file name. -#           vstrTargetFile          - (R) Destination file name. -# Returns:  Bool - True = function success, False = failure. -#           Str - Error description on task failure. -# Throws:   None. -#-- - - -def make_symlink_other_platforms(vstrSrcPath, vstrTargetPath): -    dbg = utilsDebug.CDebugFnVerbose( -        "Python script make_symlink_other_platforms()") -    bOk = True -    strErrMsg = "" - -    try: -        os.symlink(vstrSrcPath, vstrTargetPath) -    except OSError as e: -        bOk = False -        strErrMsg = "OSError(%d): %s %s" % ( -            e.errno, e.strerror, strErrMsgMakeSymlink) -        strErrMsg += " Src:'%s' Target:'%s'" % (vstrSrcPath, vstrTargetPath) -    except: -        bOk = False -        strErrMsg = strErrMsgUnexpected % sys.exec_info()[0] - -    return (bOk, strErrMsg) - - -def make_symlink_native(vDictArgs, strSrc, strTarget): -    eOSType = utilsOsType.determine_os_type() -    bDbg = "-d" in vDictArgs -    bOk = True -    strErrMsg = "" - -    target_filename = os.path.basename(strTarget) -    if eOSType == utilsOsType.EnumOsType.Unknown: -        bOk = False -        strErrMsg = strErrMsgOsTypeUnknown -    elif eOSType == utilsOsType.EnumOsType.Windows: -        if bDbg: -            print((strMsgSymlinkMk % (target_filename, strSrc, strTarget))) -        bOk, strErrMsg = make_symlink_windows(strSrc, -                                              strTarget) -    else: -        if os.path.islink(strTarget): -            if bDbg: -                print((strMsgSymlinkExists % target_filename)) -            return (bOk, strErrMsg) -        if bDbg: -            print((strMsgSymlinkMk % (target_filename, strSrc, strTarget))) -        bOk, strErrMsg = make_symlink_other_platforms(strSrc, -                                                      strTarget) - -    return (bOk, strErrMsg) - -#++--------------------------------------------------------------------------- -# Details:  Make the symbolic link. -# Args:     vDictArgs               - (R) Program input parameters. -#           vstrFrameworkPythonDir  - (R) Python framework directory. -#           vstrSrcFile             - (R) Source file name. -#           vstrTargetFile          - (R) Destination file name. -# Returns:  Bool - True = function success, False = failure. -#           Str - Error description on task failure. -# Throws:   None. -#-- - - -def make_symlink( -        vDictArgs, -        vstrFrameworkPythonDir, -        vstrSrcFile, -        vstrTargetFile): -    dbg = utilsDebug.CDebugFnVerbose("Python script make_symlink()") -    bOk = True -    strErrMsg = "" -    bDbg = "-d" in vDictArgs -    strTarget = os.path.join(vstrFrameworkPythonDir, vstrTargetFile) -    strTarget = os.path.normcase(strTarget) -    strSrc = "" - -    os.chdir(vstrFrameworkPythonDir) -    bMakeFileCalled = "-m" in vDictArgs -    eOSType = utilsOsType.determine_os_type() -    if not bMakeFileCalled: -        strBuildDir = os.path.join("..", "..", "..") -    else: -        # Resolve vstrSrcFile path relatively the build directory -        if eOSType == utilsOsType.EnumOsType.Windows: -            # On a Windows platform the vstrFrameworkPythonDir looks like: -            # llvm\\build\\Lib\\site-packages\\lldb -            strBuildDir = os.path.join("..", "..", "..") -        else: -            # On a UNIX style platform the vstrFrameworkPythonDir looks like: -            # llvm/build/lib/python2.7/site-packages/lldb -            strBuildDir = os.path.join("..", "..", "..", "..") -    strSrc = os.path.normcase(os.path.join(strBuildDir, vstrSrcFile)) - -    return make_symlink_native(vDictArgs, strSrc, strTarget) - - -#++--------------------------------------------------------------------------- -# Details:  Make the symbolic that the script bridge for Python will need in -#           the Python framework directory. -# Args:     vDictArgs               - (R) Program input parameters. -#           vstrFrameworkPythonDir  - (R) Python framework directory. -#           vstrLiblldbName         - (R) File name for _lldb library. -#           vstrLiblldbDir          - (R) liblldb directory. -# Returns:  Bool - True = function success, False = failure. -#           Str - Error description on task failure. -# Throws:   None. -#-- -def make_symlink_liblldb( -        vDictArgs, -        vstrFrameworkPythonDir, -        vstrLiblldbFileName, -        vstrLldbLibDir): -    dbg = utilsDebug.CDebugFnVerbose("Python script make_symlink_liblldb()") -    bOk = True -    strErrMsg = "" -    strTarget = vstrLiblldbFileName -    strSrc = "" - -    eOSType = utilsOsType.determine_os_type() -    if eOSType == utilsOsType.EnumOsType.Windows: -        # When importing an extension module using a debug version of python, you -        # write, for example, "import foo", but the interpreter searches for -        # "foo_d.pyd" -        if is_debug_interpreter(): -            strTarget += "_d" -        strTarget += ".pyd" -    else: -        strTarget += ".so" - -    bMakeFileCalled = "-m" in vDictArgs -    if not bMakeFileCalled: -        strSrc = "LLDB" -    else: -        strLibFileExtn = "" -        if eOSType == utilsOsType.EnumOsType.Windows: -            strSrc = os.path.join("bin", "liblldb.dll") -        else: -            if eOSType == utilsOsType.EnumOsType.Darwin: -                strLibFileExtn = ".dylib" -            else: -                strLibFileExtn = ".so" -            strSrc = os.path.join(vstrLldbLibDir, "liblldb" + strLibFileExtn) - -    bOk, strErrMsg = make_symlink( -        vDictArgs, vstrFrameworkPythonDir, strSrc, strTarget) - -    return (bOk, strErrMsg) - -#++--------------------------------------------------------------------------- -# Details:  Make the symbolic link to the lldb-argdumper. -# Args:     vDictArgs               - (R) Program input parameters. -#           vstrFrameworkPythonDir  - (R) Python framework directory. -#           vstrArgdumperFileName   - (R) File name for lldb-argdumper. -# Returns:  Bool - True = function success, False = failure. -#           Str - Error description on task failure. -# Throws:   None. -#-- - - -def make_symlink_lldb_argdumper( -        vDictArgs, -        vstrFrameworkPythonDir, -        vstrArgdumperFileName): -    dbg = utilsDebug.CDebugFnVerbose( -        "Python script make_symlink_lldb_argdumper()") -    bOk = True -    strErrMsg = "" -    strTarget = vstrArgdumperFileName -    strSrc = "" - -    eOSType = utilsOsType.determine_os_type() -    if eOSType == utilsOsType.EnumOsType.Windows: -        strTarget += ".exe" - -    bMakeFileCalled = "-m" in vDictArgs -    if not bMakeFileCalled: -        return (bOk, strErrMsg) -    else: -        strExeFileExtn = "" -        if eOSType == utilsOsType.EnumOsType.Windows: -            strExeFileExtn = ".exe" -        strSrc = os.path.join("bin", "lldb-argdumper" + strExeFileExtn) - -    bOk, strErrMsg = make_symlink( -        vDictArgs, vstrFrameworkPythonDir, strSrc, strTarget) - -    return (bOk, strErrMsg) - -#++--------------------------------------------------------------------------- -# Details:  Make the symlink that the script bridge for Python will need in -#           the Python framework directory. -# Args:     vDictArgs               - (R) Program input parameters. -#           vstrFrameworkPythonDir  - (R) Python framework directory. -#           vstrLldbLibDir          - (R) liblldb directory. -# Returns:  Bool - True = function success, False = failure. -#           strErrMsg - Error description on task failure. -# Throws:   None. -#-- - - -def create_symlinks(vDictArgs, vstrFrameworkPythonDir, vstrLldbLibDir): -    dbg = utilsDebug.CDebugFnVerbose("Python script create_symlinks()") -    bOk = True -    strErrMsg = "" -    eOSType = utilsOsType.determine_os_type() - -    # Make symlink for _lldb -    strLibLldbFileName = "_lldb" -    if bOk: -        bOk, strErrMsg = make_symlink_liblldb(vDictArgs, -                                              vstrFrameworkPythonDir, -                                              strLibLldbFileName, -                                              vstrLldbLibDir) - -    # Make symlink for lldb-argdumper -    strArgdumperFileName = "lldb-argdumper" -    if bOk: -        bOk, strErrMsg = make_symlink_lldb_argdumper(vDictArgs, -                                                     vstrFrameworkPythonDir, -                                                     strArgdumperFileName) - -    return (bOk, strErrMsg) - - -def copy_six(vDictArgs, vstrFrameworkPythonDir): -    dbg = utilsDebug.CDebugFnVerbose("Python script copy_six()") -    bDbg = "-d" in vDictArgs -    bOk = True -    strMsg = "" -    site_packages_dir = os.path.dirname(vstrFrameworkPythonDir) -    six_module_filename = "six.py" -    src_file = os.path.join( -        vDictArgs['--srcRoot'], -        "third_party", -        "Python", -        "module", -        "six", -        six_module_filename) -    src_file = os.path.normpath(src_file) -    target = os.path.join(site_packages_dir, six_module_filename) - -    if bDbg: -        print((strMsgCopySixPy % (src_file, target))) -    try: -        shutil.copyfile(src_file, target) -    except: -        bOk = False -        strMsg = strErrMsgCopySixPyFailed % (src_file, target) - -    return (bOk, strMsg) - -#++--------------------------------------------------------------------------- -# Details:  Look for the directory in which to put the Python files if it -#           does not already exist, attempt to make it. -# Args:     vDictArgs               - (R) Program input parameters. -#           vstrFrameworkPythonDir  - (R) Python framework directory. -# Returns:  Bool - True = function success, False = failure. -#           Str - Error description on task failure. -# Throws:   None. -#-- - - -def find_or_create_python_dir(vDictArgs, vstrFrameworkPythonDir): -    dbg = utilsDebug.CDebugFnVerbose( -        "Python script find_or_create_python_dir()") -    bOk = True -    strMsg = "" -    bDbg = "-d" in vDictArgs - -    if os.path.isdir(vstrFrameworkPythonDir): -        if bDbg: -            print((strMsgFrameWkPyExists % vstrFrameworkPythonDir)) -        return (bOk, strMsg) - -    if bDbg: -        print((strMsgFrameWkPyMkDir % vstrFrameworkPythonDir)) - -    try: -        os.makedirs(vstrFrameworkPythonDir) -    except OSError as exception: -        bOk = False -        strMsg = strErrMsgCreateFrmWkPyDirFailed % ( -            vstrFrameworkPythonDir, os.strerror(exception.errno)) - -    return (bOk, strMsg) - -#++--------------------------------------------------------------------------- -# Details:  Retrieve the configuration build path if present and valid (using -#           parameter --cfgBlddir or copy the Python Framework directory. -# Args:     vDictArgs               - (R) Program input parameters. -#           vstrFrameworkPythonDir  - (R) Python framework directory. -# Returns:  Bool - True = function success, False = failure. -#           Str - Config directory path. -#           strErrMsg - Error description on task failure. -# Throws:   None. -#-- - - -def get_config_build_dir(vDictArgs, vstrFrameworkPythonDir): -    dbg = utilsDebug.CDebugFnVerbose("Python script get_config_build_dir()") -    bOk = True -    strErrMsg = "" - -    strConfigBldDir = "" -    bHaveConfigBldDir = "--cfgBldDir" in vDictArgs -    if bHaveConfigBldDir: -        strConfigBldDir = vDictArgs["--cfgBldDir"] -    if (bHaveConfigBldDir == False) or (strConfigBldDir.__len__() == 0): -        strConfigBldDir = vstrFrameworkPythonDir - -    return (bOk, strConfigBldDir, strErrMsg) - -#++--------------------------------------------------------------------------- -# Details:  Determine where to put the files. Retrieve the directory path for -#           Python's dist_packages/ site_package folder on a Windows platform. -# Args:     vDictArgs   - (R) Program input parameters. -# Returns:  Bool - True = function success, False = failure. -#           Str - Python Framework directory path. -#           strErrMsg - Error description on task failure. -# Throws:   None. -#-- - - -def get_framework_python_dir_windows(vDictArgs): -    dbg = utilsDebug.CDebugFnVerbose( -        "Python script get_framework_python_dir_windows()") -    bOk = True -    strWkDir = "" -    strErrMsg = "" - -    # We are being built by LLVM, so use the PYTHON_INSTALL_DIR argument, -    # and append the python version directory to the end of it.  Depending -    # on the system other stuff may need to be put here as well. -    from distutils.sysconfig import get_python_lib -    strPythonInstallDir = "" -    bHaveArgPrefix = "--prefix" in vDictArgs -    if bHaveArgPrefix: -        strPythonInstallDir = os.path.normpath(vDictArgs["--prefix"]) - -    bHaveArgCmakeBuildConfiguration = "--cmakeBuildConfiguration" in vDictArgs -    if bHaveArgCmakeBuildConfiguration: -        strPythonInstallDir = os.path.join( -            strPythonInstallDir, -            vDictArgs["--cmakeBuildConfiguration"]) - -    if strPythonInstallDir.__len__() != 0: -        strWkDir = get_python_lib(True, False, strPythonInstallDir) -    else: -        strWkDir = get_python_lib(True, False) -    strWkDir = os.path.normcase(os.path.join(strWkDir, "lldb")) - -    return (bOk, strWkDir, strErrMsg) - -#++--------------------------------------------------------------------------- -# Details:  Retrieve the directory path for Python's dist_packages/ -#           site_package folder on a UNIX style platform. -# Args:     vDictArgs   - (R) Program input parameters. -# Returns:  Bool - True = function success, False = failure. -#           Str - Python Framework directory path. -#           strErrMsg - Error description on task failure. -# Throws:   None. -#-- - - -def get_framework_python_dir_other_platforms(vDictArgs): -    dbg = utilsDebug.CDebugFnVerbose( -        "Python script get_framework_python_dir_other_platform()") -    bOk = True -    strWkDir = "" -    strErrMsg = "" -    bDbg = "-d" in vDictArgs - -    bMakeFileCalled = "-m" in vDictArgs -    if bMakeFileCalled: -        dbg.dump_text("Built by LLVM") -        return get_framework_python_dir_windows(vDictArgs) -    else: -        dbg.dump_text("Built by XCode") -        # We are being built by XCode, so all the lldb Python files can go -        # into the LLDB.framework/Resources/Python subdirectory. -        strWkDir = vDictArgs["--targetDir"] -        strWkDir = os.path.join(strWkDir, "LLDB.framework") -        if os.path.exists(strWkDir): -            if bDbg: -                print((strMsgFoundLldbFrameWkDir % strWkDir)) -            strWkDir = os.path.join(strWkDir, "Resources", "Python", "lldb") -            strWkDir = os.path.normcase(strWkDir) -        else: -            bOk = False -            strErrMsg = strErrMsgFrameWkPyDirNotExist % strWkDir - -    return (bOk, strWkDir, strErrMsg) - -#++--------------------------------------------------------------------------- -# Details:  Retrieve the directory path for Python's dist_packages/ -#           site_package folder depending on the type of OS platform being -#           used. -# Args:     vDictArgs   - (R) Program input parameters. -# Returns:  Bool - True = function success, False = failure. -#           Str - Python Framework directory path. -#           strErrMsg - Error description on task failure. -# Throws:   None. -#-- - - -def get_framework_python_dir(vDictArgs): -    dbg = utilsDebug.CDebugFnVerbose( -        "Python script get_framework_python_dir()") -    bOk = True -    strWkDir = "" -    strErrMsg = "" - -    eOSType = utilsOsType.determine_os_type() -    if eOSType == utilsOsType.EnumOsType.Unknown: -        bOk = False -        strErrMsg = strErrMsgOsTypeUnknown -    elif eOSType == utilsOsType.EnumOsType.Windows: -        bOk, strWkDir, strErrMsg = get_framework_python_dir_windows(vDictArgs) -    else: -        bOk, strWkDir, strErrMsg = get_framework_python_dir_other_platforms( -            vDictArgs) - -    return (bOk, strWkDir, strErrMsg) - -#++--------------------------------------------------------------------------- -# Details:  Retrieve the liblldb directory path, if it exists and is valid. -# Args:     vDictArgs               - (R) Program input parameters. -# Returns:  Bool - True = function success, False = failure. -#           Str - liblldb directory path. -#           strErrMsg - Error description on task failure. -# Throws:   None. -#-- - - -def get_liblldb_dir(vDictArgs): -    dbg = utilsDebug.CDebugFnVerbose("Python script get_liblldb_dir()") -    bOk = True -    strErrMsg = "" - -    strLldbLibDir = "" -    bHaveLldbLibDir = "--lldbLibDir" in vDictArgs -    if bHaveLldbLibDir: -        strLldbLibDir = vDictArgs["--lldbLibDir"] -    if (bHaveLldbLibDir == False) or (strLldbLibDir.__len__() == 0): -        strLldbLibDir = "lib" - -    return (bOk, strLldbLibDir, strErrMsg) - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- - -""" Details: Program main entry point fn. Called by another Python script. - -    -------------------------------------------------------------------------- -    Details: This script is to be called by another Python script. It is not -             intended to be called directly i.e from the command line. -    Args:   vDictArgs   - (R) Map of parameter names to values. -            -d (optional)   Determines whether or not this script -                            outputs additional information when running. -            -m (optional)   Specify called from Makefile system. If given locate -                            the LLDBWrapPython.cpp in --srcRoot/source folder -                            else in the --targetDir folder. -            --srcRoot       The root of the lldb source tree. -            --targetDir     Where the lldb framework/shared library gets put. -            --cfgBlddir     Where the buildSwigPythonLLDB.py program will -            (optional)      put the lldb.py file it generated from running -                            SWIG. -            --prefix        Is the root directory used to determine where -            (optional)      third-party modules for scripting languages should -                            be installed. Where non-Darwin systems want to put -                            the .py and .so files so that Python can find them -                            automatically. Python install directory. -            --lldbLibDir    The name of the directory containing liblldb.so. -            (optional)      "lib" by default. -    Results:    0       Success -                -100+   Error from this script to the caller script. -                -100    Error program failure with optional message. - -    -------------------------------------------------------------------------- - -""" - - -def main(vDictArgs): -    dbg = utilsDebug.CDebugFnVerbose("Python script main()") -    bOk = True -    strMsg = "" -    strErrMsgProgFail = "" - -    bDbg = "-d" in vDictArgs - -    eOSType = utilsOsType.determine_os_type() -    if bDbg: -        pyVersion = sys.version_info -        print((strMsgOsVersion % utilsOsType.EnumOsType.name_of(eOSType))) -        print((strMsgPyVersion % (pyVersion[0], pyVersion[1]))) - -    bOk, strFrameworkPythonDir, strMsg = get_framework_python_dir(vDictArgs) - -    if bOk: -        bOk, strCfgBldDir, strMsg = get_config_build_dir( -            vDictArgs, strFrameworkPythonDir) -    if bOk and bDbg: -        print((strMsgPyFileLocatedHere % strFrameworkPythonDir)) -        print((strMsgConfigBuildDir % strCfgBldDir)) - -    if bOk: -        bOk, strLldbLibDir, strMsg = get_liblldb_dir(vDictArgs) - -    if bOk: -        bOk, strMsg = find_or_create_python_dir( -            vDictArgs, strFrameworkPythonDir) - -    if bOk: -        bOk, strMsg = create_symlinks( -            vDictArgs, strFrameworkPythonDir, strLldbLibDir) - -    bUseSystemSix = "--useSystemSix" in vDictArgs - -    if not bUseSystemSix and bOk: -        bOk, strMsg = copy_six(vDictArgs, strFrameworkPythonDir) - -    if bOk: -        bOk, strMsg = copy_lldbpy_file_to_lldb_pkg_dir(vDictArgs, -                                                       strFrameworkPythonDir, -                                                       strCfgBldDir) -    strRoot = os.path.normpath(vDictArgs["--srcRoot"]) -    if bOk: -        # lldb -        listPkgFiles = [ -            os.path.join( -                strRoot, -                "source", -                "Interpreter", -                "embedded_interpreter.py")] -        bOk, strMsg = create_py_pkg( -            vDictArgs, strFrameworkPythonDir, "", listPkgFiles) - -    if bOk: -        # lldb/formatters/cpp -        listPkgFiles = [ -            os.path.join( -                strRoot, -                "examples", -                "synthetic", -                "gnu_libstdcpp.py"), -            os.path.join( -                strRoot, -                "examples", -                "synthetic", -                "libcxx.py")] -        bOk, strMsg = create_py_pkg( -            vDictArgs, strFrameworkPythonDir, "/formatters/cpp", listPkgFiles) - -    if bOk: -        # Make an empty __init__.py in lldb/runtime as this is required for -        # Python to recognize lldb.runtime as a valid package (and hence, -        # lldb.runtime.objc as a valid contained package) -        listPkgFiles = [] -        bOk, strMsg = create_py_pkg( -            vDictArgs, strFrameworkPythonDir, "/runtime", listPkgFiles) - -    if bOk: -        # lldb/formatters -        # Having these files copied here ensure that lldb/formatters is a -        # valid package itself -        listPkgFiles = [ -            os.path.join( -                strRoot, "examples", "summaries", "cocoa", "cache.py"), os.path.join( -                strRoot, "examples", "summaries", "synth.py"), os.path.join( -                strRoot, "examples", "summaries", "cocoa", "metrics.py"), os.path.join( -                    strRoot, "examples", "summaries", "cocoa", "attrib_fromdict.py"), os.path.join( -                        strRoot, "examples", "summaries", "cocoa", "Logger.py")] -        bOk, strMsg = create_py_pkg( -            vDictArgs, strFrameworkPythonDir, "/formatters", listPkgFiles) - -    if bOk: -        # lldb/utils -        listPkgFiles = [ -            os.path.join( -                strRoot, -                "examples", -                "python", -                "symbolication.py")] -        bOk, strMsg = create_py_pkg( -            vDictArgs, strFrameworkPythonDir, "/utils", listPkgFiles) - -    if bOk and (eOSType == utilsOsType.EnumOsType.Darwin): -        # lldb/macosx -        listPkgFiles = [ -            os.path.join( -                strRoot, -                "examples", -                "python", -                "crashlog.py"), -            os.path.join( -                strRoot, -                "examples", -                "darwin", -                "heap_find", -                "heap.py")] -        bOk, strMsg = create_py_pkg( -            vDictArgs, strFrameworkPythonDir, "/macosx", listPkgFiles) - -    if bOk and (eOSType == utilsOsType.EnumOsType.Darwin): -        # lldb/diagnose -        listPkgFiles = [ -            os.path.join( -                strRoot, -                "examples", -                "python", -                "diagnose_unwind.py"), -            os.path.join( -                strRoot, -                "examples", -                "python", -                "diagnose_nsstring.py")] -        bOk, strMsg = create_py_pkg( -            vDictArgs, strFrameworkPythonDir, "/diagnose", listPkgFiles) - -    if bOk: -        bOk, strMsg = macosx_copy_file_for_heap( -            vDictArgs, strFrameworkPythonDir) - -    if bOk: -        return (0, strMsg) -    else: -        strErrMsgProgFail += strMsg -        return (-100, strErrMsgProgFail) - - -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- -#----------------------------------------------------------------------------- - -# This script can be called by another Python script by calling the main() -# function directly -if __name__ == "__main__": -    print("Script cannot be called directly, called by finishSwigWrapperClasses.py") diff --git a/scripts/Python/modify-python-lldb.py b/scripts/Python/modify-python-lldb.py deleted file mode 100644 index cb911eed047f..000000000000 --- a/scripts/Python/modify-python-lldb.py +++ /dev/null @@ -1,500 +0,0 @@ -# -# modify-python-lldb.py -# -# This script modifies the lldb module (which was automatically generated via -# running swig) to support iteration and/or equality operations for certain lldb -# objects, implements truth value testing for certain lldb objects, and adds a -# global variable 'debugger_unique_id' which is initialized to 0. -# -# As a cleanup step, it also removes the 'residues' from the autodoc features of -# swig.  For an example, take a look at SBTarget.h header file, where we take -# advantage of the already existing doxygen C++-docblock and make it the Python -# docstring for the same method.  The 'residues' in this context include the -# '#endif', the '#ifdef SWIG', the c comment marker, the trailing blank (SPC's) -# line, and the doxygen comment start marker. -# -# In addition to the 'residues' removal during the cleanup step, it also -# transforms the 'char' data type (which was actually 'char *' but the 'autodoc' -# feature of swig removes ' *' from it) into 'str' (as a Python str type). -# -# It also calls SBDebugger.Initialize() to initialize the lldb debugger -# subsystem. -# - -# System modules -import sys -import re -if sys.version_info.major >= 3: -    import io as StringIO -else: -    import StringIO - -# import use_lldb_suite so we can find third-party and helper modules -import use_lldb_suite - -# Third party modules -import six - -# LLDB modules - -if len(sys.argv) != 2: -    output_name = "./lldb.py" -else: -    output_name = sys.argv[1] + "/lldb.py" - -# print "output_name is '" + output_name + "'" - -# -# Version string -# -version_line = "swig_version = %s" - -# -# Residues to be removed. -# -c_endif_swig = "#endif" -c_ifdef_swig = "#ifdef SWIG" -c_comment_marker = "//------------" -# The pattern for recognizing the doxygen comment block line. -doxygen_comment_start = re.compile("^\s*(/// ?)") -# The demarcation point for turning on/off residue removal state. -# When bracketed by the lines, the CLEANUP_DOCSTRING state (see below) is ON. -toggle_docstring_cleanup_line = '        """' - - -def char_to_str_xform(line): -    """This transforms the 'char', i.e, 'char *' to 'str', Python string.""" -    line = line.replace(' char', ' str') -    line = line.replace('char ', 'str ') -    # Special case handling of 'char **argv' and 'char **envp'. -    line = line.replace('str argv', 'list argv') -    line = line.replace('str envp', 'list envp') -    return line - -# -# The one-liner docstring also needs char_to_str transformation, btw. -# -TWO_SPACES = ' ' * 2 -EIGHT_SPACES = ' ' * 8 -one_liner_docstring_pattern = re.compile( -    '^(%s|%s)""".*"""$' % -    (TWO_SPACES, EIGHT_SPACES)) - -# -# lldb_helpers and lldb_iter() should appear before our first SB* class definition. -# -lldb_helpers = ''' -# ================================== -# Helper function for SBModule class -# ================================== -def in_range(symbol, section): -    """Test whether a symbol is within the range of a section.""" -    symSA = symbol.GetStartAddress().GetFileAddress() -    symEA = symbol.GetEndAddress().GetFileAddress() -    secSA = section.GetFileAddress() -    secEA = secSA + section.GetByteSize() - -    if symEA != LLDB_INVALID_ADDRESS: -        if secSA <= symSA and symEA <= secEA: -            return True -        else: -            return False -    else: -        if secSA <= symSA and symSA < secEA: -            return True -        else: -            return False -''' - -lldb_iter_def = ''' -# =================================== -# Iterator for lldb container objects -# =================================== -def lldb_iter(obj, getsize, getelem): -    """A generator adaptor to support iteration for lldb container objects.""" -    size = getattr(obj, getsize) -    elem = getattr(obj, getelem) -    for i in range(size()): -        yield elem(i) - -# ============================================================================== -# The modify-python-lldb.py script is responsible for post-processing this SWIG- -# generated lldb.py module.  It is responsible for adding the above lldb_iter() -# function definition as well as the supports, in the following, for iteration -# protocol: __iter__, rich comparison methods: __eq__ and __ne__, truth value -# testing (and built-in operation bool()): __nonzero__, and built-in function -# len(): __len__. -# ============================================================================== -''' - -# -# linked_list_iter() is a special purpose iterator to treat the SBValue as the -# head of a list data structure, where you specify the child member name which -# points to the next item on the list and you specify the end-of-list function -# which takes an SBValue and returns True if EOL is reached and False if not. -# -linked_list_iter_def = ''' -    def __eol_test__(val): -        """Default function for end of list test takes an SBValue object. - -        Return True if val is invalid or it corresponds to a null pointer. -        Otherwise, return False. -        """ -        if not val or val.GetValueAsUnsigned() == 0: -            return True -        else: -            return False - -    # ================================================== -    # Iterator for lldb.SBValue treated as a linked list -    # ================================================== -    def linked_list_iter(self, next_item_name, end_of_list_test=__eol_test__): -        """Generator adaptor to support iteration for SBValue as a linked list. - -        linked_list_iter() is a special purpose iterator to treat the SBValue as -        the head of a list data structure, where you specify the child member -        name which points to the next item on the list and you specify the -        end-of-list test function which takes an SBValue for an item and returns -        True if EOL is reached and False if not. - -        linked_list_iter() also detects infinite loop and bails out early. - -        The end_of_list_test arg, if omitted, defaults to the __eol_test__ -        function above. - -        For example, - -        # Get Frame #0. -        ... - -        # Get variable 'task_head'. -        task_head = frame0.FindVariable('task_head') -        ... - -        for t in task_head.linked_list_iter('next'): -            print t -        """ -        if end_of_list_test(self): -            return -        item = self -        visited = set() -        try: -            while not end_of_list_test(item) and not item.GetValueAsUnsigned() in visited: -                visited.add(item.GetValueAsUnsigned()) -                yield item -                # Prepare for the next iteration. -                item = item.GetChildMemberWithName(next_item_name) -        except: -            # Exception occurred.  Stop the generator. -            pass - -        return -''' - -# This supports the iteration protocol. -iter_def = "    def __iter__(self): return lldb_iter(self, '%s', '%s')" -module_iter = "    def module_iter(self): return lldb_iter(self, '%s', '%s')" -breakpoint_iter = "    def breakpoint_iter(self): return lldb_iter(self, '%s', '%s')" -watchpoint_iter = "    def watchpoint_iter(self): return lldb_iter(self, '%s', '%s')" -section_iter = "    def section_iter(self): return lldb_iter(self, '%s', '%s')" -compile_unit_iter = "    def compile_unit_iter(self): return lldb_iter(self, '%s', '%s')" - -# Called to implement the built-in function len(). -# Eligible objects are those containers with unambiguous iteration support. -len_def = "    def __len__(self): return self.%s()" - -# This supports the rich comparison methods of __eq__ and __ne__. -eq_def = "    def __eq__(self, other): return isinstance(other, %s) and %s" -ne_def = "    def __ne__(self, other): return not self.__eq__(other)" - -# Called to implement truth value testing and the built-in operation bool(); -# Note that Python 2 uses __nonzero__(), whereas Python 3 uses __bool__() -# should return False or True, or their integer equivalents 0 or 1. -# Delegate to self.IsValid() if it is defined for the current lldb object. - -if six.PY2: -    nonzero_def = "    def __nonzero__(self): return self.IsValid()" -else: -    nonzero_def = "    def __bool__(self): return self.IsValid()" - -# A convenience iterator for SBSymbol! -symbol_in_section_iter_def = ''' -    def symbol_in_section_iter(self, section): -        """Given a module and its contained section, returns an iterator on the -        symbols within the section.""" -        for sym in self: -            if in_range(sym, section): -                yield sym -''' - -# -# This dictionary defines a mapping from classname to (getsize, getelem) tuple. -# -d = {'SBBreakpoint': ('GetNumLocations', 'GetLocationAtIndex'), -     'SBCompileUnit': ('GetNumLineEntries', 'GetLineEntryAtIndex'), -     'SBDebugger': ('GetNumTargets', 'GetTargetAtIndex'), -     'SBModule': ('GetNumSymbols', 'GetSymbolAtIndex'), -     'SBProcess': ('GetNumThreads', 'GetThreadAtIndex'), -     'SBSection': ('GetNumSubSections', 'GetSubSectionAtIndex'), -     'SBThread': ('GetNumFrames', 'GetFrameAtIndex'), - -     'SBInstructionList': ('GetSize', 'GetInstructionAtIndex'), -     'SBStringList': ('GetSize', 'GetStringAtIndex',), -     'SBSymbolContextList': ('GetSize', 'GetContextAtIndex'), -     'SBTypeList': ('GetSize', 'GetTypeAtIndex'), -     'SBValueList': ('GetSize', 'GetValueAtIndex'), - -     'SBType': ('GetNumberChildren', 'GetChildAtIndex'), -     'SBValue': ('GetNumChildren', 'GetChildAtIndex'), - -     # SBTarget needs special processing, see below. -     'SBTarget': {'module': ('GetNumModules', 'GetModuleAtIndex'), -                  'breakpoint': ('GetNumBreakpoints', 'GetBreakpointAtIndex'), -                  'watchpoint': ('GetNumWatchpoints', 'GetWatchpointAtIndex') -                  }, - -     # SBModule has an additional section_iter(), see below. -     'SBModule-section': ('GetNumSections', 'GetSectionAtIndex'), -     # And compile_unit_iter(). -     'SBModule-compile-unit': ('GetNumCompileUnits', 'GetCompileUnitAtIndex'), -     # As well as symbol_in_section_iter(). -     'SBModule-symbol-in-section': symbol_in_section_iter_def -     } - -# -# This dictionary defines a mapping from classname to equality method name(s). -# -e = {'SBAddress': ['GetFileAddress', 'GetModule'], -     'SBBreakpoint': ['GetID'], -     'SBWatchpoint': ['GetID'], -     'SBFileSpec': ['GetFilename', 'GetDirectory'], -     'SBModule': ['GetFileSpec', 'GetUUIDString'], -     'SBType': ['GetByteSize', 'GetName'] -     } - - -def list_to_frag(list): -    """Transform a list to equality program fragment. - -    For example, ['GetID'] is transformed to 'self.GetID() == other.GetID()', -    and ['GetFilename', 'GetDirectory'] to 'self.GetFilename() == other.GetFilename() -    and self.GetDirectory() == other.GetDirectory()'. -    """ -    if not list: -        raise Exception("list should be non-empty") -    frag = StringIO.StringIO() -    for i in range(len(list)): -        if i > 0: -            frag.write(" and ") -        frag.write("self.{0}() == other.{0}()".format(list[i])) -    return frag.getvalue() - - -class NewContent(StringIO.StringIO): -    """Simple facade to keep track of the previous line to be committed.""" - -    def __init__(self): -        StringIO.StringIO.__init__(self) -        self.prev_line = None - -    def add_line(self, a_line): -        """Add a line to the content, if there is a previous line, commit it.""" -        if self.prev_line is not None: -            self.write(self.prev_line + "\n") -        self.prev_line = a_line - -    def del_line(self): -        """Forget about the previous line, do not commit it.""" -        self.prev_line = None - -    def del_blank_line(self): -        """Forget about the previous line if it is a blank line.""" -        if self.prev_line is not None and not self.prev_line.strip(): -            self.prev_line = None - -    def finish(self): -        """Call this when you're finished with populating content.""" -        if self.prev_line is not None: -            self.write(self.prev_line + "\n") -        self.prev_line = None - -# The new content will have the iteration protocol defined for our lldb -# objects. -new_content = NewContent() - -with open(output_name, 'r') as f_in: -    content = f_in.read() - -# The pattern for recognizing the SWIG Version string -version_pattern = re.compile("^# Version:? (.*)$") - -# The pattern for recognizing the beginning of an SB class definition. -class_pattern = re.compile("^class (SB.*)\(_object\):$") - -# The pattern for recognizing the beginning of the __init__ method definition. -init_pattern = re.compile("^    def __init__\(self.*\):") - -# The pattern for recognizing the beginning of the IsValid method definition. -isvalid_pattern = re.compile("^    def IsValid\(") - -# These define the states of our finite state machine. -EXPECTING_VERSION = 0 -NORMAL = 1 -DEFINING_ITERATOR = 2 -DEFINING_EQUALITY = 4 -CLEANUP_DOCSTRING = 8 - -# The lldb_iter_def only needs to be inserted once. -lldb_iter_defined = False - -# Our FSM begins its life in the NORMAL state, and transitions to the -# DEFINING_ITERATOR and/or DEFINING_EQUALITY state whenever it encounters the -# beginning of certain class definitions, see dictionaries 'd' and 'e' above. -# -# Note that the two states DEFINING_ITERATOR and DEFINING_EQUALITY are -# orthogonal in that our FSM can be in one, the other, or both states at the -# same time.  During such time, the FSM is eagerly searching for the __init__ -# method definition in order to insert the appropriate method(s) into the lldb -# module. -# -# The state CLEANUP_DOCSTRING can be entered from either the NORMAL or the -# DEFINING_ITERATOR/EQUALITY states.  While in this state, the FSM is fixing/ -# cleaning the Python docstrings generated by the swig docstring features. -# -# The FSM, in all possible states, also checks the current input for IsValid() -# definition, and inserts a __nonzero__() method definition to implement truth -# value testing and the built-in operation bool(). -state = EXPECTING_VERSION - -swig_version_tuple = None -for line in content.splitlines(): -    # Handle the state transition into CLEANUP_DOCSTRING state as it is possible -    # to enter this state from either NORMAL or DEFINING_ITERATOR/EQUALITY. -    # -    # If '        """' is the sole line, prepare to transition to the -    # CLEANUP_DOCSTRING state or out of it. - -    if line == toggle_docstring_cleanup_line: -        if state & CLEANUP_DOCSTRING: -            # Special handling of the trailing blank line right before the '"""' -            # end docstring marker. -            new_content.del_blank_line() -            state ^= CLEANUP_DOCSTRING -        else: -            state |= CLEANUP_DOCSTRING - -    if state == EXPECTING_VERSION: -        # We haven't read the version yet, read it now. -        if swig_version_tuple is None: -            match = version_pattern.search(line) -            if match: -                v = match.group(1) -                swig_version_tuple = tuple(map(int, (v.split(".")))) -        elif not line.startswith('#'): -            # This is the first non-comment line after the header.  Inject the -            # version -            new_line = version_line % str(swig_version_tuple) -            new_content.add_line(new_line) -            state = NORMAL - -    if state == NORMAL: -        match = class_pattern.search(line) -        # Inserts lldb_helpers and the lldb_iter() definition before the first -        # class definition. -        if not lldb_iter_defined and match: -            new_content.add_line(lldb_helpers) -            new_content.add_line(lldb_iter_def) -            lldb_iter_defined = True - -        # If we are at the beginning of the class definitions, prepare to -        # transition to the DEFINING_ITERATOR/DEFINING_EQUALITY state for the -        # right class names. -        if match: -            cls = match.group(1) -            if cls in d: -                # Adding support for iteration for the matched SB class. -                state |= DEFINING_ITERATOR -            if cls in e: -                # Adding support for eq and ne for the matched SB class. -                state |= DEFINING_EQUALITY - -    if (state & DEFINING_ITERATOR) or (state & DEFINING_EQUALITY): -        match = init_pattern.search(line) -        if match: -            # We found the beginning of the __init__ method definition. -            # This is a good spot to insert the iter and/or eq-ne support. -            # -            # But note that SBTarget has three types of iterations. -            if cls == "SBTarget": -                new_content.add_line(module_iter % (d[cls]['module'])) -                new_content.add_line(breakpoint_iter % (d[cls]['breakpoint'])) -                new_content.add_line(watchpoint_iter % (d[cls]['watchpoint'])) -            else: -                if (state & DEFINING_ITERATOR): -                    new_content.add_line(iter_def % d[cls]) -                    new_content.add_line(len_def % d[cls][0]) -                if (state & DEFINING_EQUALITY): -                    new_content.add_line(eq_def % (cls, list_to_frag(e[cls]))) -                    new_content.add_line(ne_def) - -            # SBModule has extra SBSection, SBCompileUnit iterators and -            # symbol_in_section_iter()! -            if cls == "SBModule": -                new_content.add_line(section_iter % d[cls + '-section']) -                new_content.add_line(compile_unit_iter % -                                     d[cls + '-compile-unit']) -                new_content.add_line(d[cls + '-symbol-in-section']) - -            # This special purpose iterator is for SBValue only!!! -            if cls == "SBValue": -                new_content.add_line(linked_list_iter_def) - -            # Next state will be NORMAL. -            state = NORMAL - -    if (state & CLEANUP_DOCSTRING): -        # Cleanse the lldb.py of the autodoc'ed residues. -        if c_ifdef_swig in line or c_endif_swig in line: -            continue -        # As well as the comment marker line. -        if c_comment_marker in line: -            continue - -        # Also remove the '\a ' and '\b 'substrings. -        line = line.replace('\a ', '') -        line = line.replace('\b ', '') -        # And the leading '///' substring. -        doxygen_comment_match = doxygen_comment_start.match(line) -        if doxygen_comment_match: -            line = line.replace(doxygen_comment_match.group(1), '', 1) - -        line = char_to_str_xform(line) - -        # Note that the transition out of CLEANUP_DOCSTRING is handled at the -        # beginning of this function already. - -    # This deals with one-liner docstring, for example, SBThread.GetName: -    # """GetName(self) -> char""". -    if one_liner_docstring_pattern.match(line): -        line = char_to_str_xform(line) - -    # Look for 'def IsValid(*args):', and once located, add implementation -    # of truth value testing for this object by delegation. -    if isvalid_pattern.search(line): -        new_content.add_line(nonzero_def) - -    # Pass the original line of content to new_content. -    new_content.add_line(line) - -# We are finished with recording new content. -new_content.finish() - -with open(output_name, 'w') as f_out: -    f_out.write(new_content.getvalue()) -    f_out.write('''debugger_unique_id = 0 -SBDebugger.Initialize() -debugger = None -target = SBTarget() -process = SBProcess() -thread = SBThread() -frame = SBFrame()''') diff --git a/scripts/Python/modules/CMakeLists.txt b/scripts/Python/modules/CMakeLists.txt deleted file mode 100644 index f2269c342005..000000000000 --- a/scripts/Python/modules/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -# Disable some warnings triggered by Python's headers. -check_cxx_compiler_flag("-Wno-macro-redefined" -                        CXX_SUPPORTS_NO_MACRO_REDEFINED) -if (CXX_SUPPORTS_NO_MACRO_REDEFINED) -  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-macro-redefined") -endif () - -# build the Python readline suppression module only on Linux -if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "GNU" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "kFreeBSD") -   add_subdirectory(readline) -endif() diff --git a/scripts/Python/modules/readline/CMakeLists.txt b/scripts/Python/modules/readline/CMakeLists.txt deleted file mode 100644 index 876ab341682b..000000000000 --- a/scripts/Python/modules/readline/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# FIXME: if a non-standard version of python is requested, the cmake macro -# below will need Python_ADDITIONAL_VERSIONS set in order to find it. -include(FindPythonInterp) -SET(PYTHON_DIRECTORY python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages) - -# Build the readline python module -include_directories(${PYTHON_INCLUDE_DIR}) -add_library(readline SHARED readline.cpp) -target_link_libraries(readline ${PYTHON_LIBRARY}) - -if (NOT LLDB_DISABLE_LIBEDIT) -  target_include_directories(readline -                             PRIVATE -                               ${libedit_INCLUDE_DIRS}) -  target_link_libraries(readline ${libedit_LIBRARIES}) -endif() - -# FIXME: the LIBRARY_OUTPUT_PATH seems to be ignored - this is not a -# functional issue for the build dir, though, since the shared lib dir -# for the build is in the python shared library load path, and thus -# python finds it when loading the python readline module. -set_target_properties(readline PROPERTIES -                               PREFIX "" -                               LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/${PYTHON_DIRECTORY}) - -# Install the readline module. -install(TARGETS readline LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}/${PYTHON_DIRECTORY}) diff --git a/scripts/Python/modules/readline/readline.cpp b/scripts/Python/modules/readline/readline.cpp deleted file mode 100644 index b84dbb819f99..000000000000 --- a/scripts/Python/modules/readline/readline.cpp +++ /dev/null @@ -1,87 +0,0 @@ -// NOTE: Since Python may define some pre-processor definitions which affect the -// standard headers on some systems, you must include Python.h before any -// standard headers are included. -#include "Python.h" - -#include <stdio.h> - -#ifndef LLDB_DISABLE_LIBEDIT -#include <editline/readline.h> -#endif - -// Simple implementation of the Python readline module using libedit. -// In the event that libedit is excluded from the build, this turns -// back into a null implementation that blocks the module from pulling -// in the GNU readline shared lib, which causes linkage confusion when -// both readline and libedit's readline compatibility symbols collide. -// -// Currently it only installs a PyOS_ReadlineFunctionPointer, without -// implementing any of the readline module methods. This is meant to -// work around LLVM pr18841 to avoid seg faults in the stock Python -// readline.so linked against GNU readline. - -#ifndef LLDB_DISABLE_LIBEDIT -PyDoc_STRVAR(moduleDocumentation, -             "Simple readline module implementation based on libedit."); -#else -PyDoc_STRVAR(moduleDocumentation, -             "Stub module meant to avoid linking GNU readline."); -#endif - -#if PY_MAJOR_VERSION >= 3 -static struct PyModuleDef readline_module = { -    PyModuleDef_HEAD_INIT, // m_base -    "readline",            // m_name -    moduleDocumentation,   // m_doc -    -1,                    // m_size -    nullptr,               // m_methods -    nullptr,               // m_reload -    nullptr,               // m_traverse -    nullptr,               // m_clear -    nullptr,               // m_free -}; -#else -static struct PyMethodDef moduleMethods[] = {{nullptr, nullptr, 0, nullptr}}; -#endif - -#ifndef LLDB_DISABLE_LIBEDIT -static char * -#if PY_MAJOR_VERSION >= 3 -simple_readline(FILE *stdin, FILE *stdout, const char *prompt) -#else -simple_readline(FILE *stdin, FILE *stdout, char *prompt) -#endif -{ -  rl_instream = stdin; -  rl_outstream = stdout; -  char *line = readline(prompt); -  if (!line) { -    char *ret = (char *)PyMem_Malloc(1); -    if (ret != NULL) -      *ret = '\0'; -    return ret; -  } -  if (*line) -    add_history(line); -  int n = strlen(line); -  char *ret = (char *)PyMem_Malloc(n + 2); -  strncpy(ret, line, n); -  free(line); -  ret[n] = '\n'; -  ret[n + 1] = '\0'; -  return ret; -} -#endif - -PyMODINIT_FUNC initreadline(void) { -#ifndef LLDB_DISABLE_LIBEDIT -  PyOS_ReadlineFunctionPointer = simple_readline; -#endif - -#if PY_MAJOR_VERSION >= 3 -  return PyModule_Create(&readline_module); -#else -  Py_InitModule4("readline", moduleMethods, moduleDocumentation, -                 static_cast<PyObject *>(NULL), PYTHON_API_VERSION); -#endif -} diff --git a/scripts/Python/prepare_binding_Python.py b/scripts/Python/prepare_binding_Python.py deleted file mode 100644 index cf64d49504f3..000000000000 --- a/scripts/Python/prepare_binding_Python.py +++ /dev/null @@ -1,441 +0,0 @@ -""" -                     The LLVM Compiler Infrastructure - -This file is distributed under the University of Illinois Open Source -License. See LICENSE.TXT for details. - -Python binding preparation script. -""" - -# Python modules: -from __future__ import print_function - -import logging -import os -import re -import shutil -import subprocess -import sys -import platform - - -class SwigSettings(object): -    """Provides a single object to represent swig files and settings.""" - -    def __init__(self): -        self.extensions_file = None -        self.header_files = None -        self.input_file = None -        self.interface_files = None -        self.output_file = None -        self.safecast_file = None -        self.typemaps_file = None -        self.wrapper_file = None - -    @classmethod -    def _any_files_newer(cls, files, check_mtime): -        """Returns if any of the given files has a newer modified time. - -        @param cls the class -        @param files a list of zero or more file paths to check -        @param check_mtime the modification time to use as a reference. - -        @return True if any file's modified time is newer than check_mtime. -        """ -        for path in files: -            path_mtime = os.path.getmtime(path) -            if path_mtime > check_mtime: -                # This path was modified more recently than the -                # check_mtime. -                return True -        # If we made it here, nothing was newer than the check_mtime -        return False - -    @classmethod -    def _file_newer(cls, path, check_mtime): -        """Tests how recently a file has been modified. - -        @param cls the class -        @param path a file path to check -        @param check_mtime the modification time to use as a reference. - -        @return True if the file's modified time is newer than check_mtime. -        """ -        path_mtime = os.path.getmtime(path) -        return path_mtime > check_mtime - -    def output_out_of_date(self): -        """Returns whether the output file is out of date. - -        Compares output file time to all the input files. - -        @return True if any of the input files are newer than -        the output file, or if the output file doesn't exist; -        False otherwise. -        """ -        if not os.path.exists(self.output_file): -            logging.info("will generate, missing binding output file") -            return True -        output_mtime = os.path.getmtime(self.output_file) -        if self._any_files_newer(self.header_files, output_mtime): -            logging.info("will generate, header files newer") -            return True -        if self._any_files_newer(self.interface_files, output_mtime): -            logging.info("will generate, interface files newer") -            return True -        if self._file_newer(self.input_file, output_mtime): -            logging.info("will generate, swig input file newer") -            return True -        if self._file_newer(self.extensions_file, output_mtime): -            logging.info("will generate, swig extensions file newer") -            return True -        if self._file_newer(self.wrapper_file, output_mtime): -            logging.info("will generate, swig wrapper file newer") -            return True -        if self._file_newer(self.typemaps_file, output_mtime): -            logging.info("will generate, swig typemaps file newer") -            return True -        if self._file_newer(self.safecast_file, output_mtime): -            logging.info("will generate, swig safecast file newer") -            return True - -        # If we made it here, nothing is newer than the output file. -        # Thus, the output file is not out of date. -        return False - - -def get_header_files(options): -    """Returns a list of paths to C++ header files for the LLDB API. - -    These are the files that define the C++ API that will be wrapped by Python. - -    @param options the dictionary of options parsed from the command line. - -    @return a list of full paths to the include files used to define the public -    LLDB C++ API. -    """ - -    header_file_paths = [] -    header_base_dir = os.path.join(options.src_root, "include", "lldb") - -    # Specify the include files in include/lldb that are not easy to -    # grab programatically. -    for header in [ -            "lldb-defines.h", -            "lldb-enumerations.h", -            "lldb-forward.h", -            "lldb-types.h"]: -        header_file_paths.append(os.path.normcase( -            os.path.join(header_base_dir, header))) - -    # Include the main LLDB.h file. -    api_dir = os.path.join(header_base_dir, "API") -    header_file_paths.append(os.path.normcase( -        os.path.join(api_dir, "LLDB.h"))) - -    filename_regex = re.compile(r"^SB.+\.h$") - -    # Include all the SB*.h files in the API dir. -    for filename in os.listdir(api_dir): -        if filename_regex.match(filename): -            header_file_paths.append( -                os.path.normcase(os.path.join(api_dir, filename))) - -    logging.debug("found public API header file paths: %s", header_file_paths) -    return header_file_paths - - -def get_interface_files(options): -    """Returns a list of interface files used as input to swig. - -    @param options the options dictionary parsed from the command line args. - -    @return a list of full paths to the interface (.i) files used to describe -    the public API language binding. -    """ -    interface_file_paths = [] -    interface_dir = os.path.join(options.src_root, "scripts", "interface") - -    for filepath in [f for f in os.listdir(interface_dir) -                     if os.path.splitext(f)[1] == ".i"]: -        interface_file_paths.append( -            os.path.normcase(os.path.join(interface_dir, filepath))) - -    logging.debug("found swig interface files: %s", interface_file_paths) -    return interface_file_paths - - -def remove_ignore_enoent(filename): -    """Removes given file, ignoring error if it doesn't exist. - -    @param filename the path of the file to remove. -    """ -    try: -        os.remove(filename) -    except OSError as error: -        import errno -        if error.errno != errno.ENOENT: -            raise - - -def do_swig_rebuild(options, dependency_file, config_build_dir, settings): -    """Generates Python bindings file from swig. - -    This method will do a sys.exit() if something fails.  If it returns to -    the caller, it succeeded. - -    @param options the parsed command line options structure. -    @param dependency_file path to the bindings dependency file -    to be generated; otherwise, None if a dependency file is not -    to be generated. -    @param config_build_dir used as the output directory used by swig -    @param settings the SwigSettings that specify a number of aspects used -    to configure building the Python binding with swig (mostly paths) -    """ -    if options.generate_dependency_file: -        temp_dep_file_path = dependency_file + ".tmp" - -    # Build the SWIG args list -    is_darwin = options.target_platform == "Darwin" -    gen_deps = options.generate_dependency_file -    darwin_extras = ["-D__APPLE__"] if is_darwin else [] -    deps_args = ["-MMD", "-MF", temp_dep_file_path] if gen_deps else [] -    command = ([ -            options.swig_executable, -            "-c++", -            "-shadow", -            "-python", -            "-threads", -            "-I" + os.path.normpath(os.path.join(options.src_root, "include")), -            "-I" + os.path.curdir, -            "-D__STDC_LIMIT_MACROS", -            "-D__STDC_CONSTANT_MACROS" -        ] -        + darwin_extras -        + deps_args -        + [ -            "-outdir", config_build_dir, -            "-o", settings.output_file, -            settings.input_file -        ] -    ) -    logging.info("running swig with: %r", command) - -    # Execute swig -    process = subprocess.Popen( -        command, -        stdout=subprocess.PIPE, -        stderr=subprocess.PIPE, -    ) -    # Wait for SWIG process to terminate -    swig_stdout, swig_stderr = process.communicate() -    return_code = process.returncode -    if return_code != 0: -        logging.error( -            "swig failed with error code %d: stdout=%s, stderr=%s", -            return_code, -            swig_stdout, -            swig_stderr) -        logging.error( -            "command line:\n%s", ' '.join(command)) -        sys.exit(return_code) - -    logging.info("swig generation succeeded") -    if swig_stdout is not None and len(swig_stdout) > 0: -        logging.info("swig output: %s", swig_stdout) - -    # Move the depedency file we just generated to the proper location. -    if options.generate_dependency_file: -        if os.path.exists(temp_dep_file_path): -            shutil.move(temp_dep_file_path, dependency_file) -        else: -            logging.error( -                "failed to generate Python binding depedency file '%s'", -                temp_dep_file_path) -            if os.path.exists(dependency_file): -                # Delete the old one. -                os.remove(dependency_file) -            sys.exit(-10) - - -def run_python_script(script_and_args): -    """Runs a python script, logging appropriately. - -    If the command returns anything non-zero, it is registered as -    an error and exits the program. - -    @param script_and_args the python script to execute, along with -    the command line arguments to pass to it. -    """ -    command = [sys.executable] + script_and_args -    process = subprocess.Popen(command) -    script_stdout, script_stderr = process.communicate() -    return_code = process.returncode -    if return_code != 0: -        logging.error("failed to run %r: %r", command, script_stderr) -        sys.exit(return_code) -    else: -        logging.info("ran script %r'", command) -        if script_stdout is not None: -            logging.info("output: %s", script_stdout) - - -def do_modify_python_lldb(options, config_build_dir): -    """Executes the modify-python-lldb.py script. - -    @param options the parsed command line arguments -    @param config_build_dir the directory where the Python output was created. -    """ -    script_path = os.path.normcase( -        os.path.join( -            options.src_root, -            "scripts", -            "Python", -            "modify-python-lldb.py")) - -    if not os.path.exists(script_path): -        logging.error("failed to find python script: '%s'", script_path) -        sys.exit(-11) - -    run_python_script([script_path, config_build_dir]) - - -def get_python_module_path(options): -    """Returns the location where the lldb Python module should be placed. - -    @param options dictionary of options parsed from the command line. - -    @return the directory where the lldb module should be placed. -    """ -    if options.framework: -        # Caller wants to use the OS X framework packaging. - -        # We are packaging in an OS X-style framework bundle. The -        # module dir will be within the -        # LLDB.framework/Resources/Python subdirectory. -        return os.path.join( -            options.target_dir, -            "LLDB.framework", -            "Resources", -            "Python", -            "lldb") -    else: -        from distutils.sysconfig import get_python_lib - -        if options.prefix is not None: -            module_path = get_python_lib(True, False, options.prefix) -        else: -            module_path = get_python_lib(True, False) -        return os.path.normcase( -            os.path.join(module_path, "lldb")) - - -def main(options): -    """Pepares the Python language binding to LLDB. - -    @param options the parsed command line argument dictionary -    """ -    # Setup generated dependency file options. -    if options.generate_dependency_file: -        dependency_file = os.path.normcase(os.path.join( -            options.target_dir, "LLDBWrapPython.cpp.d")) -    else: -        dependency_file = None - -    # Keep track of all the swig-related settings. -    settings = SwigSettings() - -    # Determine the final binding file path. -    settings.output_file = os.path.normcase( -        os.path.join(options.target_dir, "LLDBWrapPython.cpp")) - -    # Touch the output file (but don't really generate it) if python -    # is disabled. -    disable_python = os.getenv("LLDB_DISABLE_PYTHON", None) -    if disable_python is not None and disable_python == "1": -        remove_ignore_enoent(settings.output_file) -        # Touch the file. -        open(settings.output_file, 'w').close() -        logging.info( -            "Created empty python binding file due to LLDB_DISABLE_PYTHON " -            "being set") -        return - -    # We also check the GCC_PREPROCESSOR_DEFINITIONS to see if it -    # contains LLDB_DISABLE_PYTHON.  If so, we skip generating -    # the binding. -    gcc_preprocessor_defs = os.getenv("GCC_PREPROCESSOR_DEFINITIONS", None) -    if gcc_preprocessor_defs is not None: -        if re.search(r"LLDB_DISABLE_PYTHON", gcc_preprocessor_defs): -            remove_ignore_enoent(settings.output_file) -            # Touch the file -            open(settings.output_file, 'w').close() -            logging.info( -                "Created empty python binding file due to " -                "finding LLDB_DISABLE_PYTHON in GCC_PREPROCESSOR_DEFINITIONS") -            return - -    # Setup paths used during swig invocation. -    settings.input_file = os.path.normcase( -        os.path.join(options.src_root, "scripts", "lldb.swig")) -    scripts_python_dir = os.path.dirname(os.path.realpath(__file__)) -    settings.extensions_file = os.path.normcase( -        os.path.join(scripts_python_dir, "python-extensions.swig")) -    settings.wrapper_file = os.path.normcase( -        os.path.join(scripts_python_dir, "python-wrapper.swig")) -    settings.typemaps_file = os.path.normcase( -        os.path.join(scripts_python_dir, "python-typemaps.swig")) -    settings.safecast_file = os.path.normcase( -        os.path.join(scripts_python_dir, "python-swigsafecast.swig")) - -    settings.header_files = get_header_files(options) -    settings.interface_files = get_interface_files(options) - -    generate_output = settings.output_out_of_date() - -    # Determine where to put the module. -    python_module_path = get_python_module_path(options) -    logging.info("python module path: %s", python_module_path) - -    # Handle the configuration build dir. -    if options.config_build_dir is not None: -        config_build_dir = options.config_build_dir -    else: -        config_build_dir = python_module_path - -    # Allow missing/non-link _lldb.so to force regeneration. -    if not generate_output: -        # Ensure the _lldb.so file exists. -        so_path = os.path.join(python_module_path, "_lldb.so") -        if not os.path.exists(so_path) or not os.path.islink(so_path): -            logging.info("_lldb.so doesn't exist or isn't a symlink") -            generate_output = True - -    # Allow missing __init__.py to force regeneration. -    if not generate_output: -        # Ensure the __init__.py for the lldb module can be found. -        init_path = os.path.join(python_module_path, "__init__.py") -        if not os.path.exists(init_path): -            logging.info("__init__.py doesn't exist") -            generate_output = True - -    if not generate_output: -        logging.info( -            "Skipping Python binding generation: everything is up to date") -        return - -    # Generate the Python binding with swig. -    logging.info("Python binding is out of date, regenerating") -    do_swig_rebuild(options, dependency_file, config_build_dir, settings) -    if options.generate_dependency_file: -        return - -    # Post process the swig-generated file. -    do_modify_python_lldb(options, config_build_dir) - - -# This script can be called by another Python script by calling the main() -# function directly -if __name__ == "__main__": -    print("Script cannot be called directly.") -    sys.exit(-1) diff --git a/scripts/Python/python-extensions.swig b/scripts/Python/python-extensions.swig deleted file mode 100644 index 892e1af4bae5..000000000000 --- a/scripts/Python/python-extensions.swig +++ /dev/null @@ -1,1239 +0,0 @@ - -%extend lldb::SBAddress { -        %nothreadallow; -        PyObject *lldb::SBAddress::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBBlock { -        %nothreadallow; -        PyObject *lldb::SBBlock::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBBreakpoint { -        %nothreadallow; -        PyObject *lldb::SBBreakpoint::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -         -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} - -} -%extend lldb::SBBreakpointLocation { -        %nothreadallow; -        PyObject *lldb::SBBreakpointLocation::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description, lldb::eDescriptionLevelFull); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} - -%extend lldb::SBBreakpointName { -        %nothreadallow; -        PyObject *lldb::SBBreakpointName::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} - -%extend lldb::SBBroadcaster { -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} -} - -%extend lldb::SBCommandReturnObject { -        %nothreadallow; -        PyObject *lldb::SBCommandReturnObject::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -         -        /* the write() and flush() calls are not part of the SB API proper, and are solely for Python usage -        they are meant to make an SBCommandReturnObject into a file-like object so that instructions of the sort -        print >>sb_command_return_object, "something" -        will work correctly */ - -        void lldb::SBCommandReturnObject::write (const char* str) -        { -            if (str) -                $self->Printf("%s",str); -        } -        void lldb::SBCommandReturnObject::flush () -        {} -} -%extend lldb::SBCompileUnit { -        %nothreadallow; -        PyObject *lldb::SBCompileUnit::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} -} -%extend lldb::SBData { -        %nothreadallow; -        PyObject *lldb::SBData::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBDebugger { -        %nothreadallow; -        PyObject *lldb::SBDebugger::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBDeclaration { -        %nothreadallow; -        PyObject *lldb::SBDeclaration::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -         -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} - -} -%extend lldb::SBError { -        %nothreadallow; -        PyObject *lldb::SBError::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBFileSpec { -        %nothreadallow; -        PyObject *lldb::SBFileSpec::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBFrame { -        %nothreadallow; -        PyObject *lldb::SBFrame::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBFunction { -        %nothreadallow; -        PyObject *lldb::SBFunction::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -         -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} - -} -%extend lldb::SBInstruction { -        %nothreadallow; -        PyObject *lldb::SBInstruction::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBInstructionList { -        %nothreadallow; -        PyObject *lldb::SBInstructionList::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBLineEntry { -        %nothreadallow; -        PyObject *lldb::SBLineEntry::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -         -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} -} - -%extend lldb::SBMemoryRegionInfo { -        %nothreadallow; -        PyObject *lldb::SBMemoryRegionInfo::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} - -%extend lldb::SBModule { -        %nothreadallow; -        PyObject *lldb::SBModule::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -         -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} -} - -%extend lldb::SBModuleSpec { -        %nothreadallow; -        PyObject *lldb::SBModuleSpec::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} - -%extend lldb::SBModuleSpecList { -        %nothreadallow; -        PyObject *lldb::SBModuleSpecList::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} - -%extend lldb::SBProcess { -        %nothreadallow; -        PyObject *lldb::SBProcess::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBSection { -        %nothreadallow; -        PyObject *lldb::SBSection::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -         -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} -} -%extend lldb::SBStream { -        /* the write() and flush() calls are not part of the SB API proper, and are solely for Python usage -        they are meant to make an SBStream into a file-like object so that instructions of the sort -        print >>sb_stream, "something" -        will work correctly */ - -        void lldb::SBStream::write (const char* str) -        { -            if (str) -                $self->Printf("%s",str); -        } -        void lldb::SBStream::flush () -        {} -} -%extend lldb::SBSymbol { -        %nothreadallow; -        PyObject *lldb::SBSymbol::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -    %pythoncode %{ -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} -} -%extend lldb::SBSymbolContext { -        %nothreadallow; -        PyObject *lldb::SBSymbolContext::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBSymbolContextList { -        %nothreadallow; -        PyObject *lldb::SBSymbolContextList::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} - -%extend lldb::SBTarget { -        %nothreadallow; -        PyObject *lldb::SBTarget::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description, lldb::eDescriptionLevelBrief); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; - -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} -} - -%extend lldb::SBType { -        %nothreadallow; -        PyObject *lldb::SBType::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description, lldb::eDescriptionLevelBrief); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBTypeCategory { -        %nothreadallow; -        PyObject *lldb::SBTypeCategory::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description, lldb::eDescriptionLevelBrief); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBTypeFilter { -        %nothreadallow; -        PyObject *lldb::SBTypeFilter::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description, lldb::eDescriptionLevelBrief); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} -} -%extend lldb::SBTypeFormat { -        %nothreadallow; -        PyObject *lldb::SBTypeFormat::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description, lldb::eDescriptionLevelBrief); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBTypeMember { -        %nothreadallow; -        PyObject *lldb::SBTypeMember::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description, lldb::eDescriptionLevelBrief); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBTypeMemberFunction { -        %nothreadallow; -        PyObject *lldb::SBTypeMemberFunction::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description, lldb::eDescriptionLevelBrief); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBTypeEnumMember { -        %nothreadallow; -        PyObject *lldb::SBTypeEnumMember::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description, lldb::eDescriptionLevelBrief); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBTypeNameSpecifier { -        %nothreadallow; -        PyObject *lldb::SBTypeNameSpecifier::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description, lldb::eDescriptionLevelBrief); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} -} -%extend lldb::SBTypeSummary { -        %nothreadallow; -        PyObject *lldb::SBTypeSummary::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description, lldb::eDescriptionLevelBrief); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} -} -%extend lldb::SBTypeSynthetic { -        %nothreadallow; -        PyObject *lldb::SBTypeSynthetic::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description, lldb::eDescriptionLevelBrief); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} -} -%extend lldb::SBThread { -        %nothreadallow; -        PyObject *lldb::SBThread::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -    %pythoncode %{  -        def __eq__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return False  -             -            return getattr(_lldb,self.__class__.__name__+"___eq__")(self, rhs) -             -        def __ne__(self, rhs): -            if not isinstance(rhs, type(self)):  -                return True  -             -            return getattr(_lldb,self.__class__.__name__+"___ne__")(self, rhs) -    %} -} -%extend lldb::SBValue { -        %nothreadallow; -        PyObject *lldb::SBValue::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBValueList { -        %nothreadallow; -        PyObject *lldb::SBValueList::__str__ (){ -                lldb::SBStream description; -                const size_t n = $self->GetSize(); -                if (n) -                { -                    for (size_t i=0; i<n; ++i) -                        $self->GetValueAtIndex(i).GetDescription(description); -                } -                else -                { -                    description.Printf("<empty> lldb.SBValueList()"); -                } -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} -%extend lldb::SBWatchpoint { -        %nothreadallow; -        PyObject *lldb::SBWatchpoint::__str__ (){ -                lldb::SBStream description; -                $self->GetDescription (description, lldb::eDescriptionLevelVerbose); -                const char *desc = description.GetData(); -                size_t desc_len = description.GetSize(); -                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r')) -                    --desc_len; -                if (desc_len > 0) -                    return lldb_private::PythonString(llvm::StringRef(desc, desc_len)).release(); -                else -                    return lldb_private::PythonString("").release(); -        } -        %clearnothreadallow; -} - - -// %extend lldb::SBDebugger { -//         // FIXME: We can't get the callback and baton -//         PyObject *lldb::SBDebugger (){ -//             // Only call Py_XDECREF if we have a Python object (or NULL) -//             if (LLDBSwigPythonCallPythonLogOutputCallback == $self->GetLogOutPutCallback()) -//                 Py_XDECREF($self->GetCallbackBaton()); -//         } -// } - -%pythoncode %{ - -def command(command_name=None, doc=None): -    import lldb -    """A decorator function that registers an LLDB command line -        command that is bound to the function it is attached to.""" -    def callable(function): -        """Registers an lldb command for the decorated function.""" -        command = "command script add -f %s.%s %s" % (function.__module__, function.__name__, command_name or function.__name__) -        lldb.debugger.HandleCommand(command) -        if doc: -            function.__doc__ = doc -        return function - -    return callable - -class declaration(object): -    '''A class that represents a source declaration location with file, line and column.''' -    def __init__(self, file, line, col): -        self.file = file -        self.line = line -        self.col = col - -class value_iter(object): -    def __iter__(self): -        return self -     -    def next(self): -        if self.index >= self.length: -            raise StopIteration() -        child_sbvalue = self.sbvalue.GetChildAtIndex(self.index) -        self.index += 1 -        return value(child_sbvalue) -         -    def __init__(self,value): -        self.index = 0 -        self.sbvalue = value -        if type(self.sbvalue) is value: -            self.sbvalue = self.sbvalue.sbvalue -        self.length = self.sbvalue.GetNumChildren() - -class value(object): -    '''A class designed to wrap lldb.SBValue() objects so the resulting object -    can be used as a variable would be in code. So if you have a Point structure -    variable in your code in the current frame named "pt", you can initialize an instance -    of this class with it: -     -    pt = lldb.value(lldb.frame.FindVariable("pt")) -    print pt -    print pt.x -    print pt.y - -    pt = lldb.value(lldb.frame.FindVariable("rectangle_array")) -    print rectangle_array[12] -    print rectangle_array[5].origin.x''' -    def __init__(self, sbvalue): -        self.sbvalue = sbvalue - -    def __nonzero__(self): -        return self.sbvalue.__nonzero__() - -    def __str__(self): -        return self.sbvalue.__str__() - -    def __getitem__(self, key): -        # Allow array access if this value has children... -        if type(key) is value: -            key = int(key) -        if type(key) is int: -            child_sbvalue = (self.sbvalue.GetValueForExpressionPath("[%i]" % key)) -            if child_sbvalue and child_sbvalue.IsValid(): -                return value(child_sbvalue) -            raise IndexError("Index '%d' is out of range" % key) -        raise TypeError("No array item of type %s" % str(type(key))) - -    def __iter__(self): -        return value_iter(self.sbvalue) - -    def __getattr__(self, name): -        child_sbvalue = self.sbvalue.GetChildMemberWithName (name) -        if child_sbvalue and child_sbvalue.IsValid(): -            return value(child_sbvalue) -        raise AttributeError("Attribute '%s' is not defined" % name) - -    def __add__(self, other): -        return int(self) + int(other) -         -    def __sub__(self, other): -        return int(self) - int(other) -         -    def __mul__(self, other): -        return int(self) * int(other) -         -    def __floordiv__(self, other): -        return int(self) // int(other) -         -    def __mod__(self, other): -        return int(self) % int(other) -         -    def __divmod__(self, other): -        return int(self) % int(other) -         -    def __pow__(self, other): -        return int(self) ** int(other) -         -    def __lshift__(self, other): -        return int(self) << int(other) -         -    def __rshift__(self, other): -        return int(self) >> int(other) -         -    def __and__(self, other): -        return int(self) & int(other) -         -    def __xor__(self, other): -        return int(self) ^ int(other) -         -    def __or__(self, other): -        return int(self) | int(other) -         -    def __div__(self, other): -        return int(self) / int(other) -         -    def __truediv__(self, other): -        return int(self) / int(other) -         -    def __iadd__(self, other): -        result = self.__add__(other) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __isub__(self, other): -        result = self.__sub__(other) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __imul__(self, other): -        result = self.__mul__(other) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __idiv__(self, other): -        result = self.__div__(other) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __itruediv__(self, other): -        result = self.__truediv__(other) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __ifloordiv__(self, other): -        result =  self.__floordiv__(self, other) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __imod__(self, other): -        result =  self.__and__(self, other) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __ipow__(self, other): -        result = self.__pow__(self, other) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __ipow__(self, other, modulo): -        result = self.__pow__(self, other, modulo) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __ilshift__(self, other): -        result = self.__lshift__(other) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __irshift__(self, other): -        result =  self.__rshift__(other) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __iand__(self, other): -        result =  self.__and__(self, other) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __ixor__(self, other): -        result =  self.__xor__(self, other) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __ior__(self, other): -        result =  self.__ior__(self, other) -        self.sbvalue.SetValueFromCString (str(result)) -        return result -         -    def __neg__(self): -        return -int(self) -         -    def __pos__(self): -        return +int(self) -         -    def __abs__(self): -        return abs(int(self)) -         -    def __invert__(self): -        return ~int(self) -         -    def __complex__(self): -        return complex (int(self)) -         -    def __int__(self): -        is_num,is_sign = is_numeric_type(self.sbvalue.GetType().GetCanonicalType().GetBasicType()) -        if is_num and not is_sign: return self.sbvalue.GetValueAsUnsigned() -        return self.sbvalue.GetValueAsSigned() - -    def __long__(self): -        return self.__int__() - -    def __float__(self): -        return float (self.sbvalue.GetValueAsSigned()) -         -    def __oct__(self): -        return '0%o' % self.sbvalue.GetValueAsUnsigned() -         -    def __hex__(self): -        return '0x%x' % self.sbvalue.GetValueAsUnsigned() - -    def __len__(self): -        return self.sbvalue.GetNumChildren() - -    def __eq__(self, other): -        if type(other) is int: -                return int(self) == other -        elif type(other) is str: -                return str(self) == other -        elif type(other) is value: -                self_err = SBError() -                other_err = SBError() -                self_val = self.sbvalue.GetValueAsUnsigned(self_err) -                if self_err.fail: -                        raise ValueError("unable to extract value of self") -                other_val = other.sbvalue.GetValueAsUnsigned(other_err) -                if other_err.fail: -                        raise ValueError("unable to extract value of other") -                return self_val == other_val -        raise TypeError("Unknown type %s, No equality operation defined." % str(type(other))) - -    def __ne__(self, other): -        return not self.__eq__(other) -%} - -%pythoncode %{ - -class SBSyntheticValueProvider(object): -    def __init__(self,valobj): -        pass - -    def num_children(self): -        return 0 - -    def get_child_index(self,name): -        return None - -    def get_child_at_index(self,idx): -        return None - -    def update(self): -        pass - -    def has_children(self): -        return False - - -%} - -%pythoncode %{ - -# given an lldb.SBBasicType it returns a tuple -# (is_numeric, is_signed) -# the value of is_signed is undefined if is_numeric == false -def is_numeric_type(basic_type): -    if basic_type == eBasicTypeInvalid: return (False,False) -    if basic_type == eBasicTypeVoid: return (False,False) -    if basic_type == eBasicTypeChar: return (True,False) -    if basic_type == eBasicTypeSignedChar: return (True,True) -    if basic_type == eBasicTypeUnsignedChar: return (True,False) -    if basic_type == eBasicTypeWChar: return (True,False) -    if basic_type == eBasicTypeSignedWChar: return (True,True) -    if basic_type == eBasicTypeUnsignedWChar: return (True,False) -    if basic_type == eBasicTypeChar16: return (True,False) -    if basic_type == eBasicTypeChar32: return (True,False) -    if basic_type == eBasicTypeShort: return (True,True) -    if basic_type == eBasicTypeUnsignedShort: return (True,False) -    if basic_type == eBasicTypeInt: return (True,True) -    if basic_type == eBasicTypeUnsignedInt: return (True,False) -    if basic_type == eBasicTypeLong: return (True,True) -    if basic_type == eBasicTypeUnsignedLong: return (True,False) -    if basic_type == eBasicTypeLongLong: return (True,True) -    if basic_type == eBasicTypeUnsignedLongLong: return (True,False) -    if basic_type == eBasicTypeInt128: return (True,True) -    if basic_type == eBasicTypeUnsignedInt128: return (True,False) -    if basic_type == eBasicTypeBool: return (False,False) -    if basic_type == eBasicTypeHalf: return (True,True) -    if basic_type == eBasicTypeFloat: return (True,True) -    if basic_type == eBasicTypeDouble: return (True,True) -    if basic_type == eBasicTypeLongDouble: return (True,True) -    if basic_type == eBasicTypeFloatComplex: return (True,True) -    if basic_type == eBasicTypeDoubleComplex: return (True,True) -    if basic_type == eBasicTypeLongDoubleComplex: return (True,True) -    if basic_type == eBasicTypeObjCID: return (False,False) -    if basic_type == eBasicTypeObjCClass: return (False,False) -    if basic_type == eBasicTypeObjCSel: return (False,False) -    if basic_type == eBasicTypeNullPtr: return (False,False) -    #if basic_type == eBasicTypeOther: -    return (False,False) - -%} diff --git a/scripts/Python/python-swigsafecast.swig b/scripts/Python/python-swigsafecast.swig deleted file mode 100644 index d5cafbfa67cb..000000000000 --- a/scripts/Python/python-swigsafecast.swig +++ /dev/null @@ -1,154 +0,0 @@ -// leaving this undefined ensures we will get a linker error if we try to use SBTypeToSWIGWrapper() -// for a type for which we did not specialze this function -template <typename SBClass> -PyObject* -SBTypeToSWIGWrapper (SBClass* sb_object); - -template <typename SBClass> -PyObject* -SBTypeToSWIGWrapper (SBClass& sb_object) -{ -    return SBTypeToSWIGWrapper(&sb_object); -} - -template <typename SBClass> -PyObject* -SBTypeToSWIGWrapper (const SBClass& sb_object) -{ -    return SBTypeToSWIGWrapper(&sb_object); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (PyObject* py_object) -{ -    return py_object; -} - -template <> -PyObject* -SBTypeToSWIGWrapper (unsigned int* c_int) -{ -    if (!c_int) -        return NULL; -    return PyInt_FromLong(*c_int); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBEvent* event_sb) -{ -    return SWIG_NewPointerObj((void *) event_sb, SWIGTYPE_p_lldb__SBEvent, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBProcess* process_sb) -{ -    return SWIG_NewPointerObj((void *) process_sb, SWIGTYPE_p_lldb__SBProcess, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBThread* thread_sb) -{ -    return SWIG_NewPointerObj((void *) thread_sb, SWIGTYPE_p_lldb__SBThread, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBThreadPlan* thread_plan_sb) -{ -    return SWIG_NewPointerObj((void *) thread_plan_sb, SWIGTYPE_p_lldb__SBThreadPlan, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBTarget* target_sb) -{ -    return SWIG_NewPointerObj((void *) target_sb, SWIGTYPE_p_lldb__SBTarget, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBFrame* frame_sb) -{ -    return SWIG_NewPointerObj((void *) frame_sb, SWIGTYPE_p_lldb__SBFrame, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBDebugger* debugger_sb) -{ -    return SWIG_NewPointerObj((void *) debugger_sb, SWIGTYPE_p_lldb__SBDebugger, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBBreakpoint* breakpoint_sb) -{ -    return SWIG_NewPointerObj((void *) breakpoint_sb, SWIGTYPE_p_lldb__SBBreakpoint, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBWatchpoint* watchpoint_sb) -{ -    return SWIG_NewPointerObj((void *) watchpoint_sb, SWIGTYPE_p_lldb__SBWatchpoint, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBBreakpointLocation* breakpoint_location_sb) -{ -    return SWIG_NewPointerObj((void *) breakpoint_location_sb, SWIGTYPE_p_lldb__SBBreakpointLocation, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBBreakpointName* breakpoint_name_sb) -{ -    return SWIG_NewPointerObj((void *) breakpoint_name_sb, SWIGTYPE_p_lldb__SBBreakpointName, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBValue* value_sb) -{ -    return SWIG_NewPointerObj((void *) value_sb, SWIGTYPE_p_lldb__SBValue, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBCommandReturnObject* cmd_ret_obj_sb) -{ -    return SWIG_NewPointerObj((void *) cmd_ret_obj_sb, SWIGTYPE_p_lldb__SBCommandReturnObject, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBExecutionContext* ctx_sb) -{ -    return SWIG_NewPointerObj((void *) ctx_sb, SWIGTYPE_p_lldb__SBExecutionContext, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBTypeSummaryOptions* summary_options_sb) -{ -    return SWIG_NewPointerObj((void *) summary_options_sb, SWIGTYPE_p_lldb__SBTypeSummaryOptions, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBStructuredData* structured_data_sb) -{ -    return SWIG_NewPointerObj((void *) structured_data_sb, SWIGTYPE_p_lldb__SBStructuredData, 0); -} - -template <> -PyObject* -SBTypeToSWIGWrapper (lldb::SBSymbolContext* sym_ctx_sb) -{ -    return SWIG_NewPointerObj((void *) sym_ctx_sb, SWIGTYPE_p_lldb__SBSymbolContext, 0); -} diff --git a/scripts/Python/python-typemaps.swig b/scripts/Python/python-typemaps.swig deleted file mode 100644 index 56cab6c58163..000000000000 --- a/scripts/Python/python-typemaps.swig +++ /dev/null @@ -1,468 +0,0 @@ -/* Typemap definitions, to allow SWIG to properly handle 'char**' data types. */ - -%typemap(in) char ** { -  using namespace lldb_private; -  /* Check if is a list  */ -  if (PythonList::Check($input)) { -    PythonList list(PyRefType::Borrowed, $input); -    int size = list.GetSize(); -    int i = 0; -    $1 = (char**)malloc((size+1)*sizeof(char*)); -    for (i = 0; i < size; i++) { -      PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>(); -      if (!py_str.IsAllocated()) { -        PyErr_SetString(PyExc_TypeError,"list must contain strings"); -        free($1); -        return nullptr; -      } - -      $1[i] = const_cast<char*>(py_str.GetString().data()); -    } -    $1[i] = 0; -  } else if ($input == Py_None) { -    $1 =  NULL; -  } else { -    PyErr_SetString(PyExc_TypeError,"not a list"); -    return NULL; -  } -} - -%typemap(typecheck) char ** { -  /* Check if is a list  */ -  $1 = 1; -  using namespace lldb_private; -  if (PythonList::Check($input)) { -    PythonList list(PyRefType::Borrowed, $input); -    int size = list.GetSize(); -    int i = 0; -    for (i = 0; i < size; i++) { -      PythonString s = list.GetItemAtIndex(i).AsType<PythonString>(); -      if (!s.IsAllocated()) { $1 = 0; } -    } -  } -  else -  { -    $1 = ( ($input == Py_None) ? 1 : 0); -  } -} - -%typemap(freearg) char** { -  free((char *) $1); -} - -%typemap(out) char** { -  int len; -  int i; -  len = 0; -  while ($1[len]) len++; -  using namespace lldb_private; -  PythonList list(len); -  for (i = 0; i < len; i++) -    list.SetItemAtIndex(i, PythonString($1[i])); -  $result = list.release(); -} - - -%typemap(in) lldb::tid_t { -  using namespace lldb_private; -  if (PythonInteger::Check($input)) -  { -    PythonInteger py_int(PyRefType::Borrowed, $input); -    $1 = static_cast<lldb::tid_t>(py_int.GetInteger()); -  } -  else -  { -    PyErr_SetString(PyExc_ValueError, "Expecting an integer"); -    return nullptr; -  } -} - -%typemap(in) lldb::StateType { -  using namespace lldb_private; -  if (PythonInteger::Check($input)) -  { -    PythonInteger py_int(PyRefType::Borrowed, $input); -    int64_t state_type_value = py_int.GetInteger() ; - -    if (state_type_value > lldb::StateType::kLastStateType) { -      PyErr_SetString(PyExc_ValueError, "Not a valid StateType value"); -      return nullptr; -    } -    $1 = static_cast<lldb::StateType>(state_type_value); -  } -  else -  { -    PyErr_SetString(PyExc_ValueError, "Expecting an integer"); -    return nullptr; -  } -} - -/* Typemap definitions to allow SWIG to properly handle char buffer. */ - -// typemap for a char buffer -// See also SBThread::GetStopDescription. -%typemap(in) (char *dst, size_t dst_len) { -   if (!PyInt_Check($input)) { -       PyErr_SetString(PyExc_ValueError, "Expecting an integer"); -       return NULL; -   } -   $2 = PyInt_AsLong($input); -   if ($2 <= 0) { -       PyErr_SetString(PyExc_ValueError, "Positive integer expected"); -       return NULL; -   } -   $1 = (char *) malloc($2); -} -// SBProcess::ReadCStringFromMemory() uses a void*, but needs to be treated -// as char data instead of byte data. -%typemap(in) (void *char_buf, size_t size) = (char *dst, size_t dst_len); - -// Return the char buffer.  Discarding any previous return result -// See also SBThread::GetStopDescription. -%typemap(argout) (char *dst, size_t dst_len) { -   Py_XDECREF($result);   /* Blow away any previous result */ -   if (result == 0) { -      lldb_private::PythonString string(""); -      $result = string.release(); -      Py_INCREF($result); -   } else { -      llvm::StringRef ref(static_cast<const char*>($1), result); -      lldb_private::PythonString string(ref); -      $result = string.release(); -   } -   free($1); -} -// SBProcess::ReadCStringFromMemory() uses a void*, but needs to be treated -// as char data instead of byte data. -%typemap(argout) (void *char_buf, size_t size) = (char *dst, size_t dst_len); - - -// typemap for an outgoing buffer -// See also SBEvent::SBEvent(uint32_t event, const char *cstr, uint32_t cstr_len). -// Ditto for SBProcess::PutSTDIN(const char *src, size_t src_len). -%typemap(in) (const char *cstr, uint32_t cstr_len), -             (const char *src, size_t src_len) { -   using namespace lldb_private; -   if (PythonString::Check($input)) { -      PythonString str(PyRefType::Borrowed, $input); -      $1 = (char*)str.GetString().data(); -      $2 = str.GetSize(); -   } -   else if(PythonByteArray::Check($input)) { -      PythonByteArray bytearray(PyRefType::Borrowed, $input); -      $1 = (char*)bytearray.GetBytes().data(); -      $2 = bytearray.GetSize(); -   } -   else if (PythonBytes::Check($input)) { -      PythonBytes bytes(PyRefType::Borrowed, $input); -      $1 = (char*)bytes.GetBytes().data(); -      $2 = bytes.GetSize(); -   } -   else { -      PyErr_SetString(PyExc_ValueError, "Expecting a string"); -      return NULL; -   } -} -// For SBProcess::WriteMemory, SBTarget::GetInstructions and SBDebugger::DispatchInput. -%typemap(in) (const void *buf, size_t size), -             (const void *data, size_t data_len) { -   using namespace lldb_private; -   if (PythonString::Check($input)) { -      PythonString str(PyRefType::Borrowed, $input); -      $1 = (void*)str.GetString().data(); -      $2 = str.GetSize(); -   } -   else if(PythonByteArray::Check($input)) { -      PythonByteArray bytearray(PyRefType::Borrowed, $input); -      $1 = (void*)bytearray.GetBytes().data(); -      $2 = bytearray.GetSize(); -   } -   else if (PythonBytes::Check($input)) { -      PythonBytes bytes(PyRefType::Borrowed, $input); -      $1 = (void*)bytes.GetBytes().data(); -      $2 = bytes.GetSize(); -   } -   else { -      PyErr_SetString(PyExc_ValueError, "Expecting a buffer"); -      return NULL; -   } -} - -// typemap for an incoming buffer -// See also SBProcess::ReadMemory. -%typemap(in) (void *buf, size_t size) { -   if (PyInt_Check($input)) { -      $2 = PyInt_AsLong($input); -   } else if (PyLong_Check($input)) { -      $2 = PyLong_AsLong($input); -   } else { -      PyErr_SetString(PyExc_ValueError, "Expecting an integer or long object"); -      return NULL; -   } -   if ($2 <= 0) { -       PyErr_SetString(PyExc_ValueError, "Positive integer expected"); -       return NULL; -   } -   $1 = (void *) malloc($2); -} - -// Return the buffer.  Discarding any previous return result -// See also SBProcess::ReadMemory. -%typemap(argout) (void *buf, size_t size) { -   Py_XDECREF($result);   /* Blow away any previous result */ -   if (result == 0) { -      $result = Py_None; -      Py_INCREF($result); -   } else { -      lldb_private::PythonBytes bytes(static_cast<const uint8_t*>($1), result); -      $result = bytes.release(); -   } -   free($1); -} - -%{ -namespace { -template <class T> -T PyLongAsT(PyObject *obj) { -  static_assert(true, "unsupported type");  -} - -template <> uint64_t PyLongAsT<uint64_t>(PyObject *obj) { -  return static_cast<uint64_t>(PyLong_AsUnsignedLongLong(obj)); -} - -template <> uint32_t PyLongAsT<uint32_t>(PyObject *obj) { -  return static_cast<uint32_t>(PyLong_AsUnsignedLong(obj)); -} - -template <> int64_t PyLongAsT<int64_t>(PyObject *obj) { -  return static_cast<int64_t>(PyLong_AsLongLong(obj)); -} - -template <> int32_t PyLongAsT<int32_t>(PyObject *obj) { -  return static_cast<int32_t>(PyLong_AsLong(obj)); -} - -template <class T> -bool SetNumberFromPyObject(T &number, PyObject *obj) { -  if (PyInt_Check(obj)) -    number = static_cast<T>(PyInt_AsLong(obj)); -  else if (PyLong_Check(obj)) -    number = PyLongAsT<T>(obj); -  else return false; - -  return true; -} - -template <> -bool SetNumberFromPyObject<double>(double &number, PyObject *obj) { -  if (PyFloat_Check(obj)) { -    number = PyFloat_AsDouble(obj); -    return true; -  } - -  return false; -} - -} // namespace -%} - -// these typemaps allow Python users to pass list objects -// and have them turn into C++ arrays (this is useful, for instance -// when creating SBData objects from lists of numbers) -%typemap(in) (uint64_t* array, size_t array_len), -             (uint32_t* array, size_t array_len), -             (int64_t* array, size_t array_len), -             (int32_t* array, size_t array_len), -             (double* array, size_t array_len) { -  /* Check if is a list  */ -  if (PyList_Check($input)) { -    int size = PyList_Size($input); -    int i = 0; -    $2 = size; -    $1 = ($1_type) malloc(size * sizeof($*1_type)); -    for (i = 0; i < size; i++) { -      PyObject *o = PyList_GetItem($input,i); -      if (!SetNumberFromPyObject($1[i], o)) { -        PyErr_SetString(PyExc_TypeError,"list must contain numbers"); -        free($1); -        return NULL; -      } - -      if (PyErr_Occurred()) { -        free($1); -        return NULL; -      } -    } -  } else if ($input == Py_None) { -    $1 =  NULL; -    $2 = 0; -  } else { -    PyErr_SetString(PyExc_TypeError,"not a list"); -    return NULL; -  } -} - -%typemap(freearg) (uint64_t* array, size_t array_len), -                  (uint32_t* array, size_t array_len), -                  (int64_t* array, size_t array_len), -                  (int32_t* array, size_t array_len), -                  (double* array, size_t array_len) { -  free($1); -} - -// these typemaps wrap SBModule::GetVersion() from requiring a memory buffer -// to the more Pythonic style where a list is returned and no previous allocation -// is necessary - this will break if more than 50 versions are ever returned -%typemap(typecheck) (uint32_t *versions, uint32_t num_versions) { -    $1 = ($input == Py_None ? 1 : 0); -} - -%typemap(in, numinputs=0) (uint32_t *versions) { -    $1 = (uint32_t*)malloc(sizeof(uint32_t) * 50); -} - -%typemap(in, numinputs=0) (uint32_t num_versions) { -    $1 = 50; -} - -%typemap(argout) (uint32_t *versions, uint32_t num_versions) { -    uint32_t count = result; -    if (count >= $2) -        count = $2; -    PyObject* list = PyList_New(count); -    for (uint32_t j = 0; j < count; j++) -    { -        if ($1[j] < UINT32_MAX) -        { -            PyObject* item = PyInt_FromLong($1[j]); -            int ok = PyList_SetItem(list,j,item); -            if (ok != 0) -            { -                $result = Py_None; -                break; -            } -        } -        else -            break; -    } -    $result = list; -} - -%typemap(freearg) (uint32_t *versions) { -    free($1); -} - - -// For Log::LogOutputCallback -%typemap(in) (lldb::LogOutputCallback log_callback, void *baton) { -  if (!($input == Py_None || PyCallable_Check(reinterpret_cast<PyObject*>($input)))) { -    PyErr_SetString(PyExc_TypeError, "Need a callable object or None!"); -    return NULL; -  } - -  // FIXME (filcab): We can't currently check if our callback is already -  // LLDBSwigPythonCallPythonLogOutputCallback (to DECREF the previous -  // baton) nor can we just remove all traces of a callback, if we want to -  // revert to a file logging mechanism. - -  // Don't lose the callback reference -  Py_INCREF($input); -  $1 = LLDBSwigPythonCallPythonLogOutputCallback; -  $2 = $input; -} - -%typemap(typecheck) (lldb::LogOutputCallback log_callback, void *baton) { -  $1 = $input == Py_None; -  $1 = $1 || PyCallable_Check(reinterpret_cast<PyObject*>($input)); -} - -%typemap(in) FILE * { -   using namespace lldb_private; -   if ($input == Py_None) -      $1 = nullptr; -   else if (!lldb_private::PythonFile::Check($input)) { -      int fd = PyObject_AsFileDescriptor($input); -      PythonObject py_input(PyRefType::Borrowed, $input); -      PythonString py_mode = py_input.GetAttributeValue("mode").AsType<PythonString>(); - -      if (-1 != fd && py_mode.IsValid()) { -         FILE *f; -         if ((f = fdopen(fd, py_mode.GetString().str().c_str()))) -            $1 = f; -         else -            PyErr_SetString(PyExc_TypeError, strerror(errno)); -      } else { -         PyErr_SetString(PyExc_TypeError,"not a file-like object"); -         return nullptr; -      } -   } -   else -   { -      PythonFile py_file(PyRefType::Borrowed, $input); -      File file; -      if (!py_file.GetUnderlyingFile(file)) -         return nullptr; - -      $1 = file.GetStream(); -      if ($1) -         file.Clear(); -    } -} - -%typemap(out) FILE * { -   char mode[4] = {0}; -%#ifdef __APPLE__ -   int i = 0; -   if ($1) -   { -       short flags = $1->_flags; - -       if (flags & __SRD) -          mode[i++] = 'r'; -       else if (flags & __SWR) -          mode[i++] = 'w'; -       else // if (flags & __SRW) -          mode[i++] = 'a'; -    } -%#endif -   using namespace lldb_private; -   File file($1, false); -   PythonFile py_file(file, mode); -   $result = py_file.release(); -   if (!$result) -   { -       $result = Py_None; -       Py_INCREF(Py_None); -   } -} - -%typemap(in) (const char* string, int len) { -    using namespace lldb_private; -    if ($input == Py_None) -    { -        $1 = NULL; -        $2 = 0; -    } -    else if (PythonString::Check($input)) -    { -        PythonString py_str(PyRefType::Borrowed, $input); -        llvm::StringRef str = py_str.GetString(); -        $1 = const_cast<char*>(str.data()); -        $2 = str.size(); -        // In Python 2, if $input is a PyUnicode object then this -        // will trigger a Unicode -> String conversion, in which -        // case the `PythonString` will now own the PyString.  Thus -        // if it goes out of scope, the data will be deleted.  The -        // only way to avoid this is to leak the Python object in -        // that case.  Note that if there was no conversion, then -        // releasing the string will not leak anything, since we -        // created this as a borrowed reference. -        py_str.release(); -    } -    else -    { -        PyErr_SetString(PyExc_TypeError,"not a string-like object"); -        return NULL; -    } -} diff --git a/scripts/Python/python-wrapper.swig b/scripts/Python/python-wrapper.swig deleted file mode 100644 index 8509899df27b..000000000000 --- a/scripts/Python/python-wrapper.swig +++ /dev/null @@ -1,1080 +0,0 @@ -%header %{ - -template <typename T> -PyObject * -SBTypeToSWIGWrapper (T* item); - -class PyErr_Cleaner -{ -public: -    PyErr_Cleaner(bool print=false) : -    m_print(print) -    { -    } - -    ~PyErr_Cleaner() -    { -        if (PyErr_Occurred()) -        { -            if(m_print && !PyErr_ExceptionMatches(PyExc_SystemExit)) -                PyErr_Print(); -            PyErr_Clear(); -        } -    } - -private: -    bool m_print; -}; - -%} - -%wrapper %{ - -// resolve a dotted Python name in the form -// foo.bar.baz.Foobar to an actual Python object -// if pmodule is NULL, the __main__ module will be used -// as the starting point for the search - - -// This function is called by lldb_private::ScriptInterpreterPython::BreakpointCallbackFunction(...) -// and is used when a script command is attached to a breakpoint for execution. - -SWIGEXPORT bool -LLDBSwigPythonBreakpointCallbackFunction -( -    const char *python_function_name, -    const char *session_dictionary_name, -    const lldb::StackFrameSP& frame_sp, -    const lldb::BreakpointLocationSP& bp_loc_sp -) -{ -    using namespace lldb_private; -    lldb::SBFrame sb_frame (frame_sp); -    lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp); - -    bool stop_at_breakpoint = true; - -    PyErr_Cleaner py_err_cleaner(true); -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); - -    if (!pfunc.IsAllocated()) -        return stop_at_breakpoint; - -    PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame)); -    PythonObject bp_loc_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_bp_loc)); -    PythonObject result = pfunc(frame_arg, bp_loc_arg, dict); - -    if (result.get() == Py_False) -        stop_at_breakpoint = false; - -    return stop_at_breakpoint; -} - -// This function is called by lldb_private::ScriptInterpreterPython::WatchpointCallbackFunction(...) -// and is used when a script command is attached to a watchpoint for execution. - -SWIGEXPORT bool -LLDBSwigPythonWatchpointCallbackFunction -( -    const char *python_function_name, -    const char *session_dictionary_name, -    const lldb::StackFrameSP& frame_sp, -    const lldb::WatchpointSP& wp_sp -) -{ -    using namespace lldb_private; -    lldb::SBFrame sb_frame (frame_sp); -    lldb::SBWatchpoint sb_wp(wp_sp); - -    bool stop_at_watchpoint = true; - -    PyErr_Cleaner py_err_cleaner(true); - -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); - -    if (!pfunc.IsAllocated()) -        return stop_at_watchpoint; - -    PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame)); -    PythonObject wp_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_wp)); -    PythonObject result = pfunc(frame_arg, wp_arg, dict); - -    if (result.get() == Py_False) -        stop_at_watchpoint = false; - -    return stop_at_watchpoint; -} - -SWIGEXPORT bool -LLDBSwigPythonCallTypeScript -( -    const char *python_function_name, -    const void *session_dictionary, -    const lldb::ValueObjectSP& valobj_sp, -    void** pyfunct_wrapper, -    const lldb::TypeSummaryOptionsSP& options_sp, -    std::string& retval -) -{ -    using namespace lldb_private; -    lldb::SBValue sb_value (valobj_sp); -    lldb::SBTypeSummaryOptions sb_options(options_sp.get()); - -    retval.clear(); - -    if (!python_function_name || !session_dictionary) -        return false; - -    PyObject *pfunc_impl = nullptr; - -    if (pyfunct_wrapper && *pyfunct_wrapper && PyFunction_Check (*pyfunct_wrapper)) -    { -        pfunc_impl = (PyObject*)(*pyfunct_wrapper); -        if (pfunc_impl->ob_refcnt == 1) -        { -            Py_XDECREF(pfunc_impl); -            pfunc_impl = NULL; -        } -    } - -    PyObject *py_dict = (PyObject*)session_dictionary; -    if (!PythonDictionary::Check(py_dict)) -        return true; - -    PythonDictionary dict(PyRefType::Borrowed, py_dict); - -    PyErr_Cleaner pyerr_cleanup(true);  // show Python errors - -    PythonCallable pfunc(PyRefType::Borrowed, pfunc_impl); - -    if (!pfunc.IsAllocated()) -    { -        pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); -        if (!pfunc.IsAllocated()) -            return false; - -        if (pyfunct_wrapper) -        { -            *pyfunct_wrapper = pfunc.get(); -            Py_XINCREF(pfunc.get()); -        } -    } - -    PythonObject result; -    auto argc = pfunc.GetNumArguments(); -    // if the third argument is supported, or varargs are allowed -    PythonObject value_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_value)); -    PythonObject options_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_options)); -    if (argc.count == 3 || argc.has_varargs) -        result = pfunc(value_arg,dict,options_arg); -    else -        result = pfunc(value_arg,dict); - -    retval = result.Str().GetString().str(); - -    return true; -} - -SWIGEXPORT void* -LLDBSwigPythonCreateSyntheticProvider -( -    const char *python_class_name, -    const char *session_dictionary_name, -    const lldb::ValueObjectSP& valobj_sp -) -{ -    using namespace lldb_private; - -    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) -        Py_RETURN_NONE; - -    PyErr_Cleaner py_err_cleaner(true); - -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name,dict); - -    if (!pfunc.IsAllocated()) -        Py_RETURN_NONE; - -    // I do not want the SBValue to be deallocated when going out of scope because python -    // has ownership of it and will manage memory for this object by itself -    lldb::SBValue *sb_value = new lldb::SBValue(valobj_sp); -    sb_value->SetPreferSyntheticValue(false); - -    PythonObject val_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_value)); -    if (!val_arg.IsAllocated()) -        Py_RETURN_NONE; - -    PythonObject result = pfunc(val_arg, dict); - -    if (result.IsAllocated()) -        return result.release(); - -    Py_RETURN_NONE; -} - -SWIGEXPORT void* -LLDBSwigPythonCreateCommandObject -( -    const char *python_class_name, -    const char *session_dictionary_name, -    const lldb::DebuggerSP debugger_sp -) -{ -    using namespace lldb_private; - -    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) -        Py_RETURN_NONE; - -    PyErr_Cleaner py_err_cleaner(true); -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); - -    if (!pfunc.IsAllocated()) -        return nullptr; - -    lldb::SBDebugger debugger_sb(debugger_sp); -    PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); -    PythonObject result = pfunc(debugger_arg, dict); - -    if (result.IsAllocated()) -        return result.release(); - -    Py_RETURN_NONE; -} - -SWIGEXPORT void* -LLDBSwigPythonCreateScriptedThreadPlan -( -    const char *python_class_name, -    const char *session_dictionary_name, -    const lldb::ThreadPlanSP& thread_plan_sp -) -{ -    using namespace lldb_private; - -    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) -        Py_RETURN_NONE; - -    // I do not want the SBThreadPlan to be deallocated when going out of scope because python -    // has ownership of it and will manage memory for this object by itself -    lldb::SBThreadPlan *tp_value = new lldb::SBThreadPlan(thread_plan_sp); - -    PyErr_Cleaner py_err_cleaner(true); - -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); - -    if (!pfunc.IsAllocated()) -        return nullptr; - -    PythonObject tp_arg(PyRefType::Owned, SBTypeToSWIGWrapper(tp_value)); - -    if (!tp_arg.IsAllocated()) -        Py_RETURN_NONE; - -    PythonObject result = pfunc(tp_arg, dict); -    // FIXME: At this point we should check that the class we found supports all the methods -    // that we need. - -    if (result.IsAllocated()) -        return result.release(); -    Py_RETURN_NONE; -} - -SWIGEXPORT bool -LLDBSWIGPythonCallThreadPlan -( -    void *implementor, -    const char *method_name, -    lldb_private::Event *event, -    bool &got_error -) -{ -    using namespace lldb_private; - -    got_error = false; - -    PyErr_Cleaner py_err_cleaner(false); -    PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); -    auto pfunc = self.ResolveName<PythonCallable>(method_name); - -    if (!pfunc.IsAllocated()) -        return false; - -    PythonObject result; -    if (event != nullptr) -    { -        lldb::SBEvent sb_event(event); -        PythonObject event_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_event)); -        result = pfunc(event_arg); -    } -    else -        result = pfunc(); - -    if (PyErr_Occurred()) -    { -        got_error = true; -        printf ("Return value was neither false nor true for call to %s.\n", method_name); -        PyErr_Print(); -        return false; -    } - -    if (result.get() == Py_True) -        return true; -    else if (result.get() == Py_False) -        return false; - -    // Somebody returned the wrong thing... -    got_error = true; -    printf ("Wrong return value type for call to %s.\n", method_name); -    return false; -} - -SWIGEXPORT void * -LLDBSwigPythonCreateScriptedBreakpointResolver -( -    const char *python_class_name, -    const char *session_dictionary_name, -    lldb_private::StructuredDataImpl *args_impl, -    lldb::BreakpointSP &breakpoint_sp -) -{ -    using namespace lldb_private; - -    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) -        Py_RETURN_NONE; - -    PyErr_Cleaner py_err_cleaner(true); - -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); - -    if (!pfunc.IsAllocated()) -        return nullptr; - -    lldb::SBBreakpoint *bkpt_value = new lldb::SBBreakpoint(breakpoint_sp); - -    PythonObject bkpt_arg(PyRefType::Owned, SBTypeToSWIGWrapper(bkpt_value)); - -    lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl); -    PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(args_value)); - -    PythonObject result = pfunc(bkpt_arg, args_arg, dict); -    // FIXME: At this point we should check that the class we found supports all the methods -    // that we need. - -    if (result.IsAllocated()) -    { -        // Check that __callback__ is defined: -        auto callback_func = result.ResolveName<PythonCallable>("__callback__"); -        if (callback_func.IsAllocated()) -            return result.release(); -        else -            result.release(); -    } -    Py_RETURN_NONE; -} - -SWIGEXPORT unsigned int -LLDBSwigPythonCallBreakpointResolver -( -    void *implementor, -    const char *method_name, -    lldb_private::SymbolContext *sym_ctx -) -{ -    using namespace lldb_private; - -    PyErr_Cleaner py_err_cleaner(false); -    PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); -    auto pfunc = self.ResolveName<PythonCallable>(method_name); - -    if (!pfunc.IsAllocated()) -        return 0; - -    PythonObject result; -    if (sym_ctx != nullptr) { -      lldb::SBSymbolContext sb_sym_ctx(sym_ctx); -      PythonObject sym_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_sym_ctx)); -      result = pfunc(sym_ctx_arg); -    } else -      result = pfunc(); - -    if (PyErr_Occurred()) -    { -        PyErr_Print(); -        return 0; -    } - -    // The callback will return a bool, but we're need to also return ints -    // so we're squirrelling the bool through as an int...  And if you return -    // nothing, we'll continue. -    if (strcmp(method_name, "__callback__") == 0) { -        if (result.get() == Py_False) -          return 0; -        else -          return 1; -    } - -    PythonInteger int_result = result.AsType<PythonInteger>(); -    if (!int_result.IsAllocated()) -        return 0; - -    unsigned int ret_val = int_result.GetInteger(); - -    return ret_val; -} - -// wrapper that calls an optional instance member of an object taking no arguments -static PyObject* -LLDBSwigPython_CallOptionalMember -( -    PyObject* implementor, -    char* callee_name, -    PyObject* ret_if_not_found = Py_None, -    bool* was_found = NULL -) -{ -    using namespace lldb_private; - -    PyErr_Cleaner py_err_cleaner(false); - -    PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor)); -    auto pfunc = self.ResolveName<PythonCallable>(callee_name); - -    if (!pfunc.IsAllocated()) -    { -        if (was_found) -            *was_found = false; -        Py_XINCREF(ret_if_not_found); -        return ret_if_not_found; -    } - -    if (was_found) -        *was_found = true; - -    PythonObject result = pfunc(); -    return result.release(); -} - -SWIGEXPORT size_t -LLDBSwigPython_CalculateNumChildren -( -    PyObject *implementor, -    uint32_t max -) -{ -    using namespace lldb_private; - -    PythonObject self(PyRefType::Borrowed, implementor); -    auto pfunc = self.ResolveName<PythonCallable>("num_children"); - -    if (!pfunc.IsAllocated()) -        return 0; - -    PythonObject result; -    auto argc = pfunc.GetNumArguments(); -    if (argc.count == 1) -        result = pfunc(); -    else if (argc.count == 2) -        result = pfunc(PythonInteger(max)); - -    if (!result.IsAllocated()) -        return 0; - -    PythonInteger int_result = result.AsType<PythonInteger>(); -    if (!int_result.IsAllocated()) -        return 0; - -    size_t ret_val = int_result.GetInteger(); - -    if (PyErr_Occurred()) -    { -        PyErr_Print(); -        PyErr_Clear(); -    } - -    if (argc.count == 1) -        ret_val = std::min(ret_val, static_cast<size_t>(max)); - -    return ret_val; -} - -SWIGEXPORT PyObject* -LLDBSwigPython_GetChildAtIndex -( -    PyObject *implementor, -    uint32_t idx -) -{ -    using namespace lldb_private; -    PyErr_Cleaner py_err_cleaner(true); - -    PythonObject self(PyRefType::Borrowed, implementor); -    auto pfunc = self.ResolveName<PythonCallable>("get_child_at_index"); - -    if (!pfunc.IsAllocated()) -        return nullptr; - -    PythonObject result = pfunc(PythonInteger(idx)); - -    if (!result.IsAllocated()) -        return nullptr; - -    lldb::SBValue* sbvalue_ptr = nullptr; -    if (SWIG_ConvertPtr(result.get(), (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1) -        return nullptr; - -    if (sbvalue_ptr == nullptr) -        return nullptr; - -    return result.release(); -} - -SWIGEXPORT int -LLDBSwigPython_GetIndexOfChildWithName -( -    PyObject *implementor, -    const char* child_name -) -{ -    using namespace lldb_private; -    PyErr_Cleaner py_err_cleaner(true); - -    PythonObject self(PyRefType::Borrowed, implementor); -    auto pfunc = self.ResolveName<PythonCallable>("get_child_index"); - -    if (!pfunc.IsAllocated()) -        return UINT32_MAX; - -    PythonObject result = pfunc(PythonString(child_name)); - -    if (!result.IsAllocated()) -        return UINT32_MAX; - -    PythonInteger int_result = result.AsType<PythonInteger>(); -    if (!int_result.IsAllocated()) -        return UINT32_MAX; - -    int64_t retval = int_result.GetInteger(); -    if (retval >= 0) -        return (uint32_t)retval; - -    return UINT32_MAX; -} - -SWIGEXPORT bool -LLDBSwigPython_UpdateSynthProviderInstance -( -    PyObject *implementor -) -{ -    bool ret_val = false; - -    static char callee_name[] = "update"; - -    PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name); - -    if (py_return == Py_True) -        ret_val = true; - -    Py_XDECREF(py_return); - -    return ret_val; -} - -SWIGEXPORT bool -LLDBSwigPython_MightHaveChildrenSynthProviderInstance -( -    PyObject *implementor -) -{ -    bool ret_val = false; - -    static char callee_name[] = "has_children"; - -    PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_True); - -    if (py_return == Py_True) -        ret_val = true; - -    Py_XDECREF(py_return); - -    return ret_val; -} - -SWIGEXPORT PyObject* -LLDBSwigPython_GetValueSynthProviderInstance -( -    PyObject *implementor -) -{ -    PyObject* ret_val = nullptr; - -    static char callee_name[] = "get_value"; - -    PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_None); - -    if (py_return == Py_None || py_return == nullptr) -        ret_val = nullptr; - -    lldb::SBValue* sbvalue_ptr = NULL; - -    if (SWIG_ConvertPtr(py_return, (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1) -        ret_val = nullptr; -    else if (sbvalue_ptr == NULL) -        ret_val = nullptr; -    else -        ret_val = py_return; - -    Py_XDECREF(py_return); -    return ret_val; -} - -SWIGEXPORT void* -LLDBSWIGPython_CastPyObjectToSBValue -( -    PyObject* data -) -{ -    lldb::SBValue* sb_ptr = NULL; - -    int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBValue, 0); - -    if (valid_cast == -1) -        return NULL; - -    return sb_ptr; -} - -// Currently, SBCommandReturnObjectReleaser wraps a unique pointer to an -// lldb_private::CommandReturnObject. This means that the destructor for the -// SB object will deallocate its contained CommandReturnObject. Because that -// object is used as the real return object for Python-based commands, we want -// it to stay around. Thus, we release the unique pointer before returning from -// LLDBSwigPythonCallCommand, and to guarantee that the release will occur no -// matter how we exit from the function, we have a releaser object whose -// destructor does the right thing for us -class SBCommandReturnObjectReleaser -{ -public: -    SBCommandReturnObjectReleaser (lldb::SBCommandReturnObject &obj) : -        m_command_return_object_ref (obj) -    { -    } - -    ~SBCommandReturnObjectReleaser () -    { -        m_command_return_object_ref.Release(); -    } -private: -    lldb::SBCommandReturnObject &m_command_return_object_ref; -}; - -SWIGEXPORT bool -LLDBSwigPythonCallCommand -( -    const char *python_function_name, -    const char *session_dictionary_name, -    lldb::DebuggerSP& debugger, -    const char* args, -    lldb_private::CommandReturnObject& cmd_retobj, -    lldb::ExecutionContextRefSP exe_ctx_ref_sp -) -{ -    using namespace lldb_private; -    lldb::SBCommandReturnObject cmd_retobj_sb(&cmd_retobj); -    SBCommandReturnObjectReleaser cmd_retobj_sb_releaser(cmd_retobj_sb); -    lldb::SBDebugger debugger_sb(debugger); -    lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp); - -    PyErr_Cleaner py_err_cleaner(true); -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); - -    if (!pfunc.IsAllocated()) -        return false; - -    // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you -    // see comment above for SBCommandReturnObjectReleaser for further details -    auto argc = pfunc.GetNumArguments(); -    PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); -    PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb)); -    PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(&cmd_retobj_sb)); - -    if (argc.count == 5 || argc.is_bound_method || argc.has_varargs) -        pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg, dict); -    else -        pfunc(debugger_arg, PythonString(args), cmd_retobj_arg, dict); - -    return true; -} - -SWIGEXPORT bool -LLDBSwigPythonCallCommandObject -( -    PyObject *implementor, -    lldb::DebuggerSP& debugger, -    const char* args, -    lldb_private::CommandReturnObject& cmd_retobj, -    lldb::ExecutionContextRefSP exe_ctx_ref_sp -) -{ -    using namespace lldb_private; -    lldb::SBCommandReturnObject cmd_retobj_sb(&cmd_retobj); -    SBCommandReturnObjectReleaser cmd_retobj_sb_releaser(cmd_retobj_sb); -    lldb::SBDebugger debugger_sb(debugger); -    lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp); - -    PyErr_Cleaner py_err_cleaner(true); - -    PythonObject self(PyRefType::Borrowed, implementor); -    auto pfunc = self.ResolveName<PythonCallable>("__call__"); - -    if (!pfunc.IsAllocated()) -        return false; - -    // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you -    // see comment above for SBCommandReturnObjectReleaser for further details -    PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); -    PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb)); -    PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(&cmd_retobj_sb)); - -    pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg); - -    return true; -} - -SWIGEXPORT void* -LLDBSWIGPythonCreateOSPlugin -( -    const char *python_class_name, -    const char *session_dictionary_name, -    const lldb::ProcessSP& process_sp -) -{ -    using namespace lldb_private; - -    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) -        Py_RETURN_NONE; - -    PyErr_Cleaner py_err_cleaner(true); - -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); - -    if (!pfunc.IsAllocated()) -        Py_RETURN_NONE; - -    // I do not want the SBProcess to be deallocated when going out of scope because python -    // has ownership of it and will manage memory for this object by itself -    lldb::SBProcess *process_sb = new lldb::SBProcess(process_sp); -    PythonObject process_arg(PyRefType::Owned, SBTypeToSWIGWrapper(process_sb)); -    if (!process_arg.IsAllocated()) -        Py_RETURN_NONE; - -    auto result = pfunc(process_arg); - -    if (result.IsAllocated()) -        return result.release(); - -    Py_RETURN_NONE; -} - -SWIGEXPORT void* -LLDBSWIGPython_CreateFrameRecognizer -( -    const char *python_class_name, -    const char *session_dictionary_name -) -{ -    using namespace lldb_private; - -    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name) -        Py_RETURN_NONE; - -    PyErr_Cleaner py_err_cleaner(true); - -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict); - -    if (!pfunc.IsAllocated()) -        Py_RETURN_NONE; - -    auto result = pfunc(); - -    if (result.IsAllocated()) -        return result.release(); - -    Py_RETURN_NONE; -} - -SWIGEXPORT PyObject* -LLDBSwigPython_GetRecognizedArguments -( -    PyObject *implementor, -    const lldb::StackFrameSP& frame_sp -) -{ -    using namespace lldb_private; - -    static char callee_name[] = "get_recognized_arguments"; - -    lldb::SBFrame frame_sb(frame_sp); -    PyObject *arg = SBTypeToSWIGWrapper(frame_sb); - -    PythonString str(callee_name); -    PyObject* result = PyObject_CallMethodObjArgs(implementor, str.get(), arg, -                                                  NULL); -    return result; -} - -SWIGEXPORT void* -LLDBSWIGPython_GetDynamicSetting (void* module, const char* setting, const lldb::TargetSP& target_sp) -{ -    using namespace lldb_private; - -    if (!module || !setting) -        Py_RETURN_NONE; - -    PyErr_Cleaner py_err_cleaner(true); -    PythonObject py_module(PyRefType::Borrowed, (PyObject *)module); -    auto pfunc = py_module.ResolveName<PythonCallable>("get_dynamic_setting"); - -    if (!pfunc.IsAllocated()) -        Py_RETURN_NONE; - -    lldb::SBTarget target_sb(target_sp); -    PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_sb)); -    auto result = pfunc(target_arg, PythonString(setting)); - -    return result.release(); -} - -SWIGEXPORT bool -LLDBSWIGPythonRunScriptKeywordProcess -(const char* python_function_name, -const char* session_dictionary_name, -lldb::ProcessSP& process, -std::string& output) - -{ -    using namespace lldb_private; - -    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) -        return false; - -    PyErr_Cleaner py_err_cleaner(true); - -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); - -    if (!pfunc.IsAllocated()) -        return false; - -    lldb::SBProcess process_sb(process); -    PythonObject process_arg(PyRefType::Owned, SBTypeToSWIGWrapper(process_sb)); -    auto result = pfunc(process_arg, dict); - -    output = result.Str().GetString().str(); - -    return true; -} - -SWIGEXPORT bool -LLDBSWIGPythonRunScriptKeywordThread -(const char* python_function_name, -const char* session_dictionary_name, -lldb::ThreadSP& thread, -std::string& output) - -{ -    using namespace lldb_private; - -    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) -        return false; - -    PyErr_Cleaner py_err_cleaner(true); - -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); - -    if (!pfunc.IsAllocated()) -        return false; - -    lldb::SBThread thread_sb(thread); -    PythonObject thread_arg(PyRefType::Owned, SBTypeToSWIGWrapper(thread_sb)); -    auto result = pfunc(thread_arg, dict); - -    output = result.Str().GetString().str(); - -    return true; -} - -SWIGEXPORT bool -LLDBSWIGPythonRunScriptKeywordTarget -(const char* python_function_name, -const char* session_dictionary_name, -lldb::TargetSP& target, -std::string& output) - -{ -    using namespace lldb_private; - -    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) -        return false; - -    PyErr_Cleaner py_err_cleaner(true); - -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict); - -    if (!pfunc.IsAllocated()) -        return false; - -    lldb::SBTarget target_sb(target); -    PythonObject target_arg(PyRefType::Owned, SBTypeToSWIGWrapper(target_sb)); -    auto result = pfunc(target_arg, dict); - -    output = result.Str().GetString().str(); - -    return true; -} - -SWIGEXPORT bool -LLDBSWIGPythonRunScriptKeywordFrame -(const char* python_function_name, -const char* session_dictionary_name, -lldb::StackFrameSP& frame, -std::string& output) - -{ -    using namespace lldb_private; - -    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) -        return false; - -    PyErr_Cleaner py_err_cleaner(true); - -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict); - -    if (!pfunc.IsAllocated()) -        return false; - -    lldb::SBFrame frame_sb(frame); -    PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(frame_sb)); -    auto result = pfunc(frame_arg, dict); - -    output = result.Str().GetString().str(); - -    return true; -} - -SWIGEXPORT bool -LLDBSWIGPythonRunScriptKeywordValue -(const char* python_function_name, -const char* session_dictionary_name, -lldb::ValueObjectSP& value, -std::string& output) - -{ -    using namespace lldb_private; - -    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name) -        return false; - -    PyErr_Cleaner py_err_cleaner(true); - -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); - -    if (!pfunc.IsAllocated()) -        return false; - -    lldb::SBValue value_sb(value); -    PythonObject value_arg(PyRefType::Owned, SBTypeToSWIGWrapper(value_sb)); -    auto result = pfunc(value_arg, dict); - -    output = result.Str().GetString().str(); - -    return true; -} - -SWIGEXPORT bool -LLDBSwigPythonCallModuleInit -( -    const char *python_module_name, -    const char *session_dictionary_name, -    lldb::DebuggerSP& debugger -) -{ -    using namespace lldb_private; - -    std::string python_function_name_string = python_module_name; -    python_function_name_string += ".__lldb_init_module"; -    const char* python_function_name = python_function_name_string.c_str(); - -    PyErr_Cleaner py_err_cleaner(true); - -    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name); -    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict); - -    // This method is optional and need not exist.  So if we don't find it, -    // it's actually a success, not a failure. -    if (!pfunc.IsAllocated()) -        return true; - -    lldb::SBDebugger debugger_sb(debugger); -    PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb)); -    pfunc(debugger_arg, dict); - -    return true; -} -%} - - -%runtime %{ -// Forward declaration to be inserted at the start of LLDBWrapPython.h -#include "lldb/API/SBDebugger.h" -#include "lldb/API/SBValue.h" - -SWIGEXPORT lldb::ValueObjectSP -LLDBSWIGPython_GetValueObjectSPFromSBValue (void* data) -{ -    lldb::ValueObjectSP valobj_sp; -    if (data) -    { -        lldb::SBValue* sb_ptr = (lldb::SBValue *)data; -        valobj_sp = sb_ptr->GetSP(); -    } -    return valobj_sp; -} - -#ifdef __cplusplus -extern "C" { -#endif - -void LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton); - -#ifdef __cplusplus -} -#endif -%} - -%wrapper %{ - - -// For the LogOutputCallback functions -void LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton) { -    if (baton != Py_None) { -      SWIG_PYTHON_THREAD_BEGIN_BLOCK; -      PyObject *result = PyObject_CallFunction(reinterpret_cast<PyObject*>(baton), const_cast<char*>("s"), str); -	  Py_XDECREF(result); -      SWIG_PYTHON_THREAD_END_BLOCK; -    } -} -%} diff --git a/scripts/Python/remote-build.py b/scripts/Python/remote-build.py deleted file mode 100755 index d1d6131e472b..000000000000 --- a/scripts/Python/remote-build.py +++ /dev/null @@ -1,312 +0,0 @@ -#!/usr/bin/python - -from __future__ import print_function - -import argparse -import getpass -import os -import os.path -import re -import select -import sys -import subprocess - -_COMMON_SYNC_OPTS = "-avzh --delete" -_COMMON_EXCLUDE_OPTS = "--exclude=DerivedData --exclude=.svn --exclude=.git --exclude=llvm-build/Release+Asserts" - - -def normalize_configuration(config_text): -    if not config_text: -        return "debug" - -    config_lower = config_text.lower() -    if config_lower in ["debug", "release"]: -        return config_lower -    else: -        raise Exception("unknown configuration specified: %s" % config_text) - - -def parse_args(): -    DEFAULT_REMOTE_ROOT_DIR = "/mnt/ssd/work/macosx.sync" -    DEFAULT_REMOTE_HOSTNAME = "tfiala2.mtv.corp.google.com" -    OPTIONS_FILENAME = ".remote-build.conf" -    DEFAULT_SSH_PORT = "22" - -    parser = argparse.ArgumentParser(fromfile_prefix_chars='@') - -    parser.add_argument( -        "--configuration", -        "-c", -        help="specify configuration (Debug, Release)", -        default=normalize_configuration( -            os.environ.get( -                'CONFIGURATION', -                'Debug'))) -    parser.add_argument( -        "--debug", "-d", -        action="store_true", -        help="help debug the remote-build script by adding extra logging") -    parser.add_argument( -        "--local-lldb-dir", "-l", metavar="DIR", -        help="specify local lldb directory (Xcode layout assumed for llvm/clang)", -        default=os.getcwd()) -    parser.add_argument( -        "--port", "-p", -        help="specify the port ssh should use to connect to the remote side", -        default=DEFAULT_SSH_PORT) -    parser.add_argument( -        "--remote-address", "-r", metavar="REMOTE-ADDR", -        help="specify the dns name or ip address of the remote linux system", -        default=DEFAULT_REMOTE_HOSTNAME) -    parser.add_argument( -        "--remote-dir", metavar="DIR", -        help="specify the root of the linux source/build dir", -        default=DEFAULT_REMOTE_ROOT_DIR) -    parser.add_argument( -        "--user", "-u", help="specify the user name for the remote system", -        default=getpass.getuser()) -    parser.add_argument( -        "--xcode-action", -        "-x", -        help="$(ACTION) from Xcode", -        nargs='?', -        default=None) - -    command_line_args = sys.argv[1:] -    if os.path.exists(OPTIONS_FILENAME): -        # Prepend the file so that command line args override the file -        # contents. -        command_line_args.insert(0, "@%s" % OPTIONS_FILENAME) - -    return parser.parse_args(command_line_args) - - -def maybe_create_remote_root_dir(args): -    commandline = [ -        "ssh", -        "-p", args.port, -        "%s@%s" % (args.user, args.remote_address), -        "mkdir", -        "-p", -        args.remote_dir] -    print("create remote root dir command:\n{}".format(commandline)) -    return subprocess.call(commandline) - - -def init_with_args(args): -    # Expand any user directory specs in local-side source dir (on MacOSX). -    args.local_lldb_dir = os.path.expanduser(args.local_lldb_dir) - -    # Append the configuration type to the remote build dir. -    args.configuration = normalize_configuration(args.configuration) -    args.remote_build_dir = os.path.join( -        args.remote_dir, -        "build-%s" % args.configuration) - -    # We assume the local lldb directory is really named 'lldb'. -    # This is because on the remote end, the local lldb root dir -    # is copied over underneath llvm/tools and will be named there -    # whatever it is named locally.  The remote build will assume -    # is is called lldb. -    if os.path.basename(args.local_lldb_dir) != 'lldb': -        raise Exception( -            "local lldb root needs to be called 'lldb' but was {} instead" -            .format(os.path.basename(args.local_lldb_dir))) - -    args.lldb_dir_relative_regex = re.compile( -        "%s/llvm/tools/lldb/" % args.remote_dir) -    args.llvm_dir_relative_regex = re.compile("%s/" % args.remote_dir) - -    print("Xcode action:", args.xcode_action) - -    # Ensure the remote directory exists. -    result = maybe_create_remote_root_dir(args) -    if result == 0: -        print("using remote root dir: %s" % args.remote_dir) -    else: -        print("remote root dir doesn't exist and could not be created, " -              + "error code:", result) -        return False - -    return True - - -def sync_llvm(args): -    commandline = ["rsync"] -    commandline.extend(_COMMON_SYNC_OPTS.split()) -    commandline.extend(_COMMON_EXCLUDE_OPTS.split()) -    commandline.append("--exclude=/llvm/tools/lldb") -    commandline.extend(["-e", "ssh -p {}".format(args.port)]) -    commandline.extend([ -        "%s/llvm" % args.local_lldb_dir, -        "%s@%s:%s" % (args.user, args.remote_address, args.remote_dir)]) -    if args.debug: -        print("going to execute llvm sync: {}".format(commandline)) -    return subprocess.call(commandline) - - -def sync_lldb(args): -    commandline = ["rsync"] -    commandline.extend(_COMMON_SYNC_OPTS.split()) -    commandline.extend(_COMMON_EXCLUDE_OPTS.split()) -    commandline.append("--exclude=/lldb/llvm") -    commandline.extend(["-e", "ssh -p {}".format(args.port)]) -    commandline.extend([args.local_lldb_dir, "%s@%s:%s/llvm/tools" % -                        (args.user, args.remote_address, args.remote_dir)]) -    if args.debug: -        print("going to execute lldb sync: {}".format(commandline)) -    return subprocess.call(commandline) - - -def build_cmake_command(args): -    # args.remote_build_dir -    # args.configuration in ('release', 'debug') - -    if args.configuration == 'debug-optimized': -        build_type_name = "RelWithDebInfo" -    elif args.configuration == 'release': -        build_type_name = "Release" -    else: -        build_type_name = "Debug" - -    ld_flags = "\"-lstdc++ -lm\"" - -    install_dir = os.path.join( -        args.remote_build_dir, "..", "install-{}".format(args.configuration)) - -    command_line = [ -        "cmake", -        "-GNinja", -        "-DCMAKE_CXX_COMPILER=clang", -        "-DCMAKE_C_COMPILER=clang", -        # "-DCMAKE_CXX_FLAGS=%s" % cxx_flags, -        "-DCMAKE_SHARED_LINKER_FLAGS=%s" % ld_flags, -        "-DCMAKE_EXE_LINKER_FLAGS=%s" % ld_flags, -        "-DCMAKE_INSTALL_PREFIX:PATH=%s" % install_dir, -        "-DCMAKE_BUILD_TYPE=%s" % build_type_name, -        "-Wno-dev", -        os.path.join("..", "llvm") -    ] - -    return command_line - - -def maybe_configure(args): -    commandline = [ -        "ssh", -        "-p", args.port, -        "%s@%s" % (args.user, args.remote_address), -        "cd", args.remote_dir, "&&", -        "mkdir", "-p", args.remote_build_dir, "&&", -        "cd", args.remote_build_dir, "&&" -    ] -    commandline.extend(build_cmake_command(args)) - -    if args.debug: -        print("configure command: {}".format(commandline)) - -    return subprocess.call(commandline) - - -def filter_build_line(args, line): -    lldb_relative_line = args.lldb_dir_relative_regex.sub('', line) -    if len(lldb_relative_line) != len(line): -        # We substituted - return the modified line -        return lldb_relative_line - -    # No match on lldb path (longer on linux than llvm path).  Try -    # the llvm path match. -    return args.llvm_dir_relative_regex.sub('', line) - - -def run_remote_build_command(args, build_command_list): -    commandline = [ -        "ssh", -        "-p", args.port, -        "%s@%s" % (args.user, args.remote_address), -        "cd", args.remote_build_dir, "&&"] -    commandline.extend(build_command_list) - -    if args.debug: -        print("running remote build command: {}".format(commandline)) - -    proc = subprocess.Popen( -        commandline, -        stdout=subprocess.PIPE, -        stderr=subprocess.PIPE) - -    # Filter stdout/stderr output for file path mapping. -    # We do this to enable Xcode to see filenames relative to the -    # MacOSX-side directory structure. -    while True: -        reads = [proc.stdout.fileno(), proc.stderr.fileno()] -        select_result = select.select(reads, [], []) - -        for fd in select_result[0]: -            if fd == proc.stdout.fileno(): -                line = proc.stdout.readline() -                display_line = filter_build_line(args, line.rstrip()) -                if display_line and len(display_line) > 0: -                    print(display_line) -            elif fd == proc.stderr.fileno(): -                line = proc.stderr.readline() -                display_line = filter_build_line(args, line.rstrip()) -                if display_line and len(display_line) > 0: -                    print(display_line, file=sys.stderr) - -        proc_retval = proc.poll() -        if proc_retval is not None: -            # Process stopped.  Drain output before finishing up. - -            # Drain stdout. -            while True: -                line = proc.stdout.readline() -                if line: -                    display_line = filter_build_line(args, line.rstrip()) -                    if display_line and len(display_line) > 0: -                        print(display_line) -                else: -                    break - -            # Drain stderr. -            while True: -                line = proc.stderr.readline() -                if line: -                    display_line = filter_build_line(args, line.rstrip()) -                    if display_line and len(display_line) > 0: -                        print(display_line, file=sys.stderr) -                else: -                    break - -            return proc_retval - - -def build(args): -    return run_remote_build_command(args, ["time", "ninja"]) - - -def clean(args): -    return run_remote_build_command(args, ["ninja", "clean"]) - - -if __name__ == "__main__": -    # Handle arg parsing. -    args = parse_args() - -    # Initialize the system. -    if not init_with_args(args): -        exit(1) - -    # Sync over llvm and clang source. -    sync_llvm(args) - -    # Sync over lldb source. -    sync_lldb(args) - -    # Configure the remote build if it's not already. -    maybe_configure(args) - -    if args.xcode_action == 'clean': -        exit(clean(args)) -    else: -        exit(build(args)) diff --git a/scripts/Python/use_lldb_suite.py b/scripts/Python/use_lldb_suite.py deleted file mode 100644 index 6e24b9da8d34..000000000000 --- a/scripts/Python/use_lldb_suite.py +++ /dev/null @@ -1,26 +0,0 @@ -import inspect -import os -import sys - - -def find_lldb_root(): -    lldb_root = os.path.dirname(inspect.getfile(inspect.currentframe())) -    while True: -        lldb_root = os.path.dirname(lldb_root) -        if lldb_root is None: -            return None - -        test_path = os.path.join(lldb_root, "use_lldb_suite_root.py") -        if os.path.isfile(test_path): -            return lldb_root -    return None - -lldb_root = find_lldb_root() -if lldb_root is not None: -    import imp -    fp, pathname, desc = imp.find_module("use_lldb_suite_root", [lldb_root]) -    try: -        imp.load_module("use_lldb_suite_root", fp, pathname, desc) -    finally: -        if fp: -            fp.close() | 
