Merge pull request #264 from compnerd/dtrace-usdt-probes

build: add dtrace USDT probe support
diff --git a/cmake/modules/DTrace.cmake b/cmake/modules/DTrace.cmake
new file mode 100644
index 0000000..20a28cc
--- /dev/null
+++ b/cmake/modules/DTrace.cmake
@@ -0,0 +1,26 @@
+
+function(dtrace_usdt_probe script)
+  set(options)
+  set(single_parameter_options TARGET_NAME OUTPUT_SOURCES)
+  set(multiple_parameter_options)
+
+  cmake_parse_arguments("" "${options}" "${single_parameter_options}" "${multiple_parameter_options}" ${ARGN})
+
+  get_filename_component(script_we ${script} NAME_WE)
+
+  add_custom_command(OUTPUT
+                       ${CMAKE_CURRENT_BINARY_DIR}/${script_we}.h
+                     COMMAND
+                       ${dtrace_EXECUTABLE} -h -s ${script} -o ${CMAKE_CURRENT_BINARY_DIR}/${script_we}.h
+                     DEPENDS
+                       ${script})
+  add_custom_target(dtrace-usdt-header-${script_we}
+                    DEPENDS
+                      ${CMAKE_CURRENT_BINARY_DIR}/${script_we}.h)
+  if(_TARGET_NAME)
+    set(${_TARGET_NAME} dtrace-usdt-header-${script_we} PARENT_SCOPE)
+  endif()
+  if(_OUTPUT_SOURCES)
+    set(${_OUTPUT_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/${script_we}.h PARENT_SCOPE)
+  endif()
+endfunction()
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index bbc7f46..ac2b30a 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,5 +1,6 @@
 
 include(SwiftSupport)
+include(DTrace)
 
 add_library(dispatch
               allocator.c
@@ -103,11 +104,20 @@
                    swift/DispatchStubs.cc
                    ${CMAKE_CURRENT_BINARY_DIR}/swiftDispatch.o)
 endif()
+if(dtrace_EXECUTABLE)
+  dtrace_usdt_probe(${CMAKE_CURRENT_SOURCE_DIR}/provider.d
+                    OUTPUT_SOURCES
+                      dispatch_dtrace_provider_headers)
+  target_sources(dispatch
+                 PRIVATE
+                   ${dispatch_dtrace_provider_headers})
+endif()
 target_include_directories(dispatch
                            PRIVATE
                              ${CMAKE_BINARY_DIR}
                              ${CMAKE_SOURCE_DIR}
                              ${CMAKE_CURRENT_SOURCE_DIR}
+                             ${CMAKE_CURRENT_BINARY_DIR}
                              ${CMAKE_SOURCE_DIR}/private)
 if(WITH_PTHREAD_WORKQUEUES)
   target_include_directories(dispatch