35 ManglerPrefixTy PrefixTy,
39 assert(!
Name.empty() &&
"getNameWithPrefix requires non-empty name");
43 if (
Name[0] ==
'\1') {
48 if (
DL.doNotMangleLeadingQuestionMark() &&
Name[0] ==
'?')
51 if (PrefixTy == Private)
52 OS <<
DL.getPrivateGlobalPrefix();
53 else if (PrefixTy == LinkerPrivate)
54 OS <<
DL.getLinkerPrivateGlobalPrefix();
65 ManglerPrefixTy PrefixTy) {
66 char Prefix =
DL.getGlobalPrefix();
78 char Prefix =
DL.getGlobalPrefix();
98 unsigned ArgWords = 0;
100 const unsigned PtrSize =
DL.getPointerSize();
105 if (
A.hasStructRetAttr())
109 uint64_t AllocSize =
A.hasPassPointeeByValueCopyAttr() ?
110 A.getPassPointeeByValueCopySize(
DL) :
111 DL.getTypeAllocSize(
A.getType());
114 ArgWords +=
alignTo(AllocSize, PtrSize);
117 OS <<
'@' << ArgWords;
121 bool CannotUsePrivateLabel)
const {
122 ManglerPrefixTy PrefixTy =
Default;
123 assert(GV !=
nullptr &&
"Invalid Global Value");
125 if (CannotUsePrivateLabel)
126 PrefixTy = LinkerPrivate;
135 unsigned &
ID = AnonGlobalIDs[GV];
137 ID = AnonGlobalIDs.size();
145 char Prefix =
DL.getGlobalPrefix();
153 if (
Name.starts_with(
"\01") ||
154 (
DL.doNotMangleLeadingQuestionMark() &&
Name.starts_with(
"?")))
159 if (!
DL.hasMicrosoftFastStdCallMangling() &&
189 bool CannotUsePrivateLabel)
const {
196 return isAlnum(
C) ||
C ==
'_' ||
C ==
'@' ||
C ==
'#';
205 for (
char C :
Name) {
217 if (TT.isWindowsMSVCEnvironment())
225 if (TT.isWindowsGNUEnvironment() || TT.isWindowsCygwinEnvironment()) {
231 OS << Flag.substr(1);
237 if (TT.isWindowsArm64EC()) {
243 if (std::optional<std::string> demangledName =
245 OS <<
",EXPORTAS," << *demangledName;
251 if (TT.isWindowsMSVCEnvironment())
259 OS <<
" -exclude-symbols:";
270 OS << Flag.substr(1);
281 if (!
T.isWindowsMSVCEnvironment())
288 M.getNameWithPrefix(
OS, GV,
false);
294 bool IsCppFn =
Name[0] ==
'?';
295 if (IsCppFn &&
Name.contains(
"$$h"))
297 if (!IsCppFn &&
Name[0] ==
'#')
301 size_t InsertIdx = 0;
303 InsertIdx =
Name.find(
"@@");
304 size_t ThreeAtSignsIdx =
Name.find(
"@@@");
305 if (InsertIdx != std::string::npos && InsertIdx != ThreeAtSignsIdx) {
308 InsertIdx =
Name.find(
"@");
309 if (InsertIdx != std::string::npos)
316 return std::optional<std::string>(
317 (
Name.substr(0, InsertIdx) + Prefix +
Name.substr(InsertIdx)).str());
320std::optional<std::string>
323 return std::optional<std::string>(
Name.substr(1));
327 std::pair<StringRef, StringRef> Pair =
Name.split(
"$$h");
328 if (Pair.second.empty())
330 return std::optional<std::string>((Pair.first + Pair.second).str());
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static bool canBeUnquotedInDirective(char C)
static void getNameWithPrefixImpl(raw_ostream &OS, const Twine &GVName, ManglerPrefixTy PrefixTy, const DataLayout &DL, char Prefix)
static void addByteCountSuffix(raw_ostream &OS, const Function *F, const DataLayout &DL)
Microsoft fastcall and stdcall functions require a suffix on their name indicating the number of word...
static bool hasByteCountSuffix(CallingConv::ID CC)
Module.h This file contains the declarations for the Module class.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallString class.
This class represents an incoming formal argument to a Function.
A parsed version of the target data layout string in and methods for querying it.
char getGlobalPrefix() const
Class to represent function types.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
FunctionType * getFunctionType() const
Returns the FunctionType for me.
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
bool hasStructRetAttr() const
Determine if the function returns a structure through first or second pointer argument.
bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
bool hasPrivateLinkage() const
bool hasHiddenVisibility() const
bool hasDLLExportStorageClass() const
const GlobalObject * getAliaseeObject() const
const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
Type * getValueType() const
void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV, bool CannotUsePrivateLabel) const
Print the appropriate prefix and the specified global variable's name.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
StringRef - Represent a constant reference to a string, i.e.
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
StringRef toStringRef(SmallVectorImpl< char > &Out) const
This returns the twine as a single StringRef if it can be represented as such.
bool isFunctionTy() const
True if this is an instance of FunctionType.
StringRef getName() const
Return a constant reference to the value's name.
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
A raw_ostream that writes to an SmallVector or SmallString.
@ X86_StdCall
stdcall is mostly used by the Win32 API.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ C
The default llvm calling convention, compatible with C.
@ X86_FastCall
'fast' analog of X86_StdCall.
This is an optimization pass for GlobalISel generic memory operations.
std::optional< std::string > getArm64ECMangledFunctionName(StringRef Name)
std::optional< std::string > getArm64ECDemangledFunctionName(StringRef Name)
void emitLinkerFlagsForUsedCOFF(raw_ostream &OS, const GlobalValue *GV, const Triple &T, Mangler &M)
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
void emitLinkerFlagsForGlobalCOFF(raw_ostream &OS, const GlobalValue *GV, const Triple &TT, Mangler &Mangler)
@ Default
The result values are uniform if and only if all operands are uniform.