For OMPT, it is useful to be able to pass arguments to the
tool. In Fortran, it is currently not directly possible to
pass additional data to the tool. However, there is a simple
way out:

Define an interface that calls the C function. Let's document
this option as example. (This matches what the OpenMP language
specification side plans: to add an example to the example
document.)

Committed as r17-4162-g9e55aa415ea90b

Cf.https://gcc.gnu.org/onlinedocs/libgomp/omp_005fcontrol_005ftool.html

Tobias
commit 9e55aa415ea90bcef8033892f6381402cb90b163
Author: Tobias Burnus <[email protected]>
Date:   Fri Sep 11 13:35:58 2026 +0200

    libgomp.texi: Add note to omp_control_tool routine
    
    libgomp/ChangeLog:
    
            * libgomp.texi (omp_control_tool): Add example interface for calling
            the tool with a passed argument from Fortran
---
 libgomp/libgomp.texi | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi
index 190872f299f..b3700d7f142 100644
--- a/libgomp/libgomp.texi
+++ b/libgomp/libgomp.texi
@@ -4476,6 +4476,37 @@ specification.  In older versions, the type @code{int} was used for the
 @item                   @tab @code{integer :: modifier}
 @end multitable
 
+@item @emph{Note}:
+In Fortran code, an argument can passed to the tool by creating a C wrapper
+function in the user code; however, as in GCC---and likely in most
+implementations---the C/C++ and Fortran use compatible integer kinds/types,
+it is simpler to add an INTERFACE block such as the following one.
+
+@smallexample
+interface
+  ! Or to permit using 'omp_control_tool' for both the two and
+  ! three argument version, use a generic interface; the two-
+  ! argument version comes from the 'omp_lib' module.
+!interface omp_control_tool
+
+  integer(omp_control_tool_result_kind) &
+  function omp_control_tool_arg (command, modifier, arg) &
+      bind(C, name="omp_control_tool")
+    use omp_lib
+    use iso_c_binding
+    integer(kind=omp_control_tool_kind), VALUE :: command
+    integer(c_int) :: modifier
+
+    ! Either
+    type(c_ptr), VALUE :: arg
+    ! or
+    !type(*), dimension(*) :: arg ! Note:
+    ! Avoid type(*) for 'type(c_ptr)' actual arguments as this will pass a
+    ! reference to the C pointer and not the C pointer itself.
+  end
+end interface
+@end smallexample
+
 @c @item @emph{See also}:
 
 @item @emph{Reference}:

Reply via email to