Index: openmp/trunk/runtime/src/dllexports =================================================================== --- openmp/trunk/runtime/src/dllexports +++ openmp/trunk/runtime/src/dllexports @@ -403,6 +403,7 @@ %ifdef OMP_45 __kmpc_task_reduction_init 268 __kmpc_task_reduction_get_th_data 269 + __kmpc_get_target_offload 271 %endif %endif Index: openmp/trunk/runtime/src/kmp.h =================================================================== --- openmp/trunk/runtime/src/kmp.h +++ openmp/trunk/runtime/src/kmp.h @@ -3813,6 +3813,18 @@ KMP_EXPORT void KMPC_CONVENTION kmpc_set_defaults(char const *); KMP_EXPORT void KMPC_CONVENTION kmpc_set_disp_num_buffers(int); +#if OMP_50_ENABLED +enum kmp_target_offload_kind { + tgt_disabled = 0, + tgt_default = 1, + tgt_mandatory = 2 +}; +typedef enum kmp_target_offload_kind kmp_target_offload_kind_t; +// Set via OMP_TARGET_OFFLOAD if specified, defaults to tgt_default otherwise +extern kmp_target_offload_kind_t __kmp_target_offload; +extern int __kmpc_get_target_offload(); +#endif + #ifdef __cplusplus } #endif Index: openmp/trunk/runtime/src/kmp_csupport.cpp =================================================================== --- openmp/trunk/runtime/src/kmp_csupport.cpp +++ openmp/trunk/runtime/src/kmp_csupport.cpp @@ -4065,4 +4065,8 @@ } #endif +#if OMP_50_ENABLED +int __kmpc_get_target_offload(void) { return __kmp_target_offload; } +#endif // OMP_50_ENABLED + // end of file // Index: openmp/trunk/runtime/src/kmp_global.cpp =================================================================== --- openmp/trunk/runtime/src/kmp_global.cpp +++ openmp/trunk/runtime/src/kmp_global.cpp @@ -502,4 +502,7 @@ int _You_must_link_with_Microsoft_OpenMP_library = 1; #endif +#if OMP_50_ENABLED +kmp_target_offload_kind_t __kmp_target_offload = tgt_default; +#endif // end of file // Index: openmp/trunk/runtime/src/kmp_settings.cpp =================================================================== --- openmp/trunk/runtime/src/kmp_settings.cpp +++ openmp/trunk/runtime/src/kmp_settings.cpp @@ -1179,6 +1179,46 @@ } // __kmp_stg_print_default_device #endif +#if OMP_50_ENABLED +// ----------------------------------------------------------------------------- +// OpenMP 5.0: OMP_TARGET_OFFLOAD +static void __kmp_stg_parse_target_offload(char const *name, char const *value, + void *data) { + const char *next = value; + const char *scan = next; + + __kmp_target_offload = tgt_default; + SKIP_WS(next); + if (*next == '\0') + return; + scan = next; + if (__kmp_match_str("MANDATORY", scan, &next)) { + __kmp_target_offload = tgt_mandatory; + } else if (__kmp_match_str("DISABLED", scan, &next)) { + __kmp_target_offload = tgt_disabled; + } else if (__kmp_match_str("DEFAULT", scan, &next)) { + __kmp_target_offload = tgt_default; + } else { + KMP_WARNING(SyntaxErrorUsing, name, "DEFAULT"); + } + +} // __kmp_stg_parse_target_offload + +static void __kmp_stg_print_target_offload(kmp_str_buf_t *buffer, + char const *name, void *data) { + const char *value = NULL; + if (__kmp_target_offload == tgt_default) + value = "DEFAULT"; + else if (__kmp_target_offload == tgt_mandatory) + value = "MANDATORY"; + else if (__kmp_target_offload == tgt_disabled) + value = "DISABLED"; + if (value) { + __kmp_str_buf_print(buffer, " %s=%s\n", name, value); + } +} // __kmp_stg_print_target_offload +#endif + #if OMP_45_ENABLED // ----------------------------------------------------------------------------- // OpenMP 4.5: OMP_MAX_TASK_PRIORITY @@ -4443,6 +4483,10 @@ {"OMP_DEFAULT_DEVICE", __kmp_stg_parse_default_device, __kmp_stg_print_default_device, NULL, 0, 0}, #endif +#if OMP_50_ENABLED + {"OMP_TARGET_OFFLOAD", __kmp_stg_parse_target_offload, + __kmp_stg_print_target_offload, NULL, 0, 0}, +#endif #if OMP_45_ENABLED {"OMP_MAX_TASK_PRIORITY", __kmp_stg_parse_max_task_priority, __kmp_stg_print_max_task_priority, NULL, 0, 0},