Index: flang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- flang/lib/Frontend/CompilerInvocation.cpp +++ flang/lib/Frontend/CompilerInvocation.cpp @@ -976,13 +976,49 @@ fortranOptions.isFixedForm = false; } +static void setOpenMPMacro(int version, + Fortran::parser::Options &fortranOptions) { + switch (version) { + case 20: + fortranOptions.predefinitions.emplace_back("_OPENMP", "200011"); + break; + case 25: + fortranOptions.predefinitions.emplace_back("_OPENMP", "200505"); + break; + case 30: + fortranOptions.predefinitions.emplace_back("_OPENMP", "200805"); + break; + case 31: + fortranOptions.predefinitions.emplace_back("_OPENMP", "201107"); + break; + case 40: + fortranOptions.predefinitions.emplace_back("_OPENMP", "201307"); + break; + case 45: + fortranOptions.predefinitions.emplace_back("_OPENMP", "201511"); + break; + case 50: + fortranOptions.predefinitions.emplace_back("_OPENMP", "201811"); + break; + case 51: + fortranOptions.predefinitions.emplace_back("_OPENMP", "202011"); + break; + case 52: + fortranOptions.predefinitions.emplace_back("_OPENMP", "202111"); + break; + case 11: + default: + fortranOptions.predefinitions.emplace_back("_OPENMP", "199911"); + break; + } +} + // TODO: When expanding this method, consider creating a dedicated API for // this. Also at some point we will need to differentiate between different // targets and add dedicated predefines for each. void CompilerInvocation::setDefaultPredefinitions() { auto &fortranOptions = getFortranOpts(); const auto &frontendOptions = getFrontendOpts(); - // Populate the macro list with version numbers and other predefinitions. fortranOptions.predefinitions.emplace_back("__flang__", "1"); fortranOptions.predefinitions.emplace_back("__flang_major__", @@ -999,7 +1035,7 @@ } if (frontendOptions.features.IsEnabled( Fortran::common::LanguageFeature::OpenMP)) { - fortranOptions.predefinitions.emplace_back("_OPENMP", "201511"); + setOpenMPMacro(getLangOpts().OpenMPVersion, fortranOptions); } llvm::Triple targetTriple{llvm::Triple(this->targetOpts.triple)}; if (targetTriple.getArch() == llvm::Triple::ArchType::x86_64) { Index: flang/test/Driver/bbc-openmp-version-macro.f90 =================================================================== --- /dev/null +++ flang/test/Driver/bbc-openmp-version-macro.f90 @@ -0,0 +1,32 @@ +! Test predefined _OPENMP macro which denotes OpenMP version + +! RUN: bbc -fopenmp -o - %s | FileCheck %s --check-prefix=DEFAULT-OPENMP-VERSION +! RUN: bbc -fopenmp -fopenmp-version=11 -o - %s | FileCheck %s --check-prefix=OPENMP-VERSION-11 +! RUN: bbc -fopenmp -fopenmp-version=11 -o - %s | FileCheck %s --check-prefix=OPENMP-VERSION-11 +! RUN: bbc -fopenmp -fopenmp-version=20 -o - %s | FileCheck %s --check-prefix=OPENMP-VERSION-20 +! RUN: bbc -fopenmp -fopenmp-version=25 -o - %s | FileCheck %s --check-prefix=OPENMP-VERSION-25 +! RUN: bbc -fopenmp -fopenmp-version=30 -o - %s | FileCheck %s --check-prefix=OPENMP-VERSION-30 +! RUN: bbc -fopenmp -fopenmp-version=31 -o - %s | FileCheck %s --check-prefix=OPENMP-VERSION-31 +! RUN: bbc -fopenmp -fopenmp-version=40 -o - %s | FileCheck %s --check-prefix=OPENMP-VERSION-40 +! RUN: bbc -fopenmp -fopenmp-version=45 -o - %s | FileCheck %s --check-prefix=OPENMP-VERSION-45 +! RUN: bbc -fopenmp -fopenmp-version=50 -o - %s | FileCheck %s --check-prefix=OPENMP-VERSION-50 +! RUN: bbc -fopenmp -fopenmp-version=51 -o - %s | FileCheck %s --check-prefix=OPENMP-VERSION-51 +! RUN: bbc -fopenmp -fopenmp-version=52 -o - %s | FileCheck %s --check-prefix=OPENMP-VERSION-52 + +! DEFAULT-OPENMP-VERSION: {{.*}} = arith.constant 199911 : i32 +! OPENMP-VERSION-11: {{.*}} = arith.constant 199911 : i32 +! OPENMP-VERSION-20: {{.*}} = arith.constant 200011 : i32 +! OPENMP-VERSION-25: {{.*}} = arith.constant 200505 : i32 +! OPENMP-VERSION-30: {{.*}} = arith.constant 200805 : i32 +! OPENMP-VERSION-31: {{.*}} = arith.constant 201107 : i32 +! OPENMP-VERSION-40: {{.*}} = arith.constant 201307 : i32 +! OPENMP-VERSION-45: {{.*}} = arith.constant 201511 : i32 +! OPENMP-VERSION-50: {{.*}} = arith.constant 201811 : i32 +! OPENMP-VERSION-51: {{.*}} = arith.constant 202011 : i32 +! OPENMP-VERSION-52: {{.*}} = arith.constant 202111 : i32 + +#if _OPENMP + integer :: var1 = _OPENMP +#endif +end program + Index: flang/test/Driver/flang-openmp-version-macro.f90 =================================================================== --- /dev/null +++ flang/test/Driver/flang-openmp-version-macro.f90 @@ -0,0 +1,32 @@ +! Test predefined _OPENMP macro which denotes OpenMP version + +! RUN: %flang_fc1 -fopenmp -cpp -E %s | FileCheck %s --check-prefix=DEFAULT-OPENMP-VERSION +! RUN: %flang_fc1 -fopenmp -fopenmp-version=11 -cpp -E %s | FileCheck %s --check-prefix=OPENMP-VERSION-11 +! RUN: %flang_fc1 -fopenmp -fopenmp-version=11 -cpp -E %s | FileCheck %s --check-prefix=OPENMP-VERSION-11 +! RUN: %flang_fc1 -fopenmp -fopenmp-version=20 -cpp -E %s | FileCheck %s --check-prefix=OPENMP-VERSION-20 +! RUN: %flang_fc1 -fopenmp -fopenmp-version=25 -cpp -E %s | FileCheck %s --check-prefix=OPENMP-VERSION-25 +! RUN: %flang_fc1 -fopenmp -fopenmp-version=30 -cpp -E %s | FileCheck %s --check-prefix=OPENMP-VERSION-30 +! RUN: %flang_fc1 -fopenmp -fopenmp-version=31 -cpp -E %s | FileCheck %s --check-prefix=OPENMP-VERSION-31 +! RUN: %flang_fc1 -fopenmp -fopenmp-version=40 -cpp -E %s | FileCheck %s --check-prefix=OPENMP-VERSION-40 +! RUN: %flang_fc1 -fopenmp -fopenmp-version=45 -cpp -E %s | FileCheck %s --check-prefix=OPENMP-VERSION-45 +! RUN: %flang_fc1 -fopenmp -fopenmp-version=50 -cpp -E %s | FileCheck %s --check-prefix=OPENMP-VERSION-50 +! RUN: %flang_fc1 -fopenmp -fopenmp-version=51 -cpp -E %s | FileCheck %s --check-prefix=OPENMP-VERSION-51 +! RUN: %flang_fc1 -fopenmp -fopenmp-version=52 -cpp -E %s | FileCheck %s --check-prefix=OPENMP-VERSION-52 + +! DEFAULT-OPENMP-VERSION: integer :: var1 = 199911 +! OPENMP-VERSION-11: integer :: var1 = 199911 +! OPENMP-VERSION-20: integer :: var1 = 200011 +! OPENMP-VERSION-25: integer :: var1 = 200505 +! OPENMP-VERSION-30: integer :: var1 = 200805 +! OPENMP-VERSION-31: integer :: var1 = 201107 +! OPENMP-VERSION-40: integer :: var1 = 201307 +! OPENMP-VERSION-45: integer :: var1 = 201511 +! OPENMP-VERSION-50: integer :: var1 = 201811 +! OPENMP-VERSION-51: integer :: var1 = 202011 +! OPENMP-VERSION-52: integer :: var1 = 202111 + +#if _OPENMP + integer :: var1 = _OPENMP +#endif +end program + Index: flang/tools/bbc/bbc.cpp =================================================================== --- flang/tools/bbc/bbc.cpp +++ flang/tools/bbc/bbc.cpp @@ -376,7 +376,39 @@ // enable parsing of OpenMP if (enableOpenMP) { options.features.Enable(Fortran::common::LanguageFeature::OpenMP); - options.predefinitions.emplace_back("_OPENMP", "201511"); + switch (setOpenMPVersion) { + case 20: + options.predefinitions.emplace_back("_OPENMP", "200011"); + break; + case 25: + options.predefinitions.emplace_back("_OPENMP", "200505"); + break; + case 30: + options.predefinitions.emplace_back("_OPENMP", "200805"); + break; + case 31: + options.predefinitions.emplace_back("_OPENMP", "201107"); + break; + case 40: + options.predefinitions.emplace_back("_OPENMP", "201307"); + break; + case 45: + options.predefinitions.emplace_back("_OPENMP", "201511"); + break; + case 50: + options.predefinitions.emplace_back("_OPENMP", "201811"); + break; + case 51: + options.predefinitions.emplace_back("_OPENMP", "202011"); + break; + case 52: + options.predefinitions.emplace_back("_OPENMP", "202111"); + break; + case 11: + default: + options.predefinitions.emplace_back("_OPENMP", "199911"); + break; + } } // enable parsing of OpenACC