| /* Check OMP_TARGET_OFFLOAD on systems with non-host devices but no executable |
| code due to -foffload=disable. |
| |
| Note: While one might expect that -foffload=disable implies no non-host |
| devices, libgomp actually detects the devices and only fails when trying to |
| run as no executable code is availale for that device. |
| (Without MANDATORY it simply uses host fallback, which should usually be fine |
| but might have issues in corner cases.) |
| |
| We have default-device-var = 0 (default but also explicitly set), which will |
| fail at runtime. For -foffload=disable without non-host devices, see |
| target-50.c testcase. */ |
| |
| /* { dg-do run { target offload_device } } */ |
| |
| /* { dg-additional-options "-foffload=disable" } */ |
| /* { dg-set-target-env-var OMP_TARGET_OFFLOAD "mandatory" } */ |
| /* { dg-set-target-env-var OMP_DEFAULT_DEVICE "0" } */ |
| /* { dg-set-target-env-var OMP_DISPLAY_ENV "true" } */ |
| |
| /* { dg-output ".*OMP_DEFAULT_DEVICE = '0'.*OMP_TARGET_OFFLOAD = 'MANDATORY'.*" } */ |
| |
| #include <omp.h> |
| |
| int |
| main () |
| { |
| int x; |
| /* We know that there are non-host devices. With GCC, we still find them as |
| available devices, hence, check for it. */ |
| if (omp_get_num_devices() <= 0) |
| __builtin_abort (); |
| |
| /* But due to -foffload=disable, there are no binary code for (default) device '0' */ |
| |
| /* { dg-output ".*libgomp: OMP_TARGET_OFFLOAD is set to MANDATORY, but device cannot be used for offloading.*" } */ |
| /* { dg-shouldfail "OMP_TARGET_OFFLOAD=mandatory and no binary code for a non-host device" } */ |
| #pragma omp target map(tofrom:x) |
| x = 5; |
| if (x != 5) |
| __builtin_abort (); |
| return 0; |
| } |