[flang-commits] [flang] eef0210 - [Flang][Debug] Modifications for getting pathname
Kiran Chandramohan via flang-commits
flang-commits at lists.llvm.org
Thu Jan 19 09:02:13 PST 2023
Author: Kiran Chandramohan
Date: 2023-01-19T16:58:39Z
New Revision: eef0210706bc16ffde17d5b574799d8aae705790
URL: https://github.com/llvm/llvm-project/commit/eef0210706bc16ffde17d5b574799d8aae705790
DIFF: https://github.com/llvm/llvm-project/commit/eef0210706bc16ffde17d5b574799d8aae705790.diff
LOG: [Flang][Debug] Modifications for getting pathname
-> Use file pathname from the Flang frontend. It is the frontend
that is in-charge of finding the files and is hence the canonical
source for paths.
-> Convert pathname to absolute pathname while creating the moduleOp.
Co-authored-by: Peter Klausler <pklausler at nvidia.com>
Reviewed By: PeteSteinfeld, vzakhari, jeanPerier, awarzynski
Differential Revision: https://reviews.llvm.org/D141674
Added:
flang/test/Lower/module-debug-file-loc-linux.f90
Modified:
flang/include/flang/Lower/Bridge.h
flang/lib/Frontend/FrontendActions.cpp
flang/lib/Lower/Bridge.cpp
flang/tools/bbc/bbc.cpp
Removed:
################################################################################
diff --git a/flang/include/flang/Lower/Bridge.h b/flang/include/flang/Lower/Bridge.h
index 38109a37396c..dabbe72fc376 100644
--- a/flang/include/flang/Lower/Bridge.h
+++ b/flang/include/flang/Lower/Bridge.h
@@ -57,11 +57,10 @@ class LoweringBridge {
const Fortran::parser::AllCookedSources &allCooked,
llvm::StringRef triple, fir::KindMapping &kindMap,
const Fortran::lower::LoweringOptions &loweringOptions,
- const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults,
- llvm::StringRef filePath) {
+ const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults) {
return LoweringBridge(ctx, semanticsContext, defaultKinds, intrinsics,
targetCharacteristics, allCooked, triple, kindMap,
- loweringOptions, envDefaults, filePath);
+ loweringOptions, envDefaults);
}
//===--------------------------------------------------------------------===//
@@ -130,8 +129,7 @@ class LoweringBridge {
const Fortran::parser::AllCookedSources &cooked, llvm::StringRef triple,
fir::KindMapping &kindMap,
const Fortran::lower::LoweringOptions &loweringOptions,
- const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults,
- llvm::StringRef filePath);
+ const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults);
LoweringBridge() = delete;
LoweringBridge(const LoweringBridge &) = delete;
diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp
index 16badc769d90..d46d281f94da 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -171,8 +171,7 @@ bool CodeGenAction::beginSourceFileAction() {
ci.getInvocation().getSemanticsContext().targetCharacteristics(),
ci.getParsing().allCooked(), ci.getInvocation().getTargetOpts().triple,
kindMap, ci.getInvocation().getLoweringOpts(),
- ci.getInvocation().getFrontendOpts().envDefaults,
- getCurrentFileOrBufferName());
+ ci.getInvocation().getFrontendOpts().envDefaults);
// Fetch module from lb, so we can set
mlirModule = std::make_unique<mlir::ModuleOp>(lb.getModule());
@@ -698,8 +697,8 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) {
llvm::PassInstrumentationCallbacks pic;
llvm::PipelineTuningOptions pto;
std::optional<llvm::PGOOptions> pgoOpt;
- llvm::StandardInstrumentations si(
- llvmModule->getContext(), opts.DebugPassManager);
+ llvm::StandardInstrumentations si(llvmModule->getContext(),
+ opts.DebugPassManager);
si.registerCallbacks(pic, &fam);
llvm::PassBuilder pb(tm.get(), pto, pgoOpt, &pic);
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 9e5898e9db0e..783f77c10659 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -58,6 +58,8 @@
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/Path.h"
#include <optional>
#define DEBUG_TYPE "flang-lower-bridge"
@@ -3785,8 +3787,7 @@ Fortran::lower::LoweringBridge::LoweringBridge(
const Fortran::parser::AllCookedSources &cooked, llvm::StringRef triple,
fir::KindMapping &kindMap,
const Fortran::lower::LoweringOptions &loweringOptions,
- const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults,
- llvm::StringRef filePath)
+ const std::vector<Fortran::lower::EnvironmentDefault> &envDefaults)
: semanticsContext{semanticsContext}, defaultKinds{defaultKinds},
intrinsics{intrinsics}, targetCharacteristics{targetCharacteristics},
cooked{&cooked}, context{context}, kindMap{kindMap},
@@ -3814,10 +3815,30 @@ Fortran::lower::LoweringBridge::LoweringBridge(
return mlir::success();
});
+ auto getPathLocation = [&semanticsContext, &context]() -> mlir::Location {
+ std::optional<std::string> path;
+ const auto &allSources{semanticsContext.allCookedSources().allSources()};
+ if (auto initial{allSources.GetFirstFileProvenance()};
+ initial && !initial->empty()) {
+ if (const auto *sourceFile{allSources.GetSourceFile(initial->start())}) {
+ path = sourceFile->path();
+ }
+ }
+
+ if (path.has_value()) {
+ llvm::SmallString<256> curPath(*path);
+ llvm::sys::fs::make_absolute(curPath);
+ llvm::sys::path::remove_dots(curPath);
+ return mlir::FileLineColLoc::get(&context, curPath.str(), /*line=*/0,
+ /*col=*/0);
+ } else {
+ return mlir::UnknownLoc::get(&context);
+ }
+ };
+
// Create the module and attach the attributes.
module = std::make_unique<mlir::ModuleOp>(
- mlir::ModuleOp::create(mlir::FileLineColLoc::get(
- &getMLIRContext(), filePath, /*line=*/0, /*col=*/0)));
+ mlir::ModuleOp::create(getPathLocation()));
assert(module.get() && "module was not created");
fir::setTargetTriple(*module.get(), triple);
fir::setKindMapping(*module.get(), kindMap);
diff --git a/flang/test/Lower/module-debug-file-loc-linux.f90 b/flang/test/Lower/module-debug-file-loc-linux.f90
new file mode 100644
index 000000000000..4f773017096d
--- /dev/null
+++ b/flang/test/Lower/module-debug-file-loc-linux.f90
@@ -0,0 +1,14 @@
+! Test that the module has the location information
+
+! RUN: %flang_fc1 -mmlir --mlir-print-debuginfo -emit-fir -o - %s | FileCheck %s
+
+! REQUIRES: linux
+
+subroutine sb1()
+end subroutine
+
+! CHECK: module attributes
+! CHECK: func.func @_QPsb1() {
+! CHECK: }
+! CHECK: } loc(#[[MODULE_LOC:.*]])
+! CHECK: #[[MODULE_LOC]] = loc("/{{.*}}flang/test/Lower/module-debug-file-loc-linux.f90":0:0)
diff --git a/flang/tools/bbc/bbc.cpp b/flang/tools/bbc/bbc.cpp
index 289c5ad675a3..796e7faa2880 100644
--- a/flang/tools/bbc/bbc.cpp
+++ b/flang/tools/bbc/bbc.cpp
@@ -235,7 +235,7 @@ static mlir::LogicalResult convertFortranSourceToMLIR(
auto burnside = Fortran::lower::LoweringBridge::create(
ctx, semanticsContext, defKinds, semanticsContext.intrinsics(),
semanticsContext.targetCharacteristics(), parsing.allCooked(), "",
- kindMap, loweringOptions, {}, inputFilename);
+ kindMap, loweringOptions, {});
burnside.lower(parseTree, semanticsContext);
mlir::ModuleOp mlirModule = burnside.getModule();
std::error_code ec;
More information about the flang-commits
mailing list