FLANG
InternalNames.h
1//===-- Optimizer/Support/InternalNames.h -----------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef FORTRAN_OPTIMIZER_SUPPORT_INTERNALNAMES_H
10#define FORTRAN_OPTIMIZER_SUPPORT_INTERNALNAMES_H
11
12#include "llvm/ADT/ArrayRef.h"
13#include "llvm/ADT/StringRef.h"
14#include <cstdint>
15
16namespace fir {
17
18static constexpr llvm::StringRef kNameSeparator = ".";
19static constexpr llvm::StringRef kBoundsSeparator = ".b.";
20static constexpr llvm::StringRef kComponentSeparator = ".c.";
21static constexpr llvm::StringRef kComponentInitSeparator = ".di.";
22static constexpr llvm::StringRef kDataPtrInitSeparator = ".dp.";
23static constexpr llvm::StringRef kTypeDescriptorSeparator = ".dt.";
24static constexpr llvm::StringRef kKindParameterSeparator = ".kp.";
25static constexpr llvm::StringRef kLenKindSeparator = ".lpk.";
26static constexpr llvm::StringRef kLenParameterSeparator = ".lv.";
27static constexpr llvm::StringRef kNameStringSeparator = ".n.";
28static constexpr llvm::StringRef kProcPtrSeparator = ".p.";
29static constexpr llvm::StringRef kSpecialBindingSeparator = ".s.";
30static constexpr llvm::StringRef kBindingTableSeparator = ".v.";
31static constexpr llvm::StringRef boxprocSuffix = "UnboxProc";
32static constexpr llvm::StringRef kDerivedTypeInitSuffix = "DerivedInit";
33
44struct NameUniquer {
45 enum class IntrinsicType { CHARACTER, COMPLEX, INTEGER, LOGICAL, REAL };
46
48 enum class NameKind {
49 NOT_UNIQUED,
50 BLOCK_DATA_NAME,
51 COMMON,
52 CONSTANT,
53 DERIVED_TYPE,
54 DISPATCH_TABLE,
55 GENERATED,
56 INTRINSIC_TYPE_DESC,
57 NAMELIST_GROUP,
58 PROCEDURE,
59 TYPE_DESC,
60 VARIABLE
61 };
62
64 struct DeconstructedName {
65 DeconstructedName(llvm::StringRef name) : name{name} {}
66 DeconstructedName(llvm::ArrayRef<std::string> modules,
67 llvm::ArrayRef<std::string> procs, std::int64_t blockId,
68 llvm::StringRef name, llvm::ArrayRef<std::int64_t> kinds)
69 : modules{modules}, procs{procs}, blockId{blockId}, name{name},
70 kinds{kinds} {}
71
74 std::int64_t blockId;
75 std::string name;
77 };
78
80 static std::string doCommonBlock(llvm::StringRef name);
81
83 static std::string doConstant(llvm::ArrayRef<llvm::StringRef> modules,
85 std::int64_t block, llvm::StringRef name);
86
88 static std::string doDispatchTable(llvm::ArrayRef<llvm::StringRef> modules,
90 std::int64_t block, llvm::StringRef name,
92
94 static std::string doGenerated(llvm::StringRef name);
96 static std::string doGenerated(llvm::ArrayRef<llvm::StringRef> modules,
98 std::int64_t blockId, llvm::StringRef name);
99
101 static std::string
104 std::int64_t block, IntrinsicType type,
105 std::int64_t kind);
106
108 static std::string doProcedure(llvm::ArrayRef<llvm::StringRef> modules,
110 llvm::StringRef name);
111
113 static std::string doType(llvm::ArrayRef<llvm::StringRef> modules,
115 std::int64_t block, llvm::StringRef name,
117
119 static std::string doTypeDescriptor(llvm::ArrayRef<llvm::StringRef> modules,
121 std::int64_t block, llvm::StringRef name,
123 static std::string doTypeDescriptor(llvm::ArrayRef<std::string> modules,
125 std::int64_t block, llvm::StringRef name,
127
130 static std::string doVariable(llvm::ArrayRef<llvm::StringRef> modules,
132 std::int64_t block, llvm::StringRef name);
133
135 static std::string doNamelistGroup(llvm::ArrayRef<llvm::StringRef> modules,
137 llvm::StringRef name);
138
141 static llvm::StringRef doProgramEntry();
142
144 static std::pair<NameKind, DeconstructedName>
145 deconstruct(llvm::StringRef uniquedName);
146
148 static bool isExternalFacingUniquedName(
149 const std::pair<NameKind, DeconstructedName> &deconstructResult);
150
152 static bool needExternalNameMangling(llvm::StringRef uniquedName);
153
155 static bool belongsToModule(llvm::StringRef uniquedName,
156 llvm::StringRef moduleName);
157
163 static bool isModuleScopeDataUniquedName(llvm::StringRef uniquedName);
164
168 static std::string getTypeDescriptorName(llvm::StringRef mangledTypeName);
169
170 static std::string
171 getTypeDescriptorAssemblyName(llvm::StringRef mangledTypeName);
172
176 static std::string
177 getTypeDescriptorBindingTableName(llvm::StringRef mangledTypeName);
178
181 static std::string getComponentInitName(llvm::StringRef mangledTypeName,
182 llvm::StringRef componentName);
183
189 static llvm::StringRef
190 dropTypeConversionMarkers(llvm::StringRef mangledTypeName);
191
192 static std::string replaceSpecialSymbols(const std::string &name);
193
196 static bool isSpecialSymbol(llvm::StringRef name);
197
198private:
199 static std::string intAsString(std::int64_t i);
200 static std::string doKind(std::int64_t kind);
201 static std::string doKinds(llvm::ArrayRef<std::int64_t> kinds);
202 static std::string toLower(llvm::StringRef name);
203
204 NameUniquer() = delete;
205 NameUniquer(const NameUniquer &) = delete;
206 NameUniquer(NameUniquer &&) = delete;
207 NameUniquer &operator=(const NameUniquer &) = delete;
208};
209
210} // namespace fir
211
212#endif // FORTRAN_OPTIMIZER_SUPPORT_INTERNALNAMES_H
Definition FIRType.h:106
Definition OpenACC.h:20
Definition AbstractConverter.h:37
static bool isModuleScopeDataUniquedName(llvm::StringRef uniquedName)
Definition InternalNames.cpp:359
static llvm::StringRef dropTypeConversionMarkers(llvm::StringRef mangledTypeName)
Definition InternalNames.cpp:430
static bool needExternalNameMangling(llvm::StringRef uniquedName)
Check whether the name should be re-mangle with external ABI convention.
Definition InternalNames.cpp:336
static std::string doCommonBlock(llvm::StringRef name)
Unique a common block name.
Definition InternalNames.cpp:106
static std::string doVariable(llvm::ArrayRef< llvm::StringRef > modules, llvm::ArrayRef< llvm::StringRef > procs, std::int64_t block, llvm::StringRef name)
Definition InternalNames.cpp:220
static std::pair< NameKind, DeconstructedName > deconstruct(llvm::StringRef uniquedName)
Decompose uniquedName into the parse name, symbol type, and scope info.
Definition InternalNames.cpp:246
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:146
static std::string getTypeDescriptorBindingTableName(llvm::StringRef mangledTypeName)
Definition InternalNames.cpp:415
static llvm::StringRef doProgramEntry()
Definition InternalNames.cpp:239
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:111
static bool isExternalFacingUniquedName(const std::pair< NameKind, DeconstructedName > &deconstructResult)
Check if the name is an external facing name.
Definition InternalNames.cpp:327
static std::string getComponentInitName(llvm::StringRef mangledTypeName, llvm::StringRef componentName)
Definition InternalNames.cpp:421
static std::string doProcedure(llvm::ArrayRef< llvm::StringRef > modules, llvm::ArrayRef< llvm::StringRef > procs, llvm::StringRef name)
Unique a procedure name.
Definition InternalNames.cpp:177
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:198
static std::string doGenerated(llvm::StringRef name)
Unique a compiler generated name without scope context.
Definition InternalNames.cpp:132
static bool belongsToModule(llvm::StringRef uniquedName, llvm::StringRef moduleName)
Does uniquedName belong to module moduleName?
Definition InternalNames.cpp:342
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:121
static bool isSpecialSymbol(llvm::StringRef name)
Definition InternalNames.cpp:440
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:230
NameKind
The sort of the unique name.
Definition InternalNames.h:48
static std::string getTypeDescriptorName(llvm::StringRef mangledTypeName)
Definition InternalNames.cpp:405
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:186