[flang-commits] [flang] [flang][debug] Handle 'used' module. (PR #107626)
via flang-commits
flang-commits at lists.llvm.org
Tue Sep 10 01:49:02 PDT 2024
================
@@ -152,6 +156,44 @@ mlir::LLVM::DIModuleAttr AddDebugInfoPass::getOrCreateModuleAttr(
return modAttr;
}
+/// If globalOp represents a module variable, return a ModuleAttr that
+/// represents that module.
+std::optional<mlir::LLVM::DIModuleAttr>
+AddDebugInfoPass::getModuleAttrFromGlobalOp(fir::GlobalOp globalOp,
+ mlir::LLVM::DIFileAttr fileAttr,
+ mlir::LLVM::DIScopeAttr scope) {
+ mlir::MLIRContext *context = &getContext();
+ mlir::OpBuilder builder(context);
+
+ std::pair result = fir::NameUniquer::deconstruct(globalOp.getSymName());
+ // Only look for module if this variable is not part of a function.
+ if (!result.second.procs.empty() || result.second.modules.empty())
+ return std::nullopt;
+
+ // DWARF5 says following about the fortran modules:
+ // A Fortran 90 module may also be represented by a module entry
+ // (but no declaration attribute is warranted because Fortran has no concept
+ // of a corresponding module body).
+ // But in practice, compilers use declaration attribute with a module in cases
+ // where module was defined in another source file (only being used in this
+ // one). The isInitialized() seems to provide the right information
+ // but inverted. It is true where module is actually defined but false where
+ // it is used.
+ // FIXME: Currently we don't have the line number on which a module was
+ // declared. We are using a best guess of line - 1 where line is the source
+ // line of the first member of the module that we encounter.
+ unsigned line = getLineFromLoc(globalOp.getLoc());
+
+ mlir::LLVM::DISubprogramAttr sp =
+ mlir::dyn_cast_if_present<mlir::LLVM::DISubprogramAttr>(scope);
+ // Modules are generated at compile unit scope
+ if (sp)
+ scope = sp.getCompileUnit();
+
+ return getOrCreateModuleAttr(result.second.modules[0], fileAttr, scope,
+ line - 1, !globalOp.isInitialized());
----------------
jeanPerier wrote:
`line-1` could be 0 if the variable name appeared on the first line of the file as below. It may be best to use `std::max(line - 1, 1)` to avoid troubles.
```
use m, only : x
call bar(x)
end
```
https://github.com/llvm/llvm-project/pull/107626
More information about the flang-commits
mailing list