diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2019-08-20 18:01:57 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2019-08-20 18:01:57 +0000 |
commit | 88c643b6fec27eec436c8d138fee6346e92337d6 (patch) | |
tree | 82cd13b2f3cde1c9e5f79689ba4e6ba67694843f /scripts/Python | |
parent | 94994d372d014ce4c8758b9605d63fae651bd8aa (diff) |
Notes
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() |