forked from OSchip/llvm-project
[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:
parent
c1af84ceaf
commit
3593ae4312
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
},
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue