Index: lldb/CMakeLists.txt =================================================================== --- lldb/CMakeLists.txt +++ lldb/CMakeLists.txt @@ -51,7 +51,7 @@ CACHE STRING "Path where Python modules are installed, relative to install prefix") endif () -if (LLDB_ENABLE_PYTHON OR LLDB_ENABLE_LUA) +if (LLDB_ENABLE_PYTHON OR LLDB_ENABLE_LUA OR LLDB_ENABLE_JAVA) add_subdirectory(bindings) endif () Index: lldb/bindings/CMakeLists.txt =================================================================== --- lldb/bindings/CMakeLists.txt +++ lldb/bindings/CMakeLists.txt @@ -38,3 +38,8 @@ if (LLDB_ENABLE_LUA) add_subdirectory(lua) endif() + +if (LLDB_ENABLE_JAVA) + add_subdirectory(java) +endif() + Index: lldb/bindings/java/CMakeLists.txt =================================================================== --- /dev/null +++ lldb/bindings/java/CMakeLists.txt @@ -0,0 +1,20 @@ +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/LLDBWrapJava.cpp + DEPENDS ${SWIG_SOURCES} + DEPENDS ${SWIG_INTERFACES} + DEPENDS ${SWIG_HEADERS} + COMMAND ${SWIG_EXECUTABLE} + ${SWIG_COMMON_FLAGS} + -I${CMAKE_CURRENT_SOURCE_DIR} + -java + -package SWIG + -c++ + -outdir ${CMAKE_CURRENT_BINARY_DIR} + -o ${CMAKE_CURRENT_BINARY_DIR}/LLDBWrapJava.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/java.swig + VERBATIM + COMMENT "Building LLDB Java wrapper") + +add_custom_target(swig_wrapper_java ALL DEPENDS + ${CMAKE_CURRENT_BINARY_DIR}/LLDBWrapJava.cpp +) Index: lldb/bindings/java/java-typemaps.swig =================================================================== --- /dev/null +++ lldb/bindings/java/java-typemaps.swig @@ -0,0 +1,21 @@ +/* ### + * IP: Apache License 2.0 with LLVM Exceptions + */ +%include +%include +%include + +%typemap(javabase) ByteArray "SWIGTYPE_p_void" +%typemap(javabody) ByteArray %{ + private long swigCPtr; // Minor bodge to work around private variable in parent + private boolean swigCMemOwn; + public $javaclassname(long cPtr, boolean cMemoryOwn) { + super(cPtr, cMemoryOwn); + this.swigCPtr = SWIGTYPE_p_void.getCPtr(this); + swigCMemOwn = cMemoryOwn; + } +%} + +%array_class(jbyte, ByteArray); + +%apply char **STRING_ARRAY { char ** } Index: lldb/bindings/java/java.swig =================================================================== --- /dev/null +++ lldb/bindings/java/java.swig @@ -0,0 +1,25 @@ +/* ### + * IP: Apache License 2.0 with LLVM Exceptions + */ +/* + lldb.swig + + This is the input file for SWIG, to create the appropriate C++ wrappers and + functions for various scripting languages, to enable them to call the + liblldb Script Bridge functions. +*/ + +%module lldb + +%include +%include "java-typemaps.swig" +%include "macros.swig" +%include "headers.swig" + +%{ +using namespace lldb_private; +using namespace lldb; +%} + +%include "interfaces.swig" +//%include "lua-wrapper.swig" Index: lldb/cmake/modules/FindJavaAndSwig.cmake =================================================================== --- /dev/null +++ lldb/cmake/modules/FindJavaAndSwig.cmake @@ -0,0 +1,32 @@ +#.rst: +# FindJavaAndSwig +# -------------- +# +# Find Java and SWIG as a whole. + +#if(JAVA_LIBRARIES AND JAVA_INCLUDE_DIR AND SWIG_EXECUTABLE) +if(SWIG_EXECUTABLE) + set(JAVAANDSWIG_FOUND TRUE) +else() + find_package(SWIG 2.0) + if (SWIG_FOUND) + find_package(Java 11.0) + if(JAVA_FOUND AND SWIG_FOUND) + mark_as_advanced( + JAVA_LIBRARIES + JAVA_INCLUDE_DIR + SWIG_EXECUTABLE) + endif() + else() + message(STATUS "SWIG 2 or later is required for Java support in LLDB but could not be found") + endif() + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(JavaAndSwig + FOUND_VAR + JAVAANDSWIG_FOUND + REQUIRED_VARS + JAVA_LIBRARIES + JAVA_INCLUDE_DIR + SWIG_EXECUTABLE) +endif() Index: lldb/include/lldb/Host/Config.h.cmake =================================================================== --- lldb/include/lldb/Host/Config.h.cmake +++ lldb/include/lldb/Host/Config.h.cmake @@ -41,6 +41,8 @@ #cmakedefine01 LLDB_ENABLE_LIBXML2 +#cmakedefine01 LLDB_ENABLE_JAVA + #cmakedefine01 LLDB_ENABLE_LUA #cmakedefine01 LLDB_ENABLE_PYTHON Index: lldb/source/API/CMakeLists.txt =================================================================== --- lldb/source/API/CMakeLists.txt +++ lldb/source/API/CMakeLists.txt @@ -19,6 +19,11 @@ set(lldb_lua_wrapper ${lua_bindings_dir}/LLDBWrapLua.cpp) endif() +if(LLDB_ENABLE_JAVA) + get_target_property(java_bindings_dir swig_wrapper_java BINARY_DIR) + set(lldb_java_wrapper ${java_bindings_dir}/LLDBWrapJava.cpp) +endif() + add_lldb_library(liblldb SHARED ${option_framework} SBAddress.cpp SBAttachInfo.cpp @@ -76,6 +81,7 @@ SBThreadCollection.cpp SBThreadPlan.cpp SBTrace.cpp + SBTraceOptions.cpp SBType.cpp SBTypeCategory.cpp SBTypeEnumMember.cpp @@ -92,6 +98,7 @@ SystemInitializerFull.cpp ${lldb_python_wrapper} ${lldb_lua_wrapper} + ${lldb_java_wrapper} LINK_LIBS lldbBase @@ -160,6 +167,21 @@ set_source_files_properties(${lldb_lua_wrapper} PROPERTIES GENERATED ON) endif() +if(LLDB_ENABLE_JAVA) + add_dependencies(liblldb swig_wrapper_java) + target_include_directories(liblldb PRIVATE ${JAVA_INCLUDE_DIR}) + target_include_directories(liblldb PRIVATE ${JAVA_INCLUDE_DIR}/darwin) + + if (MSVC) + set_property(SOURCE ${lldb_java_wrapper} APPEND_STRING PROPERTY COMPILE_FLAGS " /W0") + else() + set_property(SOURCE ${lldb_java_wrapper} APPEND_STRING PROPERTY COMPILE_FLAGS " ") + endif() + + set_source_files_properties(${lldb_java_wrapper} PROPERTIES GENERATED ON) +endif() + + set_target_properties(liblldb PROPERTIES VERSION ${LLDB_VERSION} @@ -181,7 +203,13 @@ set_target_properties(liblldb_exports PROPERTIES FOLDER "lldb misc") endif() -if (NOT MSVC) +if (MSVC) + # Only MSVC has the ABI compatibility problem and avoids using FindPythonLibs, + # so only it needs to explicitly link against ${Python3_LIBRARIES} + if (LLDB_ENABLE_PYTHON) + target_link_libraries(liblldb PRIVATE ${Python3_LIBRARIES}) + endif() +else() set_target_properties(liblldb PROPERTIES OUTPUT_NAME lldb Index: lldb/source/API/SBDebugger.cpp =================================================================== --- lldb/source/API/SBDebugger.cpp +++ lldb/source/API/SBDebugger.cpp @@ -736,6 +736,9 @@ AddBoolConfigEntry( *config_up, "lua", LLDB_ENABLE_LUA, "A boolean value that indicates if lua support is enabled in LLDB"); + AddBoolConfigEntry( + *config_up, "java", LLDB_ENABLE_JAVA, + "A boolean value that indicates if java support is enabled in LLDB"); AddLLVMTargets(*config_up); SBStructuredData data; Index: lldb/source/API/liblldb-private.exports =================================================================== --- lldb/source/API/liblldb-private.exports +++ lldb/source/API/liblldb-private.exports @@ -4,3 +4,4 @@ _ZNK12lldb_private* init_lld* PyInit__lldb* +Java* Index: lldb/source/API/liblldb.exports =================================================================== --- lldb/source/API/liblldb.exports +++ lldb/source/API/liblldb.exports @@ -1,4 +1,7 @@ _ZN4lldb* _ZNK4lldb* +_ZN12lldb* +_ZNK12lldb* init_lld* PyInit__lldb* +Java*