diff options
| author | Paul-Antoine Arras <parras@baylibre.com> | 2025-03-13 17:16:41 +0100 |
|---|---|---|
| committer | Paul-Antoine Arras <parras@baylibre.com> | 2025-03-21 19:24:16 +0100 |
| commit | 99e2906ae255fc7b8edb008d7cd47b28b078a809 (patch) | |
| tree | aa20eea780d8962d8be0da6122795911e7376390 /libgomp/libgomp-plugin.h | |
| parent | f45d14b495d603b8d5fbdffe6fced03cb3e2fc10 (diff) | |
OpenMP: 'interop' construct - add ME support + target-independent libgomp
This patch partially enables use of the OpenMP interop construct by adding
middle end support, mostly in the omplower pass, and in the target-independent
part of the libgomp runtime. It follows up on previous patches for C, C++ and
Fortran front ends support. The full interop feature requires another patch to
enable foreign runtime support in libgomp plugins.
gcc/ChangeLog:
* builtin-types.def
(BT_FN_VOID_INT_INT_PTR_PTR_PTR_INT_PTR_INT_PTR_UINT_PTR): New.
* gimple-low.cc (lower_stmt): Handle GIMPLE_OMP_INTEROP.
* gimple-pretty-print.cc (dump_gimple_omp_interop): New function.
(pp_gimple_stmt_1): Handle GIMPLE_OMP_INTEROP.
* gimple.cc (gimple_build_omp_interop): New function.
(gimple_copy): Handle GIMPLE_OMP_INTEROP.
* gimple.def (GIMPLE_OMP_INTEROP): Define.
* gimple.h (gimple_build_omp_interop): Declare.
(gimple_omp_interop_clauses): New function.
(gimple_omp_interop_clauses_ptr): Likewise.
(gimple_omp_interop_set_clauses): Likewise.
(gimple_return_set_retval): Handle GIMPLE_OMP_INTEROP.
* gimplify.cc (gimplify_scan_omp_clauses): Handle OMP_CLAUSE_INIT,
OMP_CLAUSE_USE and OMP_CLAUSE_DESTROY.
(gimplify_omp_interop): New function.
(gimplify_expr): Replace sorry with call to gimplify_omp_interop.
* omp-builtins.def (BUILT_IN_GOMP_INTEROP): Define.
* omp-low.cc (scan_sharing_clauses): Handle OMP_CLAUSE_INIT,
OMP_CLAUSE_USE and OMP_CLAUSE_DESTROY.
(scan_omp_1_stmt): Handle GIMPLE_OMP_INTEROP.
(lower_omp_interop_action_clauses): New function.
(lower_omp_interop): Likewise.
(lower_omp_1): Handle GIMPLE_OMP_INTEROP.
gcc/c/ChangeLog:
* c-parser.cc (c_parser_omp_clause_destroy): Make addressable.
(c_parser_omp_clause_init): Make addressable.
gcc/cp/ChangeLog:
* parser.cc (cp_parser_omp_clause_init): Make addressable.
gcc/fortran/ChangeLog:
* trans-openmp.cc (gfc_trans_omp_clauses): Make OMP_CLAUSE_DESTROY and
OMP_CLAUSE_INIT addressable.
* types.def (BT_FN_VOID_INT_INT_PTR_PTR_PTR_INT_PTR_INT_PTR_UINT_PTR):
New.
include/ChangeLog:
* gomp-constants.h (GOMP_DEVICE_DEFAULT_OMP_61, GOMP_INTEROP_TARGET,
GOMP_INTEROP_TARGETSYNC, GOMP_INTEROP_FLAG_NOWAIT): Define.
libgomp/ChangeLog:
* icv-device.c (omp_set_default_device): Check
GOMP_DEVICE_DEFAULT_OMP_61.
* libgomp-plugin.h (struct interop_obj_t): New.
(enum gomp_interop_flag): New.
(GOMP_OFFLOAD_interop): Declare.
(GOMP_OFFLOAD_get_interop_int): Declare.
(GOMP_OFFLOAD_get_interop_ptr): Declare.
(GOMP_OFFLOAD_get_interop_str): Declare.
(GOMP_OFFLOAD_get_interop_type_desc): Declare.
* libgomp.h (_LIBGOMP_OMP_LOCK_DEFINED): Define.
(struct gomp_device_descr): Add interop_func, get_interop_int_func,
get_interop_ptr_func, get_interop_str_func, get_interop_type_desc_func.
* libgomp.map: Add GOMP_interop.
* libgomp_g.h (GOMP_interop): Declare.
* target.c (resolve_device): Handle GOMP_DEVICE_DEFAULT_OMP_61.
(omp_get_interop_int): Replace stub with actual implementation.
(omp_get_interop_ptr): Likewise.
(omp_get_interop_str): Likewise.
(omp_get_interop_type_desc): Likewise.
(struct interop_data_t): Define.
(gomp_interop_internal): New function.
(GOMP_interop): Likewise.
(gomp_load_plugin_for_device): Load symbols for get_interop_int,
get_interop_ptr, get_interop_str and get_interop_type_desc.
* testsuite/libgomp.c-c++-common/interop-1.c: New test.
gcc/testsuite/ChangeLog:
* c-c++-common/gomp/interop-1.c: Remove dg-prune-output "sorry".
* c-c++-common/gomp/interop-2.c: Likewise.
* c-c++-common/gomp/interop-3.c: Likewise.
* c-c++-common/gomp/interop-4.c: Remove dg-message "not supported".
* g++.dg/gomp/interop-5.C: Likewise.
* gfortran.dg/gomp/interop-4.f90: Likewise.
* c-c++-common/gomp/interop-5.c: New test.
* gfortran.dg/gomp/interop-5.f90: New test.
Co-authored-by: Tobias Burnus <tburnus@baylibre.com>
Diffstat (limited to 'libgomp/libgomp-plugin.h')
| -rw-r--r-- | libgomp/libgomp-plugin.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/libgomp/libgomp-plugin.h b/libgomp/libgomp-plugin.h index 62bf43da937..924fc1f44b1 100644 --- a/libgomp/libgomp-plugin.h +++ b/libgomp/libgomp-plugin.h @@ -33,6 +33,14 @@ #include <stddef.h> #include <stdint.h> +#ifdef _LIBGOMP_PLUGIN_INCLUDE + /* Include 'omp.h' for the interop definitions. */ + #define _LIBGOMP_OMP_LOCK_DEFINED 1 + typedef struct omp_lock_t omp_lock_t; + typedef struct omp_nest_lock_t omp_nest_lock_t; + #include "omp.h.in" +#endif + #ifdef __cplusplus extern "C" { #endif @@ -101,6 +109,25 @@ struct addr_pair uintptr_t end; }; + +#ifdef _LIBGOMP_OMP_LOCK_DEFINED +/* Only define when omp.h.in was included, as in plugin/ and in libgomp.h. */ +struct interop_obj_t +{ + void *stream; + void *device_data; + omp_interop_fr_t fr; + int device_num; +}; + +enum gomp_interop_flag +{ + gomp_interop_flag_init, + gomp_interop_flag_use, + gomp_interop_flag_destroy +}; +#endif + /* This following symbol is used to name the target side variable struct that holds the designated ICVs of the target device. The symbol needs to be available to libgomp code and the offload plugin (which in the latter case @@ -181,6 +208,23 @@ extern int GOMP_OFFLOAD_openacc_cuda_set_stream (struct goacc_asyncqueue *, extern union goacc_property_value GOMP_OFFLOAD_openacc_get_property (int, enum goacc_property); +#ifdef _LIBGOMP_OMP_LOCK_DEFINED +/* Only define when omp.h.in was included, as in plugin/ and in libgomp.h. */ +extern void GOMP_OFFLOAD_interop (struct interop_obj_t *, int, + enum gomp_interop_flag, bool, const char *); +extern intptr_t GOMP_OFFLOAD_get_interop_int (struct interop_obj_t *, + omp_interop_property_t, + omp_interop_rc_t *); +extern void *GOMP_OFFLOAD_get_interop_ptr (struct interop_obj_t *, + omp_interop_property_t, + omp_interop_rc_t *); +extern const char *GOMP_OFFLOAD_get_interop_str (struct interop_obj_t *obj, + omp_interop_property_t, + omp_interop_rc_t *); +extern const char *GOMP_OFFLOAD_get_interop_type_desc (struct interop_obj_t *, + omp_interop_property_t); +#endif + #ifdef __cplusplus } #endif |
