9#ifndef FORTRAN_OPTIMIZER_SUPPORT_INTERNALNAMES_H
10#define FORTRAN_OPTIMIZER_SUPPORT_INTERNALNAMES_H
12#include "llvm/ADT/ArrayRef.h"
13#include "llvm/ADT/StringRef.h"
19static constexpr llvm::StringRef kNameSeparator =
".";
20static constexpr llvm::StringRef kBoundsSeparator =
".b.";
21static constexpr llvm::StringRef kComponentSeparator =
".c.";
22static constexpr llvm::StringRef kComponentInitSeparator =
".di.";
23static constexpr llvm::StringRef kDataPtrInitSeparator =
".dp.";
24static constexpr llvm::StringRef kTypeDescriptorSeparator =
".dt.";
25static constexpr llvm::StringRef kKindParameterSeparator =
".kp.";
26static constexpr llvm::StringRef kLenKindSeparator =
".lpk.";
27static constexpr llvm::StringRef kLenParameterSeparator =
".lv.";
28static constexpr llvm::StringRef kNameStringSeparator =
".n.";
29static constexpr llvm::StringRef kProcPtrSeparator =
".p.";
30static constexpr llvm::StringRef kSpecialBindingSeparator =
".s.";
31static constexpr llvm::StringRef kBindingTableSeparator =
".v.";
32static constexpr llvm::StringRef boxprocSuffix =
"UnboxProc";
33static constexpr llvm::StringRef kDerivedTypeInitSuffix =
"DerivedInit";
46 enum class IntrinsicType { CHARACTER, COMPLEX, INTEGER, LOGICAL, REAL };
65 struct DeconstructedName {
66 DeconstructedName(llvm::StringRef name) : name{name} {}
70 : modules{modules}, procs{procs}, blockId{blockId}, name{name},
86 std::int64_t block, llvm::StringRef name);
91 std::int64_t block, llvm::StringRef name,
95 static std::string
doGenerated(llvm::StringRef name);
99 std::int64_t blockId, llvm::StringRef name);
105 std::int64_t block, IntrinsicType type,
111 llvm::StringRef name);
116 std::int64_t block, llvm::StringRef name,
122 std::int64_t block, llvm::StringRef name,
126 std::int64_t block, llvm::StringRef name,
133 std::int64_t block, llvm::StringRef name);
138 llvm::StringRef name);
145 static std::pair<NameKind, DeconstructedName>
150 const std::pair<NameKind, DeconstructedName> &deconstructResult);
157 llvm::StringRef moduleName);
165 getTypeDescriptorAssemblyName(llvm::StringRef mangledTypeName);
176 llvm::StringRef componentName);
183 static llvm::StringRef
186 static std::string replaceSpecialSymbols(
const std::string &name);
193 static std::string intAsString(std::int64_t i);
194 static std::string doKind(std::int64_t kind);
196 static std::string toLower(llvm::StringRef name);
198 NameUniquer() =
delete;
199 NameUniquer(
const NameUniquer &) =
delete;
200 NameUniquer(NameUniquer &&) =
delete;
201 NameUniquer &operator=(
const NameUniquer &) =
delete;
Definition AbstractConverter.h:34
static llvm::StringRef dropTypeConversionMarkers(llvm::StringRef mangledTypeName)
Definition InternalNames.cpp:405
static bool needExternalNameMangling(llvm::StringRef uniquedName)
Check whether the name should be re-mangle with external ABI convention.
Definition InternalNames.cpp:337
static std::string doCommonBlock(llvm::StringRef name)
Unique a common block name.
Definition InternalNames.cpp:107
static std::string doVariable(llvm::ArrayRef< llvm::StringRef > modules, llvm::ArrayRef< llvm::StringRef > procs, std::int64_t block, llvm::StringRef name)
Definition InternalNames.cpp:221
static std::pair< NameKind, DeconstructedName > deconstruct(llvm::StringRef uniquedName)
Decompose uniquedName into the parse name, symbol type, and scope info.
Definition InternalNames.cpp:247
static std::string doIntrinsicTypeDescriptor(llvm::ArrayRef< llvm::StringRef > modules, llvm::ArrayRef< llvm::StringRef > procs, std::int64_t block, IntrinsicType type, std::int64_t kind)
Unique an intrinsic type descriptor.
Definition InternalNames.cpp:147
static std::string getTypeDescriptorBindingTableName(llvm::StringRef mangledTypeName)
Definition InternalNames.cpp:390
static llvm::StringRef doProgramEntry()
Definition InternalNames.cpp:240
static std::string doConstant(llvm::ArrayRef< llvm::StringRef > modules, llvm::ArrayRef< llvm::StringRef > procs, std::int64_t block, llvm::StringRef name)
Unique a (global) constant name.
Definition InternalNames.cpp:112
static bool isExternalFacingUniquedName(const std::pair< NameKind, DeconstructedName > &deconstructResult)
Check if the name is an external facing name.
Definition InternalNames.cpp:328
static std::string getComponentInitName(llvm::StringRef mangledTypeName, llvm::StringRef componentName)
Definition InternalNames.cpp:396
static std::string doProcedure(llvm::ArrayRef< llvm::StringRef > modules, llvm::ArrayRef< llvm::StringRef > procs, llvm::StringRef name)
Unique a procedure name.
Definition InternalNames.cpp:178
static std::string doTypeDescriptor(llvm::ArrayRef< llvm::StringRef > modules, llvm::ArrayRef< llvm::StringRef > procs, std::int64_t block, llvm::StringRef name, llvm::ArrayRef< std::int64_t > kinds)
Unique a (derived) type descriptor name.
Definition InternalNames.cpp:199
static std::string doGenerated(llvm::StringRef name)
Unique a compiler generated name without scope context.
Definition InternalNames.cpp:133
static bool belongsToModule(llvm::StringRef uniquedName, llvm::StringRef moduleName)
Does uniquedName belong to module moduleName?
Definition InternalNames.cpp:343
static std::string doDispatchTable(llvm::ArrayRef< llvm::StringRef > modules, llvm::ArrayRef< llvm::StringRef > procs, std::int64_t block, llvm::StringRef name, llvm::ArrayRef< std::int64_t > kinds)
Unique a dispatch table name.
Definition InternalNames.cpp:122
static bool isSpecialSymbol(llvm::StringRef name)
Definition InternalNames.cpp:415
static std::string doNamelistGroup(llvm::ArrayRef< llvm::StringRef > modules, llvm::ArrayRef< llvm::StringRef > procs, llvm::StringRef name)
Unique a namelist group name.
Definition InternalNames.cpp:231
NameKind
The sort of the unique name.
Definition InternalNames.h:49
static std::string getTypeDescriptorName(llvm::StringRef mangledTypeName)
Definition InternalNames.cpp:380
static std::string doType(llvm::ArrayRef< llvm::StringRef > modules, llvm::ArrayRef< llvm::StringRef > procs, std::int64_t block, llvm::StringRef name, llvm::ArrayRef< std::int64_t > kinds)
Unique a derived type name.
Definition InternalNames.cpp:187