[flang][fir] Add support to mangle/deconstruct namelist group name
authorValentin Clement <clementval@gmail.com>
Fri, 24 Sep 2021 12:05:23 +0000 (14:05 +0200)
committerValentin Clement <clementval@gmail.com>
Fri, 24 Sep 2021 12:06:08 +0000 (14:06 +0200)
Add support to create unique name for namelist group and be able to
deconstruct them.

This patch is part of the upstreaming effort from fir-dev branch.

Reviewed By: jeanPerier

Differential Revision: https://reviews.llvm.org/D110331

Co-authored-by: Jean Perier <jperier@nvidia.com>
Co-authored-by: Eric Schweitz <eschweitz@nvidia.com>
flang/include/flang/Optimizer/Support/InternalNames.h
flang/lib/Lower/Mangler.cpp
flang/lib/Optimizer/Support/InternalNames.cpp
flang/unittests/Optimizer/InternalNamesTest.cpp

index fa98cc2..36e3ed0 100644 (file)
@@ -41,7 +41,8 @@ struct NameUniquer {
     INTRINSIC_TYPE_DESC,
     PROCEDURE,
     TYPE_DESC,
-    VARIABLE
+    VARIABLE,
+    NAMELIST_GROUP
   };
 
   /// Components of an unparsed unique name
@@ -112,6 +113,11 @@ struct NameUniquer {
                                 llvm::Optional<llvm::StringRef> host,
                                 llvm::StringRef name);
 
+  /// Unique a namelist group name
+  static std::string doNamelistGroup(llvm::ArrayRef<llvm::StringRef> modules,
+                                     llvm::Optional<llvm::StringRef> host,
+                                     llvm::StringRef name);
+
   /// Entry point for the PROGRAM (called by the runtime)
   /// Can be overridden with the `--main-entry-name=<name>` option.
   static llvm::StringRef doProgramEntry();
index 07d9e63..f74afc5 100644 (file)
@@ -114,6 +114,12 @@ Fortran::lower::mangle::mangleName(const Fortran::semantics::Symbol &symbol,
                                                   symbolName);
             return fir::NameUniquer::doVariable(modNames, optHost, symbolName);
           },
+          [&](const Fortran::semantics::NamelistDetails &) {
+            auto modNames = moduleNames(ultimateSymbol);
+            auto optHost = hostName(ultimateSymbol);
+            return fir::NameUniquer::doNamelistGroup(modNames, optHost,
+                                                     symbolName);
+          },
           [&](const Fortran::semantics::CommonBlockDetails &) {
             return fir::NameUniquer::doCommonBlock(symbolName);
           },
index a7493d7..bd28163 100644 (file)
@@ -205,6 +205,15 @@ fir::NameUniquer::doVariable(llvm::ArrayRef<llvm::StringRef> modules,
   return result.append(toLower(name));
 }
 
+std::string
+fir::NameUniquer::doNamelistGroup(llvm::ArrayRef<llvm::StringRef> modules,
+                                  llvm::Optional<llvm::StringRef> host,
+                                  llvm::StringRef name) {
+  std::string result = prefix();
+  result.append(doModulesHost(modules, host)).append("G");
+  return result.append(toLower(name));
+}
+
 llvm::StringRef fir::NameUniquer::doProgramEntry() {
   if (mainEntryName.size())
     return mainEntryName;
@@ -279,6 +288,10 @@ fir::NameUniquer::deconstruct(llvm::StringRef uniq) {
         else
           kinds.push_back(readInt(uniq, i, i + 1, end));
         break;
+      case 'G':
+        nk = NameKind::NAMELIST_GROUP;
+        name = readName(uniq, i, i + 1, end);
+        break;
 
       default:
         assert(false && "unknown uniquing code");
index 831d799..1a83766 100644 (file)
@@ -162,6 +162,12 @@ TEST(InternalNamesTest, doProgramEntry) {
   ASSERT_EQ(actual.str(), expectedMangledName);
 }
 
+TEST(InternalNamesTest, doNamelistGroup) {
+  llvm::StringRef actual = NameUniquer::doNamelistGroup({"mod1"}, {}, {"nlg"});
+  std::string expectedMangledName = "_QMmod1Gnlg";
+  ASSERT_EQ(actual, expectedMangledName);
+}
+
 TEST(InternalNamesTest, deconstructTest) {
   std::pair actual = NameUniquer::deconstruct("_QBhello");
   auto expectedNameKind = NameUniquer::NameKind::COMMON;
@@ -208,6 +214,11 @@ TEST(InternalNamesTest, complexdeconstructTest) {
   expectedNameKind = NameKind::DISPATCH_TABLE;
   expectedComponents = {{}, {}, "t", {}};
   validateDeconstructedName(actual, expectedNameKind, expectedComponents);
+
+  actual = NameUniquer::deconstruct("_QFmstartGmpitop");
+  expectedNameKind = NameKind::NAMELIST_GROUP;
+  expectedComponents = {{}, {"mstart"}, "mpitop", {}};
+  validateDeconstructedName(actual, expectedNameKind, expectedComponents);
 }
 
 // main() from gtest_main