[flang][driver] Add support for `-fget-symbols-sources`
Adds support for `-fget-symbols-sources` in the new Flang driver. All
relevant tests are updated to use the new driver when
`FLANG_BUILD_NEW_DRIVER` is set.
`RUN` lines in tests are updated so `-fsyntax-only`
comes before `-fget-symbols-sources`. That's because:
* both `-fsyntax-only` and `-fget-symbols-sources` are
action flags, and
* the new driver, flang-new, will only consider the right-most
action flag.
In other words, this change is needed so that the tests work with both
`f18` (requires both flags) and `flang-new` (only considers the last
action flag).
Differential Revision: https://reviews.llvm.org/D98191
GitOrigin-RevId: eefda605fe1701937a8fe5379357e0990ad2fb4e
diff --git a/include/flang/Frontend/FrontendActions.h b/include/flang/Frontend/FrontendActions.h
index 35d1e6f..f49f9f4 100644
--- a/include/flang/Frontend/FrontendActions.h
+++ b/include/flang/Frontend/FrontendActions.h
@@ -100,6 +100,10 @@
void ExecuteAction() override;
};
+class GetSymbolsSourcesAction : public PrescanAndSemaAction {
+ void ExecuteAction() override;
+};
+
class ParseSyntaxOnlyAction : public PrescanAndSemaAction {
void ExecuteAction() override;
};
diff --git a/include/flang/Frontend/FrontendOptions.h b/include/flang/Frontend/FrontendOptions.h
index 48182f4..1d90023 100644
--- a/include/flang/Frontend/FrontendOptions.h
+++ b/include/flang/Frontend/FrontendOptions.h
@@ -58,7 +58,10 @@
DebugMeasureParseTree,
/// Parse, run semantics and then output the pre-FIR tree
- DebugPreFIRTree
+ DebugPreFIRTree,
+
+ /// Parse, run semantics and then dump symbol sources map
+ GetSymbolsSources
/// TODO: RunPreprocessor, EmitLLVM, EmitLLVMOnly,
/// EmitCodeGenOnly, EmitAssembly, (...)
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index 1271cd3..d2318d3 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -143,6 +143,9 @@
case clang::driver::options::OPT_fdebug_pre_fir_tree:
opts.programAction_ = DebugPreFIRTree;
break;
+ case clang::driver::options::OPT_fget_symbols_sources:
+ opts.programAction_ = GetSymbolsSources;
+ break;
// TODO:
// case calng::driver::options::OPT_emit_llvm:
diff --git a/lib/Frontend/FrontendActions.cpp b/lib/Frontend/FrontendActions.cpp
index ea283fe..1871a35 100644
--- a/lib/Frontend/FrontendActions.cpp
+++ b/lib/Frontend/FrontendActions.cpp
@@ -16,6 +16,7 @@
#include "flang/Parser/provenance.h"
#include "flang/Parser/source.h"
#include "flang/Parser/unparse.h"
+#include "flang/Semantics/runtime-type-info.h"
#include "flang/Semantics/semantics.h"
#include "flang/Semantics/unparse-with-symbols.h"
#include "llvm/ADT/StringRef.h"
@@ -314,6 +315,15 @@
ci.parsing().DumpParsingLog(llvm::outs());
}
+void GetSymbolsSourcesAction::ExecuteAction() {
+ // Report and exit if fatal semantic errors are present
+ if (reportFatalSemanticErrors(semantics(), this->instance().diagnostics(),
+ GetCurrentFileOrBufferName()))
+ return;
+
+ semantics().DumpSymbolsSources(llvm::outs());
+}
+
void EmitObjAction::ExecuteAction() {
CompilerInstance &ci = this->instance();
unsigned DiagID = ci.diagnostics().getCustomDiagID(
diff --git a/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/lib/FrontendTool/ExecuteCompilerInvocation.cpp
index 041e79b..2a08e38 100644
--- a/lib/FrontendTool/ExecuteCompilerInvocation.cpp
+++ b/lib/FrontendTool/ExecuteCompilerInvocation.cpp
@@ -61,6 +61,9 @@
case DebugPreFIRTree:
return std::make_unique<DebugPreFIRTreeAction>();
break;
+ case GetSymbolsSources:
+ return std::make_unique<GetSymbolsSourcesAction>();
+ break;
default:
break;
// TODO:
diff --git a/test/Driver/driver-help.f90 b/test/Driver/driver-help.f90
index c329754..0c7e37f 100644
--- a/test/Driver/driver-help.f90
+++ b/test/Driver/driver-help.f90
@@ -80,6 +80,7 @@
! HELP-FC1-NEXT: -ffixed-line-length=<value>
! HELP-FC1-NEXT: Use <value> as character line width in fixed mode
! HELP-FC1-NEXT: -ffree-form Process source files in free form
+! HELP-FC1-NEXT: -fget-symbols-sources Dump symbols and their source code locations
! HELP-FC1-NEXT: -fimplicit-none No implicit typing allowed unless overridden by IMPLICIT statements
! HELP-FC1-NEXT: -finput-charset=<value> Specify the default character set for source files
! HELP-FC1-NEXT: -flarge-sizes Use INTEGER(KIND=8) for the result type in size-related intrinsics
diff --git a/test/Semantics/getsymbols01.f90 b/test/Semantics/getsymbols01.f90
index d26aa77..9a52ee7 100644
--- a/test/Semantics/getsymbols01.f90
+++ b/test/Semantics/getsymbols01.f90
@@ -15,7 +15,7 @@
end function
end module
-! RUN: %f18 -fget-symbols-sources -fsyntax-only %s 2>&1 | FileCheck %s
+! RUN: %flang_fc1 -fsyntax-only -fget-symbols-sources %s 2>&1 | FileCheck %s
! CHECK-COUNT-1:f:{{.*}}getsymbols01.f90, 12, 26-27
! CHECK-COUNT-1:mm1:{{.*}}getsymbols01.f90, 2, 8-11
! CHECK-COUNT-1:s:{{.*}}getsymbols01.f90, 5, 18-19
diff --git a/test/Semantics/getsymbols02.f90 b/test/Semantics/getsymbols02.f90
index 1667548..3292990 100644
--- a/test/Semantics/getsymbols02.f90
+++ b/test/Semantics/getsymbols02.f90
@@ -7,8 +7,8 @@
i = callget5()
ENDPROGRAM
-! RUN: %f18 -fsyntax-only %S/Inputs/getsymbols02-a.f90
-! RUN: %f18 -fsyntax-only %S/Inputs/getsymbols02-b.f90
-! RUN: %f18 -fget-symbols-sources -fsyntax-only %s 2>&1 | FileCheck %s
+! RUN: %flang_fc1 -fsyntax-only %S/Inputs/getsymbols02-a.f90
+! RUN: %flang_fc1 -fsyntax-only %S/Inputs/getsymbols02-b.f90
+! RUN: %flang_fc1 -fsyntax-only -fget-symbols-sources %s 2>&1 | FileCheck %s
! CHECK: callget5: .{{[/\\]}}mm2b.mod,
! CHECK: get5: .{{[/\\]}}mm2a.mod,
diff --git a/test/Semantics/getsymbols03-a.f90 b/test/Semantics/getsymbols03-a.f90
index fddf513..0bc19b4 100644
--- a/test/Semantics/getsymbols03-a.f90
+++ b/test/Semantics/getsymbols03-a.f90
@@ -7,7 +7,7 @@
x = f
end program
-! RUN: %f18 -fget-symbols-sources -fsyntax-only %s 2>&1 | FileCheck %s
+! RUN: %flang_fc1 -fsyntax-only -fget-symbols-sources %s 2>&1 | FileCheck %s
! CHECK:f:{{.*}}getsymbols03-b.f90, 2, 12-13
! CHECK:main:{{.*}}getsymbols03-a.f90, 4, 9-13
! CHECK:mm3:{{.*}}getsymbols03-a.f90, 5, 6-9
diff --git a/test/Semantics/getsymbols04.f90 b/test/Semantics/getsymbols04.f90
index ac8f2d0..28027ea 100644
--- a/test/Semantics/getsymbols04.f90
+++ b/test/Semantics/getsymbols04.f90
@@ -6,7 +6,7 @@
x = y
end program
-! RUN: %f18 -fget-symbols-sources -fsyntax-only %s 2>&1 | FileCheck %s
+! RUN: %flang_fc1 -fsyntax-only -fget-symbols-sources %s 2>&1 | FileCheck %s
! CHECK:x:{{.*}}getsymbols04.f90, 3, 14-15
! CHECK:x:{{.*}}getsymbols04.f90, 5, 11-12
! CHECK:y:{{.*}}getsymbols04.f90, 4, 14-15
diff --git a/test/Semantics/getsymbols05.f90 b/test/Semantics/getsymbols05.f90
index 6b07678..99771e2 100644
--- a/test/Semantics/getsymbols05.f90
+++ b/test/Semantics/getsymbols05.f90
@@ -9,7 +9,7 @@
x = y
end program
-! RUN: %f18 -fget-symbols-sources -fsyntax-only %s 2>&1 | FileCheck %s
+! RUN: %flang_fc1 -fsyntax-only -fget-symbols-sources %s 2>&1 | FileCheck %s
! CHECK:x:{{.*}}getsymbols05.f90, 3, 14-15
! CHECK:x:{{.*}}getsymbols05.f90, 6, 16-17
! CHECK:y:{{.*}}getsymbols05.f90, 4, 14-15