Type descriptor and its binding table are defined as fir.global in FIR.
Their names are derived from the derived-type name. This patch adds a new
function `getTypeDescriptorBindingTableName` in the NameUniquer and
refactor the `GetTypeDescriptorName` function to reuse the same code.
This will be used in the fir.dispatch code generation.
Reviewed By: jeanPerier
Differential Revision: https://reviews.llvm.org/D136167
#include "llvm/ADT/StringRef.h"
#include <cstdint>
+static constexpr llvm::StringRef typeDescriptorSeparator = ".dt.";
+static constexpr llvm::StringRef bindingTableSeparator = ".v.";
+
namespace fir {
/// Internal name mangling of identifiers
/// not a valid mangled derived type name.
static std::string getTypeDescriptorName(llvm::StringRef mangledTypeName);
+ /// Given a mangled derived type name, get the name of the related binding
+ /// table object. Returns an empty string if \p mangledTypeName is not a valid
+ /// mangled derived type name.
+ static std::string
+ getTypeDescriptorBindingTableName(llvm::StringRef mangledTypeName);
+
private:
static std::string intAsString(std::int64_t i);
static std::string doKind(std::int64_t kind);
return result;
}
-std::string
-fir::NameUniquer::getTypeDescriptorName(llvm::StringRef mangledTypeName) {
- auto result = deconstruct(mangledTypeName);
- if (result.first != NameKind::DERIVED_TYPE)
+static std::string getDerivedTypeObjectName(llvm::StringRef mangledTypeName,
+ const llvm::StringRef separator) {
+ auto result = fir::NameUniquer::deconstruct(mangledTypeName);
+ if (result.first != fir::NameUniquer::NameKind::DERIVED_TYPE)
return "";
- std::string varName = ".dt." + result.second.name +
+ std::string varName = separator.str() + result.second.name +
mangleTypeDescriptorKinds(result.second.kinds);
llvm::SmallVector<llvm::StringRef> modules;
for (const std::string &mod : result.second.modules)
llvm::Optional<llvm::StringRef> host;
if (result.second.host)
host = *result.second.host;
- return doVariable(modules, host, varName);
+ return fir::NameUniquer::doVariable(modules, host, varName);
+}
+
+std::string
+fir::NameUniquer::getTypeDescriptorName(llvm::StringRef mangledTypeName) {
+ return getDerivedTypeObjectName(mangledTypeName, typeDescriptorSeparator);
+}
+
+std::string fir::NameUniquer::getTypeDescriptorBindingTableName(
+ llvm::StringRef mangledTypeName) {
+ return getDerivedTypeObjectName(mangledTypeName, bindingTableSeparator);
}
ASSERT_TRUE(NameUniquer::isExternalFacingUniquedName(result));
}
+TEST(InternalNamesTest, getTypeDescriptorName) {
+ std::string derivedTypeName = "_QMdispatch1Tp1";
+ std::string expectedBindingTableName = "_QMdispatch1E.dt.p1";
+ ASSERT_EQ(expectedBindingTableName,
+ fir::NameUniquer::getTypeDescriptorName(derivedTypeName));
+ ASSERT_EQ("", fir::NameUniquer::getTypeDescriptorName("_QMdispatch1Pp1"));
+}
+
+TEST(InternalNamesTest, getTypeDescriptorBindingTableName) {
+ std::string derivedTypeName = "_QMdispatch1Tp1";
+ std::string expectedBindingTableName = "_QMdispatch1E.v.p1";
+ ASSERT_EQ(expectedBindingTableName,
+ fir::NameUniquer::getTypeDescriptorBindingTableName(derivedTypeName));
+ ASSERT_EQ("",
+ fir::NameUniquer::getTypeDescriptorBindingTableName("_QMdispatch1Pp1"));
+}
+
// main() from gtest_main