| function(lldb_tablegen) | 
 |   # Syntax: | 
 |   # lldb_tablegen output-file [tablegen-arg ...] SOURCE source-file | 
 |   # [[TARGET cmake-target-name] [DEPENDS extra-dependency ...]] | 
 |   # | 
 |   # Generates a custom command for invoking tblgen as | 
 |   # | 
 |   # tblgen source-file -o=output-file tablegen-arg ... | 
 |   # | 
 |   # and, if cmake-target-name is provided, creates a custom target for | 
 |   # executing the custom command depending on output-file. It is | 
 |   # possible to list more files to depend after DEPENDS. | 
 |  | 
 |   cmake_parse_arguments(LTG "" "SOURCE;TARGET" "" ${ARGN}) | 
 |  | 
 |   if(NOT LTG_SOURCE) | 
 |     message(FATAL_ERROR "SOURCE source-file required by lldb_tablegen") | 
 |   endif() | 
 |  | 
 |   set(LLVM_TARGET_DEFINITIONS ${LTG_SOURCE}) | 
 |   tablegen(LLDB ${LTG_UNPARSED_ARGUMENTS}) | 
 |  | 
 |   if(LTG_TARGET) | 
 |     add_public_tablegen_target(${LTG_TARGET}) | 
 |     set_target_properties( ${LTG_TARGET} PROPERTIES FOLDER "LLDB tablegenning") | 
 |     set_property(GLOBAL APPEND PROPERTY LLDB_TABLEGEN_TARGETS ${LTG_TARGET}) | 
 |   endif() | 
 | endfunction(lldb_tablegen) | 
 |  | 
 | function(add_lldb_library name) | 
 |   include_directories(BEFORE | 
 |     ${CMAKE_CURRENT_BINARY_DIR} | 
 | ) | 
 |  | 
 |   # only supported parameters to this macro are the optional | 
 |   # MODULE;SHARED;STATIC library type and source files | 
 |   cmake_parse_arguments(PARAM | 
 |     "MODULE;SHARED;STATIC;OBJECT;PLUGIN;FRAMEWORK" | 
 |     "INSTALL_PREFIX;ENTITLEMENTS" | 
 |     "EXTRA_CXXFLAGS;DEPENDS;LINK_LIBS;LINK_COMPONENTS;CLANG_LIBS" | 
 |     ${ARGN}) | 
 |   llvm_process_sources(srcs ${PARAM_UNPARSED_ARGUMENTS}) | 
 |   list(APPEND LLVM_LINK_COMPONENTS ${PARAM_LINK_COMPONENTS}) | 
 |  | 
 |   if(PARAM_PLUGIN) | 
 |     set_property(GLOBAL APPEND PROPERTY LLDB_PLUGINS ${name}) | 
 |   endif() | 
 |  | 
 |   if (MSVC_IDE OR XCODE) | 
 |     string(REGEX MATCHALL "/[^/]+" split_path ${CMAKE_CURRENT_SOURCE_DIR}) | 
 |     list(GET split_path -1 dir) | 
 |     file(GLOB_RECURSE headers | 
 |       ../../include/lldb${dir}/*.h) | 
 |     set(srcs ${srcs} ${headers}) | 
 |   endif() | 
 |   if (PARAM_MODULE) | 
 |     set(libkind MODULE) | 
 |   elseif (PARAM_SHARED) | 
 |     set(libkind SHARED) | 
 |   elseif (PARAM_OBJECT) | 
 |     set(libkind OBJECT) | 
 |   else () | 
 |     # PARAM_STATIC or library type unspecified. BUILD_SHARED_LIBS | 
 |     # does not control the kind of libraries created for LLDB, | 
 |     # only whether or not they link to shared/static LLVM/Clang | 
 |     # libraries. | 
 |     set(libkind STATIC) | 
 |   endif() | 
 |  | 
 |   #PIC not needed on Win | 
 |   # FIXME: Setting CMAKE_CXX_FLAGS here is a no-op, use target_compile_options | 
 |   # or omit this logic instead. | 
 |   if (NOT WIN32) | 
 |     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") | 
 |   endif() | 
 |  | 
 |   if (PARAM_OBJECT) | 
 |     add_library(${name} ${libkind} ${srcs}) | 
 |   else() | 
 |     if(PARAM_ENTITLEMENTS) | 
 |       set(pass_ENTITLEMENTS ENTITLEMENTS ${PARAM_ENTITLEMENTS}) | 
 |     endif() | 
 |  | 
 |     if(LLDB_NO_INSTALL_DEFAULT_RPATH) | 
 |       set(pass_NO_INSTALL_RPATH NO_INSTALL_RPATH) | 
 |     endif() | 
 |  | 
 |     llvm_add_library(${name} ${libkind} ${srcs} | 
 |       LINK_LIBS ${PARAM_LINK_LIBS} | 
 |       DEPENDS ${PARAM_DEPENDS} | 
 |       ${pass_ENTITLEMENTS} | 
 |       ${pass_NO_INSTALL_RPATH} | 
 |     ) | 
 |  | 
 |     if(CLANG_LINK_CLANG_DYLIB) | 
 |       target_link_libraries(${name} PRIVATE clang-cpp) | 
 |     else() | 
 |       target_link_libraries(${name} PRIVATE ${PARAM_CLANG_LIBS}) | 
 |     endif() | 
 |   endif() | 
 |  | 
 |   # A target cannot be changed to a FRAMEWORK after calling install() because | 
 |   # this may result in the wrong install DESTINATION. The FRAMEWORK property | 
 |   # must be set earlier. | 
 |   if(PARAM_FRAMEWORK) | 
 |     set_target_properties(liblldb PROPERTIES FRAMEWORK ON) | 
 |   endif() | 
 |  | 
 |   if(PARAM_SHARED) | 
 |     set(install_dest lib${LLVM_LIBDIR_SUFFIX}) | 
 |     if(PARAM_INSTALL_PREFIX) | 
 |       set(install_dest ${PARAM_INSTALL_PREFIX}) | 
 |     endif() | 
 |     # RUNTIME is relevant for DLL platforms, FRAMEWORK for macOS | 
 |     install(TARGETS ${name} COMPONENT ${name} | 
 |       RUNTIME DESTINATION bin | 
 |       LIBRARY DESTINATION ${install_dest} | 
 |       ARCHIVE DESTINATION ${install_dest} | 
 |       FRAMEWORK DESTINATION ${install_dest}) | 
 |     if (NOT CMAKE_CONFIGURATION_TYPES) | 
 |       add_llvm_install_targets(install-${name} | 
 |                               DEPENDS ${name} | 
 |                               COMPONENT ${name}) | 
 |     endif() | 
 |   endif() | 
 |  | 
 |   # Hack: only some LLDB libraries depend on the clang autogenerated headers, | 
 |   # but it is simple enough to make all of LLDB depend on some of those | 
 |   # headers without negatively impacting much of anything. | 
 |   if(NOT LLDB_BUILT_STANDALONE) | 
 |     add_dependencies(${name} clang-tablegen-targets) | 
 |   endif() | 
 |  | 
 |   # Add in any extra C++ compilation flags for this library. | 
 |   target_compile_options(${name} PRIVATE ${PARAM_EXTRA_CXXFLAGS}) | 
 |  | 
 |   if(PARAM_PLUGIN) | 
 |     get_property(parent_dir DIRECTORY PROPERTY PARENT_DIRECTORY) | 
 |     if(EXISTS ${parent_dir}) | 
 |       get_filename_component(category ${parent_dir} NAME) | 
 |       set_target_properties(${name} PROPERTIES FOLDER "lldb plugins/${category}") | 
 |     endif() | 
 |   else() | 
 |     set_target_properties(${name} PROPERTIES FOLDER "lldb libraries") | 
 |   endif() | 
 | endfunction(add_lldb_library) | 
 |  | 
 | function(add_lldb_executable name) | 
 |   cmake_parse_arguments(ARG | 
 |     "GENERATE_INSTALL" | 
 |     "INSTALL_PREFIX;ENTITLEMENTS" | 
 |     "LINK_LIBS;CLANG_LIBS;LINK_COMPONENTS;BUILD_RPATH;INSTALL_RPATH" | 
 |     ${ARGN} | 
 |     ) | 
 |  | 
 |   if(ARG_ENTITLEMENTS) | 
 |     set(pass_ENTITLEMENTS ENTITLEMENTS ${ARG_ENTITLEMENTS}) | 
 |   endif() | 
 |  | 
 |   if(LLDB_NO_INSTALL_DEFAULT_RPATH) | 
 |     set(pass_NO_INSTALL_RPATH NO_INSTALL_RPATH) | 
 |   endif() | 
 |  | 
 |   list(APPEND LLVM_LINK_COMPONENTS ${ARG_LINK_COMPONENTS}) | 
 |   add_llvm_executable(${name} | 
 |     ${pass_ENTITLEMENTS} | 
 |     ${pass_NO_INSTALL_RPATH} | 
 |     ${ARG_UNPARSED_ARGUMENTS} | 
 |   ) | 
 |  | 
 |   target_link_libraries(${name} PRIVATE ${ARG_LINK_LIBS}) | 
 |   if(CLANG_LINK_CLANG_DYLIB) | 
 |     target_link_libraries(${name} PRIVATE clang-cpp) | 
 |   else() | 
 |     target_link_libraries(${name} PRIVATE ${ARG_CLANG_LIBS}) | 
 |   endif() | 
 |   set_target_properties(${name} PROPERTIES FOLDER "lldb executables") | 
 |  | 
 |   if (ARG_BUILD_RPATH) | 
 |     set_target_properties(${name} PROPERTIES BUILD_RPATH "${ARG_BUILD_RPATH}") | 
 |   endif() | 
 |  | 
 |   if (ARG_INSTALL_RPATH) | 
 |     set_target_properties(${name} PROPERTIES | 
 |       BUILD_WITH_INSTALL_RPATH OFF | 
 |       INSTALL_RPATH "${ARG_INSTALL_RPATH}") | 
 |   endif() | 
 |  | 
 |   if(ARG_GENERATE_INSTALL) | 
 |     set(install_dest bin) | 
 |     if(ARG_INSTALL_PREFIX) | 
 |       set(install_dest ${ARG_INSTALL_PREFIX}) | 
 |     endif() | 
 |     install(TARGETS ${name} COMPONENT ${name} | 
 |             RUNTIME DESTINATION ${install_dest} | 
 |             LIBRARY DESTINATION ${install_dest} | 
 |             BUNDLE DESTINATION ${install_dest} | 
 |             FRAMEWORK DESTINATION ${install_dest}) | 
 |     if (NOT CMAKE_CONFIGURATION_TYPES) | 
 |       add_llvm_install_targets(install-${name} | 
 |                                DEPENDS ${name} | 
 |                                COMPONENT ${name}) | 
 |     endif() | 
 |     if(APPLE AND ARG_INSTALL_PREFIX) | 
 |       lldb_add_post_install_steps_darwin(${name} ${ARG_INSTALL_PREFIX}) | 
 |     endif() | 
 |   endif() | 
 | endfunction() | 
 |  | 
 |  | 
 | macro(add_lldb_tool_subdirectory name) | 
 |   add_llvm_subdirectory(LLDB TOOL ${name}) | 
 | endmacro() | 
 |  | 
 | function(add_lldb_tool name) | 
 |   cmake_parse_arguments(ARG "ADD_TO_FRAMEWORK" "" "" ${ARGN}) | 
 |   if(LLDB_BUILD_FRAMEWORK AND ARG_ADD_TO_FRAMEWORK) | 
 |     set(subdir LLDB.framework/Versions/${LLDB_FRAMEWORK_VERSION}/Resources) | 
 |     add_lldb_executable(${name} | 
 |       GENERATE_INSTALL | 
 |       INSTALL_PREFIX ${LLDB_FRAMEWORK_INSTALL_DIR}/${subdir} | 
 |       ${ARG_UNPARSED_ARGUMENTS} | 
 |     ) | 
 |     lldb_add_to_buildtree_lldb_framework(${name} ${subdir}) | 
 |     return() | 
 |   endif() | 
 |  | 
 |   add_lldb_executable(${name} GENERATE_INSTALL ${ARG_UNPARSED_ARGUMENTS}) | 
 | endfunction() | 
 |  | 
 | # The test suite relies on finding LLDB.framework binary resources in the | 
 | # build-tree. Remove them before installing to avoid collisions with their | 
 | # own install targets. | 
 | function(lldb_add_to_buildtree_lldb_framework name subdir) | 
 |   # Destination for the copy in the build-tree. While the framework target may | 
 |   # not exist yet, it will exist when the generator expression gets expanded. | 
 |   set(copy_dest "${LLDB_FRAMEWORK_ABSOLUTE_BUILD_DIR}/${subdir}/$<TARGET_FILE_NAME:${name}>") | 
 |  | 
 |   # Copy into the given subdirectory for testing. | 
 |   add_custom_command(TARGET ${name} POST_BUILD | 
 |     COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${name}> ${copy_dest} | 
 |     COMMENT "Copy ${name} to ${copy_dest}" | 
 |   ) | 
 | endfunction() | 
 |  | 
 | # Add extra install steps for dSYM creation and stripping for the given target. | 
 | function(lldb_add_post_install_steps_darwin name install_prefix) | 
 |   if(NOT APPLE) | 
 |     message(WARNING "Darwin-specific functionality; not currently available on non-Apple platforms.") | 
 |     return() | 
 |   endif() | 
 |  | 
 |   get_target_property(output_name ${name} OUTPUT_NAME) | 
 |   if(NOT output_name) | 
 |     set(output_name ${name}) | 
 |   endif() | 
 |  | 
 |   get_target_property(is_framework ${name} FRAMEWORK) | 
 |   if(is_framework) | 
 |     get_target_property(buildtree_dir ${name} LIBRARY_OUTPUT_DIRECTORY) | 
 |     if(buildtree_dir) | 
 |       set(bundle_subdir ${output_name}.framework/Versions/${LLDB_FRAMEWORK_VERSION}/) | 
 |     else() | 
 |       message(SEND_ERROR "Framework target ${name} missing property for output directory. Cannot generate post-install steps.") | 
 |       return() | 
 |     endif() | 
 |   else() | 
 |     get_target_property(target_type ${name} TYPE) | 
 |     if(target_type STREQUAL "EXECUTABLE") | 
 |       set(buildtree_dir ${LLVM_RUNTIME_OUTPUT_INTDIR}) | 
 |     else() | 
 |       # Only ever install shared libraries. | 
 |       set(output_name "lib${output_name}.dylib") | 
 |       set(buildtree_dir ${LLVM_LIBRARY_OUTPUT_INTDIR}) | 
 |     endif() | 
 |   endif() | 
 |  | 
 |   # Generate dSYM | 
 |   set(dsym_name ${output_name}.dSYM) | 
 |   if(is_framework) | 
 |     set(dsym_name ${output_name}.framework.dSYM) | 
 |   endif() | 
 |   if(LLDB_DEBUGINFO_INSTALL_PREFIX) | 
 |     # This makes the path absolute, so we must respect DESTDIR. | 
 |     set(dsym_name "\$ENV\{DESTDIR\}${LLDB_DEBUGINFO_INSTALL_PREFIX}/${dsym_name}") | 
 |   endif() | 
 |  | 
 |   set(buildtree_name ${buildtree_dir}/${bundle_subdir}${output_name}) | 
 |   install(CODE "message(STATUS \"Externalize debuginfo: ${dsym_name}\")" COMPONENT ${name}) | 
 |   install(CODE "execute_process(COMMAND xcrun dsymutil -o=${dsym_name} ${buildtree_name})" | 
 |           COMPONENT ${name}) | 
 |  | 
 |   if(NOT LLDB_SKIP_STRIP) | 
 |     # Strip distribution binary with -ST (removing debug symbol table entries and | 
 |     # Swift symbols). Avoid CMAKE_INSTALL_DO_STRIP and llvm_externalize_debuginfo() | 
 |     # as they can't be configured sufficiently. | 
 |     set(installtree_name "\$ENV\{DESTDIR\}${install_prefix}/${bundle_subdir}${output_name}") | 
 |     install(CODE "message(STATUS \"Stripping: ${installtree_name}\")" COMPONENT ${name}) | 
 |     install(CODE "execute_process(COMMAND xcrun strip -ST ${installtree_name})" | 
 |             COMPONENT ${name}) | 
 |   endif() | 
 | endfunction() | 
 |  | 
 | # CMake's set_target_properties() doesn't allow to pass lists for RPATH | 
 | # properties directly (error: "called with incorrect number of arguments"). | 
 | # Instead of defining two list variables each time, use this helper function. | 
 | function(lldb_setup_rpaths name) | 
 |   cmake_parse_arguments(LIST "" "" "BUILD_RPATH;INSTALL_RPATH" ${ARGN}) | 
 |   set_target_properties(${name} PROPERTIES | 
 |     BUILD_WITH_INSTALL_RPATH OFF | 
 |     BUILD_RPATH "${LIST_BUILD_RPATH}" | 
 |     INSTALL_RPATH "${LIST_INSTALL_RPATH}" | 
 |   ) | 
 | endfunction() | 
 |  | 
 | function(lldb_find_system_debugserver path) | 
 |   execute_process(COMMAND xcode-select -p | 
 |                   RESULT_VARIABLE exit_code | 
 |                   OUTPUT_VARIABLE xcode_dev_dir | 
 |                   ERROR_VARIABLE error_msg | 
 |                   OUTPUT_STRIP_TRAILING_WHITESPACE) | 
 |   if(exit_code) | 
 |     message(WARNING "`xcode-select -p` failed:\n${error_msg}") | 
 |   else() | 
 |     set(subpath "LLDB.framework/Resources/debugserver") | 
 |     set(path_shared "${xcode_dev_dir}/../SharedFrameworks/${subpath}") | 
 |     set(path_private "${xcode_dev_dir}/Library/PrivateFrameworks/${subpath}") | 
 |  | 
 |     if(EXISTS ${path_shared}) | 
 |       set(${path} ${path_shared} PARENT_SCOPE) | 
 |     elseif(EXISTS ${path_private}) | 
 |       set(${path} ${path_private} PARENT_SCOPE) | 
 |     else() | 
 |       message(WARNING "System debugserver requested, but not found. " | 
 |                       "Candidates don't exist: ${path_shared}\n${path_private}") | 
 |     endif() | 
 |   endif() | 
 | endfunction() | 
 |  | 
 | # Removes all module flags from the current CMAKE_CXX_FLAGS. Used for | 
 | # the Objective-C++ code in lldb which we don't want to build with modules. | 
 | # Reasons for this are that modules with Objective-C++ would require that | 
 | # all LLVM/Clang modules are Objective-C++ compatible (which they are likely | 
 | # not) and we would have rebuild a second set of modules just for the few | 
 | # Objective-C++ files in lldb (which slows down the build process). | 
 | macro(remove_module_flags) | 
 |   string(REGEX REPLACE "-fmodules-cache-path=[^ ]+" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") | 
 |   string(REGEX REPLACE "-fmodules-local-submodule-visibility" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") | 
 |   string(REGEX REPLACE "-fmodules" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") | 
 |   string(REGEX REPLACE "-gmodules" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") | 
 |   string(REGEX REPLACE "-fcxx-modules" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") | 
 | endmacro() |