[flang][fir] Add support to mangle/deconstruct namelist group name

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>
This commit is contained in:
Valentin Clement 2021-09-24 14:05:23 +02:00
parent c1af84ceaf
commit 3593ae4312
No known key found for this signature in database
GPG Key ID: 086D54783C928776
4 changed files with 37 additions and 1 deletions

View 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();

View 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);
},

View 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");

View 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