diff options
author | Hansang Bae <hansang.bae@intel.com> | 2019-05-30 18:35:07 +0000 |
---|---|---|
committer | Hansang Bae <hansang.bae@intel.com> | 2019-05-30 18:35:07 +0000 |
commit | 74db2a4213dd1f4d7b0056ebecbce6cfca3d3e30 (patch) | |
tree | 00ae7822eef2c07552d4614911e5920400f19919 /runtime | |
parent | 48eeef98d8147c59f9db18c8d7e646741c28f738 (diff) |
Fix OMP_TARGET_OFFLOAD parsing
Current parsing allows trailing string after the permitted value,
MANDATORY|DISABLED|DEFAULT -- e.g., "mandatorynot" is also recognized
as "MANDATORY". Such cases should be recognized as incorrect/unknown
value.
Differential Revision: https://reviews.llvm.org/D62431
git-svn-id: https://llvm.org/svn/llvm-project/openmp/trunk@362125 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/src/kmp_settings.cpp | 6 | ||||
-rw-r--r-- | runtime/test/env/omp_target_offload.c | 62 |
2 files changed, 65 insertions, 3 deletions
diff --git a/runtime/src/kmp_settings.cpp b/runtime/src/kmp_settings.cpp index 3f38bec..114cd9c 100644 --- a/runtime/src/kmp_settings.cpp +++ b/runtime/src/kmp_settings.cpp @@ -1250,11 +1250,11 @@ static void __kmp_stg_parse_target_offload(char const *name, char const *value, if (*next == '\0') return; scan = next; - if (__kmp_match_str("MANDATORY", scan, &next)) { + if (!__kmp_strcasecmp_with_sentinel("mandatory", scan, 0)) { __kmp_target_offload = tgt_mandatory; - } else if (__kmp_match_str("DISABLED", scan, &next)) { + } else if (!__kmp_strcasecmp_with_sentinel("disabled", scan, 0)) { __kmp_target_offload = tgt_disabled; - } else if (__kmp_match_str("DEFAULT", scan, &next)) { + } else if (!__kmp_strcasecmp_with_sentinel("default", scan, 0)) { __kmp_target_offload = tgt_default; } else { KMP_WARNING(SyntaxErrorUsing, name, "DEFAULT"); diff --git a/runtime/test/env/omp_target_offload.c b/runtime/test/env/omp_target_offload.c new file mode 100644 index 0000000..91ce108 --- /dev/null +++ b/runtime/test/env/omp_target_offload.c @@ -0,0 +1,62 @@ +// RUN: %libomp-compile-and-run +#include <string.h> +#include <stdlib.h> + +enum kmp_target_offload_kind { + tgt_disabled = 0, + tgt_default = 1, + tgt_mandatory = 2 +}; + +extern int __kmpc_get_target_offload(); + +const char *disabled_examples[] = { + // Allowed inputs + "disabled", "DISABLED", "Disabled", "dIsAbLeD", "DiSaBlEd"}; + +const char *default_examples[] = { + // Allowed inputs + "default", "DEFAULT", "Default", "deFAulT", "DEfaULt", + // These should be changed to default (failed match) + "mandatry", "defaults", "disable", "enabled", "mandatorynot"}; + +const char *mandatory_examples[] = { + // Allowed inputs + "mandatory", "MANDATORY", "Mandatory", "manDatoRy", "MANdATOry"}; + +// Return target-offload-var ICV +int get_target_offload_icv() { +#pragma omp parallel + {} + return __kmpc_get_target_offload(); +} + +int main() { + int i; + const char *omp_target_offload = "OMP_TARGET_OFFLOAD="; + char buf[80]; + + for (i = 0; i < sizeof(disabled_examples) / sizeof(char *); ++i) { + strcpy(buf, omp_target_offload); + strcat(buf, disabled_examples[i]); + kmp_set_defaults(buf); + if (tgt_disabled != get_target_offload_icv()) + return EXIT_FAILURE; + } + for (i = 0; i < sizeof(default_examples) / sizeof(char *); ++i) { + strcpy(buf, omp_target_offload); + strcat(buf, default_examples[i]); + kmp_set_defaults(buf); + if (tgt_default != get_target_offload_icv()) + return EXIT_FAILURE; + } + for (i = 0; i < sizeof(mandatory_examples) / sizeof(char *); ++i) { + strcpy(buf, omp_target_offload); + strcat(buf, mandatory_examples[i]); + kmp_set_defaults(buf); + if (tgt_mandatory != get_target_offload_icv()) + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} |