diff options
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | flang/lib/Frontend/CompilerInvocation.cpp | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 445feaa..078cb95 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -7,7 +7,9 @@ //===----------------------------------------------------------------------===// #include "flang/Frontend/CompilerInvocation.h" +#include "flang/Common/Fortran-features.h" #include "flang/Frontend/PreprocessorOptions.h" +#include "flang/Semantics/semantics.h" #include "flang/Version.inc" #include "clang/Basic/AllDiagnostics.h" #include "clang/Basic/DiagnosticDriver.h" @@ -21,6 +23,7 @@ #include "llvm/Option/OptTable.h" #include "llvm/Support/Process.h" #include "llvm/Support/raw_ostream.h" +#include <memory> using namespace Fortran::frontend; @@ -196,6 +199,14 @@ static InputKind ParseFrontendArgs(FrontendOptions &opts, opts.fixedFormColumns_ = columns; } } + + // Extensions + if (args.hasArg(clang::driver::options::OPT_fopenacc)) { + opts.features_.Enable(Fortran::common::LanguageFeature::OpenACC); + } + if (args.hasArg(clang::driver::options::OPT_fopenmp)) { + opts.features_.Enable(Fortran::common::LanguageFeature::OpenMP); + } return dashX; } @@ -322,6 +333,7 @@ void CompilerInvocation::SetDefaultFortranOpts() { // TODO: When expanding this list of standard predefinitions, consider // creating a dedicated API for this. Also at some point we will need to // differentiate between different targets. + // TODO: Move to setDefaultPredefinitions fortranOptions.predefinitions.emplace_back("__flang__", "1"); fortranOptions.predefinitions.emplace_back( "__flang_major__", FLANG_VERSION_MAJOR_STRING); @@ -331,6 +343,21 @@ void CompilerInvocation::SetDefaultFortranOpts() { "__flang_patchlevel__", FLANG_VERSION_PATCHLEVEL_STRING); } +void CompilerInvocation::setDefaultPredefinitions() { + auto &fortranOptions = fortranOpts(); + const auto &frontendOptions = frontendOpts(); + + // Add predefinitions based on extensions enabled + if (frontendOptions.features_.IsEnabled( + Fortran::common::LanguageFeature::OpenACC)) { + fortranOptions.predefinitions.emplace_back("_OPENACC", "202011"); + } + if (frontendOptions.features_.IsEnabled( + Fortran::common::LanguageFeature::OpenMP)) { + fortranOptions.predefinitions.emplace_back("_OPENMP", "201511"); + } +} + void CompilerInvocation::setFortranOpts() { auto &fortranOptions = fortranOpts(); const auto &frontendOptions = frontendOpts(); @@ -343,6 +370,8 @@ void CompilerInvocation::setFortranOpts() { } fortranOptions.fixedFormColumns = frontendOptions.fixedFormColumns_; + fortranOptions.features = frontendOptions.features_; + collectMacroDefinitions(preprocessorOptions, fortranOptions); fortranOptions.searchDirectories.insert( @@ -357,10 +386,14 @@ void CompilerInvocation::setFortranOpts() { } void CompilerInvocation::setSemanticsOpts( - Fortran::semantics::SemanticsContext &semaCtxt) { - auto &fortranOptions = fortranOpts(); + Fortran::parser::AllCookedSources &allCookedSources) { + const auto &fortranOptions = fortranOpts(); + + semanticsContext_ = std::make_unique<semantics::SemanticsContext>( + *(new Fortran::common::IntrinsicTypeDefaultKinds()), + fortranOptions.features, allCookedSources); + auto &moduleDirJ = moduleDir(); - semaCtxt.set_moduleDirectory(moduleDirJ) + semanticsContext_->set_moduleDirectory(moduleDirJ) .set_searchDirectories(fortranOptions.searchDirectories); - return; } |