aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r--flang/lib/Frontend/CompilerInvocation.cpp41
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;
}