1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | #include "clang/AST/Mangle.h" |
17 | #include "clang/AST/ASTContext.h" |
18 | #include "clang/AST/Attr.h" |
19 | #include "clang/AST/Decl.h" |
20 | #include "clang/AST/DeclCXX.h" |
21 | #include "clang/AST/DeclObjC.h" |
22 | #include "clang/AST/DeclOpenMP.h" |
23 | #include "clang/AST/DeclTemplate.h" |
24 | #include "clang/AST/Expr.h" |
25 | #include "clang/AST/ExprCXX.h" |
26 | #include "clang/AST/ExprObjC.h" |
27 | #include "clang/AST/TypeLoc.h" |
28 | #include "clang/Basic/ABI.h" |
29 | #include "clang/Basic/SourceManager.h" |
30 | #include "clang/Basic/TargetInfo.h" |
31 | #include "llvm/ADT/StringExtras.h" |
32 | #include "llvm/Support/ErrorHandling.h" |
33 | #include "llvm/Support/raw_ostream.h" |
34 | |
35 | using namespace clang; |
36 | |
37 | namespace { |
38 | |
39 | |
40 | |
41 | static const DeclContext *getEffectiveDeclContext(const Decl *D) { |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) { |
49 | if (RD->isLambda()) |
50 | if (ParmVarDecl *ContextParam |
51 | = dyn_cast_or_null<ParmVarDecl>(RD->getLambdaContextDecl())) |
52 | return ContextParam->getDeclContext(); |
53 | } |
54 | |
55 | |
56 | if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) { |
57 | if (ParmVarDecl *ContextParam |
58 | = dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl())) |
59 | return ContextParam->getDeclContext(); |
60 | } |
61 | |
62 | const DeclContext *DC = D->getDeclContext(); |
63 | if (isa<CapturedDecl>(DC) || isa<OMPDeclareReductionDecl>(DC) || |
64 | isa<OMPDeclareMapperDecl>(DC)) { |
65 | return getEffectiveDeclContext(cast<Decl>(DC)); |
66 | } |
67 | |
68 | if (const auto *VD = dyn_cast<VarDecl>(D)) |
69 | if (VD->isExternC()) |
70 | return VD->getASTContext().getTranslationUnitDecl(); |
71 | |
72 | if (const auto *FD = dyn_cast<FunctionDecl>(D)) |
73 | if (FD->isExternC()) |
74 | return FD->getASTContext().getTranslationUnitDecl(); |
75 | |
76 | return DC->getRedeclContext(); |
77 | } |
78 | |
79 | static const DeclContext *getEffectiveParentContext(const DeclContext *DC) { |
80 | return getEffectiveDeclContext(cast<Decl>(DC)); |
81 | } |
82 | |
83 | static bool isLocalContainerContext(const DeclContext *DC) { |
84 | return isa<FunctionDecl>(DC) || isa<ObjCMethodDecl>(DC) || isa<BlockDecl>(DC); |
85 | } |
86 | |
87 | static const RecordDecl *GetLocalClassDecl(const Decl *D) { |
88 | const DeclContext *DC = getEffectiveDeclContext(D); |
89 | while (!DC->isNamespace() && !DC->isTranslationUnit()) { |
90 | if (isLocalContainerContext(DC)) |
91 | return dyn_cast<RecordDecl>(D); |
92 | D = cast<Decl>(DC); |
93 | DC = getEffectiveDeclContext(D); |
94 | } |
95 | return nullptr; |
96 | } |
97 | |
98 | static const FunctionDecl *getStructor(const FunctionDecl *fn) { |
99 | if (const FunctionTemplateDecl *ftd = fn->getPrimaryTemplate()) |
100 | return ftd->getTemplatedDecl(); |
101 | |
102 | return fn; |
103 | } |
104 | |
105 | static const NamedDecl *getStructor(const NamedDecl *decl) { |
106 | const FunctionDecl *fn = dyn_cast_or_null<FunctionDecl>(decl); |
107 | return (fn ? getStructor(fn) : decl); |
108 | } |
109 | |
110 | static bool isLambda(const NamedDecl *ND) { |
111 | const CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(ND); |
112 | if (!Record) |
113 | return false; |
114 | |
115 | return Record->isLambda(); |
116 | } |
117 | |
118 | static const unsigned UnknownArity = ~0U; |
119 | |
120 | class ItaniumMangleContextImpl : public ItaniumMangleContext { |
121 | typedef std::pair<const DeclContext*, IdentifierInfo*> DiscriminatorKeyTy; |
122 | llvm::DenseMap<DiscriminatorKeyTy, unsigned> Discriminator; |
123 | llvm::DenseMap<const NamedDecl*, unsigned> Uniquifier; |
124 | |
125 | public: |
126 | explicit ItaniumMangleContextImpl(ASTContext &Context, |
127 | DiagnosticsEngine &Diags) |
128 | : ItaniumMangleContext(Context, Diags) {} |
129 | |
130 | |
131 | |
132 | |
133 | bool shouldMangleCXXName(const NamedDecl *D) override; |
134 | bool shouldMangleStringLiteral(const StringLiteral *) override { |
135 | return false; |
136 | } |
137 | void mangleCXXName(const NamedDecl *D, raw_ostream &) override; |
138 | void mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk, |
139 | raw_ostream &) override; |
140 | void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type, |
141 | const ThisAdjustment &ThisAdjustment, |
142 | raw_ostream &) override; |
143 | void mangleReferenceTemporary(const VarDecl *D, unsigned ManglingNumber, |
144 | raw_ostream &) override; |
145 | void mangleCXXVTable(const CXXRecordDecl *RD, raw_ostream &) override; |
146 | void mangleCXXVTT(const CXXRecordDecl *RD, raw_ostream &) override; |
147 | void mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset, |
148 | const CXXRecordDecl *Type, raw_ostream &) override; |
149 | void mangleCXXRTTI(QualType T, raw_ostream &) override; |
150 | void mangleCXXRTTIName(QualType T, raw_ostream &) override; |
151 | void mangleTypeName(QualType T, raw_ostream &) override; |
152 | void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type, |
153 | raw_ostream &) override; |
154 | void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type, |
155 | raw_ostream &) override; |
156 | |
157 | void mangleCXXCtorComdat(const CXXConstructorDecl *D, raw_ostream &) override; |
158 | void mangleCXXDtorComdat(const CXXDestructorDecl *D, raw_ostream &) override; |
159 | void mangleStaticGuardVariable(const VarDecl *D, raw_ostream &) override; |
160 | void mangleDynamicInitializer(const VarDecl *D, raw_ostream &Out) override; |
161 | void mangleDynamicAtExitDestructor(const VarDecl *D, |
162 | raw_ostream &Out) override; |
163 | void mangleSEHFilterExpression(const NamedDecl *EnclosingDecl, |
164 | raw_ostream &Out) override; |
165 | void mangleSEHFinallyBlock(const NamedDecl *EnclosingDecl, |
166 | raw_ostream &Out) override; |
167 | void mangleItaniumThreadLocalInit(const VarDecl *D, raw_ostream &) override; |
168 | void mangleItaniumThreadLocalWrapper(const VarDecl *D, |
169 | raw_ostream &) override; |
170 | |
171 | void mangleStringLiteral(const StringLiteral *, raw_ostream &) override; |
172 | |
173 | bool getNextDiscriminator(const NamedDecl *ND, unsigned &disc) { |
174 | |
175 | if (isLambda(ND)) |
176 | return false; |
177 | |
178 | |
179 | if (const TagDecl *Tag = dyn_cast<TagDecl>(ND)) { |
180 | if (Tag->getName().empty() && !Tag->getTypedefNameForAnonDecl()) |
181 | return false; |
182 | } |
183 | |
184 | |
185 | if (ND->isExternallyVisible()) { |
186 | unsigned discriminator = getASTContext().getManglingNumber(ND); |
187 | if (discriminator == 1) |
188 | return false; |
189 | disc = discriminator - 2; |
190 | return true; |
191 | } |
192 | |
193 | |
194 | unsigned &discriminator = Uniquifier[ND]; |
195 | if (!discriminator) { |
196 | const DeclContext *DC = getEffectiveDeclContext(ND); |
197 | discriminator = ++Discriminator[std::make_pair(DC, ND->getIdentifier())]; |
198 | } |
199 | if (discriminator == 1) |
200 | return false; |
201 | disc = discriminator-2; |
202 | return true; |
203 | } |
204 | |
205 | }; |
206 | |
207 | |
208 | class CXXNameMangler { |
209 | ItaniumMangleContextImpl &Context; |
210 | raw_ostream &Out; |
211 | bool NullOut = false; |
212 | |
213 | |
214 | |
215 | |
216 | bool DisableDerivedAbiTags = false; |
217 | |
218 | |
219 | |
220 | |
221 | const NamedDecl *Structor; |
222 | unsigned StructorType; |
223 | |
224 | |
225 | unsigned SeqID; |
226 | |
227 | class FunctionTypeDepthState { |
228 | unsigned Bits; |
229 | |
230 | enum { InResultTypeMask = 1 }; |
231 | |
232 | public: |
233 | FunctionTypeDepthState() : Bits(0) {} |
234 | |
235 | |
236 | unsigned getDepth() const { |
237 | return Bits >> 1; |
238 | } |
239 | |
240 | |
241 | bool isInResultType() const { |
242 | return Bits & InResultTypeMask; |
243 | } |
244 | |
245 | FunctionTypeDepthState push() { |
246 | FunctionTypeDepthState tmp = *this; |
247 | Bits = (Bits & ~InResultTypeMask) + 2; |
248 | return tmp; |
249 | } |
250 | |
251 | void enterResultType() { |
252 | Bits |= InResultTypeMask; |
253 | } |
254 | |
255 | void leaveResultType() { |
256 | Bits &= ~InResultTypeMask; |
257 | } |
258 | |
259 | void pop(FunctionTypeDepthState saved) { |
260 | assert(getDepth() == saved.getDepth() + 1); |
261 | Bits = saved.Bits; |
262 | } |
263 | |
264 | } FunctionTypeDepth; |
265 | |
266 | |
267 | |
268 | |
269 | |
270 | typedef SmallVector<StringRef, 4> AbiTagList; |
271 | |
272 | |
273 | |
274 | |
275 | class AbiTagState final { |
276 | public: |
277 | explicit AbiTagState(AbiTagState *&Head) : LinkHead(Head) { |
278 | Parent = LinkHead; |
279 | LinkHead = this; |
280 | } |
281 | |
282 | |
283 | AbiTagState(const AbiTagState &) = delete; |
284 | AbiTagState &operator=(const AbiTagState &) = delete; |
285 | |
286 | ~AbiTagState() { pop(); } |
287 | |
288 | void write(raw_ostream &Out, const NamedDecl *ND, |
289 | const AbiTagList *AdditionalAbiTags) { |
290 | ND = cast<NamedDecl>(ND->getCanonicalDecl()); |
291 | if (!isa<FunctionDecl>(ND) && !isa<VarDecl>(ND)) { |
292 | (0) . __assert_fail ("!AdditionalAbiTags && \"only function and variables need a list of additional abi tags\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 294, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert( |
293 | (0) . __assert_fail ("!AdditionalAbiTags && \"only function and variables need a list of additional abi tags\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 294, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> !AdditionalAbiTags && |
294 | (0) . __assert_fail ("!AdditionalAbiTags && \"only function and variables need a list of additional abi tags\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 294, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "only function and variables need a list of additional abi tags"); |
295 | if (const auto *NS = dyn_cast<NamespaceDecl>(ND)) { |
296 | if (const auto *AbiTag = NS->getAttr<AbiTagAttr>()) { |
297 | UsedAbiTags.insert(UsedAbiTags.end(), AbiTag->tags().begin(), |
298 | AbiTag->tags().end()); |
299 | } |
300 | |
301 | return; |
302 | } |
303 | } |
304 | |
305 | AbiTagList TagList; |
306 | if (const auto *AbiTag = ND->getAttr<AbiTagAttr>()) { |
307 | UsedAbiTags.insert(UsedAbiTags.end(), AbiTag->tags().begin(), |
308 | AbiTag->tags().end()); |
309 | TagList.insert(TagList.end(), AbiTag->tags().begin(), |
310 | AbiTag->tags().end()); |
311 | } |
312 | |
313 | if (AdditionalAbiTags) { |
314 | UsedAbiTags.insert(UsedAbiTags.end(), AdditionalAbiTags->begin(), |
315 | AdditionalAbiTags->end()); |
316 | TagList.insert(TagList.end(), AdditionalAbiTags->begin(), |
317 | AdditionalAbiTags->end()); |
318 | } |
319 | |
320 | llvm::sort(TagList); |
321 | TagList.erase(std::unique(TagList.begin(), TagList.end()), TagList.end()); |
322 | |
323 | writeSortedUniqueAbiTags(Out, TagList); |
324 | } |
325 | |
326 | const AbiTagList &getUsedAbiTags() const { return UsedAbiTags; } |
327 | void setUsedAbiTags(const AbiTagList &AbiTags) { |
328 | UsedAbiTags = AbiTags; |
329 | } |
330 | |
331 | const AbiTagList &getEmittedAbiTags() const { |
332 | return EmittedAbiTags; |
333 | } |
334 | |
335 | const AbiTagList &getSortedUniqueUsedAbiTags() { |
336 | llvm::sort(UsedAbiTags); |
337 | UsedAbiTags.erase(std::unique(UsedAbiTags.begin(), UsedAbiTags.end()), |
338 | UsedAbiTags.end()); |
339 | return UsedAbiTags; |
340 | } |
341 | |
342 | private: |
343 | |
344 | AbiTagList UsedAbiTags; |
345 | |
346 | AbiTagList EmittedAbiTags; |
347 | |
348 | AbiTagState *&LinkHead; |
349 | AbiTagState *Parent = nullptr; |
350 | |
351 | void pop() { |
352 | (0) . __assert_fail ("LinkHead == this && \"abi tag link head must point to us on destruction\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 353, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(LinkHead == this && |
353 | (0) . __assert_fail ("LinkHead == this && \"abi tag link head must point to us on destruction\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 353, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "abi tag link head must point to us on destruction"); |
354 | if (Parent) { |
355 | Parent->UsedAbiTags.insert(Parent->UsedAbiTags.end(), |
356 | UsedAbiTags.begin(), UsedAbiTags.end()); |
357 | Parent->EmittedAbiTags.insert(Parent->EmittedAbiTags.end(), |
358 | EmittedAbiTags.begin(), |
359 | EmittedAbiTags.end()); |
360 | } |
361 | LinkHead = Parent; |
362 | } |
363 | |
364 | void writeSortedUniqueAbiTags(raw_ostream &Out, const AbiTagList &AbiTags) { |
365 | for (const auto &Tag : AbiTags) { |
366 | EmittedAbiTags.push_back(Tag); |
367 | Out << "B"; |
368 | Out << Tag.size(); |
369 | Out << Tag; |
370 | } |
371 | } |
372 | }; |
373 | |
374 | AbiTagState *AbiTags = nullptr; |
375 | AbiTagState AbiTagsRoot; |
376 | |
377 | llvm::DenseMap<uintptr_t, unsigned> Substitutions; |
378 | llvm::DenseMap<StringRef, unsigned> ModuleSubstitutions; |
379 | |
380 | ASTContext &getASTContext() const { return Context.getASTContext(); } |
381 | |
382 | public: |
383 | CXXNameMangler(ItaniumMangleContextImpl &C, raw_ostream &Out_, |
384 | const NamedDecl *D = nullptr, bool NullOut_ = false) |
385 | : Context(C), Out(Out_), NullOut(NullOut_), Structor(getStructor(D)), |
386 | StructorType(0), SeqID(0), AbiTagsRoot(AbiTags) { |
387 | |
388 | (D) && !isa(D))", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 389, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!D || (!isa<CXXDestructorDecl>(D) && |
389 | (D) && !isa(D))", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 389, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> !isa<CXXConstructorDecl>(D))); |
390 | } |
391 | CXXNameMangler(ItaniumMangleContextImpl &C, raw_ostream &Out_, |
392 | const CXXConstructorDecl *D, CXXCtorType Type) |
393 | : Context(C), Out(Out_), Structor(getStructor(D)), StructorType(Type), |
394 | SeqID(0), AbiTagsRoot(AbiTags) { } |
395 | CXXNameMangler(ItaniumMangleContextImpl &C, raw_ostream &Out_, |
396 | const CXXDestructorDecl *D, CXXDtorType Type) |
397 | : Context(C), Out(Out_), Structor(getStructor(D)), StructorType(Type), |
398 | SeqID(0), AbiTagsRoot(AbiTags) { } |
399 | |
400 | CXXNameMangler(CXXNameMangler &Outer, raw_ostream &Out_) |
401 | : Context(Outer.Context), Out(Out_), NullOut(false), |
402 | Structor(Outer.Structor), StructorType(Outer.StructorType), |
403 | SeqID(Outer.SeqID), FunctionTypeDepth(Outer.FunctionTypeDepth), |
404 | AbiTagsRoot(AbiTags), Substitutions(Outer.Substitutions) {} |
405 | |
406 | CXXNameMangler(CXXNameMangler &Outer, llvm::raw_null_ostream &Out_) |
407 | : Context(Outer.Context), Out(Out_), NullOut(true), |
408 | Structor(Outer.Structor), StructorType(Outer.StructorType), |
409 | SeqID(Outer.SeqID), FunctionTypeDepth(Outer.FunctionTypeDepth), |
410 | AbiTagsRoot(AbiTags), Substitutions(Outer.Substitutions) {} |
411 | |
412 | raw_ostream &getStream() { return Out; } |
413 | |
414 | void disableDerivedAbiTags() { DisableDerivedAbiTags = true; } |
415 | static bool shouldHaveAbiTags(ItaniumMangleContextImpl &C, const VarDecl *VD); |
416 | |
417 | void mangle(const NamedDecl *D); |
418 | void mangleCallOffset(int64_t NonVirtual, int64_t Virtual); |
419 | void mangleNumber(const llvm::APSInt &I); |
420 | void mangleNumber(int64_t Number); |
421 | void mangleFloat(const llvm::APFloat &F); |
422 | void mangleFunctionEncoding(const FunctionDecl *FD); |
423 | void mangleSeqID(unsigned SeqID); |
424 | void mangleName(const NamedDecl *ND); |
425 | void mangleType(QualType T); |
426 | void mangleNameOrStandardSubstitution(const NamedDecl *ND); |
427 | |
428 | private: |
429 | |
430 | bool mangleSubstitution(const NamedDecl *ND); |
431 | bool mangleSubstitution(QualType T); |
432 | bool mangleSubstitution(TemplateName Template); |
433 | bool mangleSubstitution(uintptr_t Ptr); |
434 | |
435 | void mangleExistingSubstitution(TemplateName name); |
436 | |
437 | bool mangleStandardSubstitution(const NamedDecl *ND); |
438 | |
439 | void addSubstitution(const NamedDecl *ND) { |
440 | ND = cast<NamedDecl>(ND->getCanonicalDecl()); |
441 | |
442 | addSubstitution(reinterpret_cast<uintptr_t>(ND)); |
443 | } |
444 | void addSubstitution(QualType T); |
445 | void addSubstitution(TemplateName Template); |
446 | void addSubstitution(uintptr_t Ptr); |
447 | |
448 | void extendSubstitutions(CXXNameMangler* Other); |
449 | |
450 | void mangleUnresolvedPrefix(NestedNameSpecifier *qualifier, |
451 | bool recursive = false); |
452 | void mangleUnresolvedName(NestedNameSpecifier *qualifier, |
453 | DeclarationName name, |
454 | const TemplateArgumentLoc *TemplateArgs, |
455 | unsigned NumTemplateArgs, |
456 | unsigned KnownArity = UnknownArity); |
457 | |
458 | void mangleFunctionEncodingBareType(const FunctionDecl *FD); |
459 | |
460 | void mangleNameWithAbiTags(const NamedDecl *ND, |
461 | const AbiTagList *AdditionalAbiTags); |
462 | void mangleModuleName(const Module *M); |
463 | void mangleModuleNamePrefix(StringRef Name); |
464 | void mangleTemplateName(const TemplateDecl *TD, |
465 | const TemplateArgument *TemplateArgs, |
466 | unsigned NumTemplateArgs); |
467 | void mangleUnqualifiedName(const NamedDecl *ND, |
468 | const AbiTagList *AdditionalAbiTags) { |
469 | mangleUnqualifiedName(ND, ND->getDeclName(), UnknownArity, |
470 | AdditionalAbiTags); |
471 | } |
472 | void mangleUnqualifiedName(const NamedDecl *ND, DeclarationName Name, |
473 | unsigned KnownArity, |
474 | const AbiTagList *AdditionalAbiTags); |
475 | void mangleUnscopedName(const NamedDecl *ND, |
476 | const AbiTagList *AdditionalAbiTags); |
477 | void mangleUnscopedTemplateName(const TemplateDecl *ND, |
478 | const AbiTagList *AdditionalAbiTags); |
479 | void mangleUnscopedTemplateName(TemplateName, |
480 | const AbiTagList *AdditionalAbiTags); |
481 | void mangleSourceName(const IdentifierInfo *II); |
482 | void mangleRegCallName(const IdentifierInfo *II); |
483 | void mangleSourceNameWithAbiTags( |
484 | const NamedDecl *ND, const AbiTagList *AdditionalAbiTags = nullptr); |
485 | void mangleLocalName(const Decl *D, |
486 | const AbiTagList *AdditionalAbiTags); |
487 | void mangleBlockForPrefix(const BlockDecl *Block); |
488 | void mangleUnqualifiedBlock(const BlockDecl *Block); |
489 | void mangleLambda(const CXXRecordDecl *Lambda); |
490 | void mangleNestedName(const NamedDecl *ND, const DeclContext *DC, |
491 | const AbiTagList *AdditionalAbiTags, |
492 | bool NoFunction=false); |
493 | void mangleNestedName(const TemplateDecl *TD, |
494 | const TemplateArgument *TemplateArgs, |
495 | unsigned NumTemplateArgs); |
496 | void manglePrefix(NestedNameSpecifier *qualifier); |
497 | void manglePrefix(const DeclContext *DC, bool NoFunction=false); |
498 | void manglePrefix(QualType type); |
499 | void mangleTemplatePrefix(const TemplateDecl *ND, bool NoFunction=false); |
500 | void mangleTemplatePrefix(TemplateName Template); |
501 | bool mangleUnresolvedTypeOrSimpleId(QualType DestroyedType, |
502 | StringRef Prefix = ""); |
503 | void mangleOperatorName(DeclarationName Name, unsigned Arity); |
504 | void mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity); |
505 | void mangleVendorQualifier(StringRef qualifier); |
506 | void mangleQualifiers(Qualifiers Quals, const DependentAddressSpaceType *DAST = nullptr); |
507 | void mangleRefQualifier(RefQualifierKind RefQualifier); |
508 | |
509 | void mangleObjCMethodName(const ObjCMethodDecl *MD); |
510 | |
511 | |
512 | #define ABSTRACT_TYPE(CLASS, PARENT) |
513 | #define NON_CANONICAL_TYPE(CLASS, PARENT) |
514 | #define TYPE(CLASS, PARENT) void mangleType(const CLASS##Type *T); |
515 | #include "clang/AST/TypeNodes.def" |
516 | |
517 | void mangleType(const TagType*); |
518 | void mangleType(TemplateName); |
519 | static StringRef getCallingConvQualifierName(CallingConv CC); |
520 | void mangleExtParameterInfo(FunctionProtoType::ExtParameterInfo info); |
521 | void mangleExtFunctionInfo(const FunctionType *T); |
522 | void mangleBareFunctionType(const FunctionProtoType *T, bool MangleReturnType, |
523 | const FunctionDecl *FD = nullptr); |
524 | void mangleNeonVectorType(const VectorType *T); |
525 | void mangleNeonVectorType(const DependentVectorType *T); |
526 | void mangleAArch64NeonVectorType(const VectorType *T); |
527 | void mangleAArch64NeonVectorType(const DependentVectorType *T); |
528 | |
529 | void mangleIntegerLiteral(QualType T, const llvm::APSInt &Value); |
530 | void mangleMemberExprBase(const Expr *base, bool isArrow); |
531 | void mangleMemberExpr(const Expr *base, bool isArrow, |
532 | NestedNameSpecifier *qualifier, |
533 | NamedDecl *firstQualifierLookup, |
534 | DeclarationName name, |
535 | const TemplateArgumentLoc *TemplateArgs, |
536 | unsigned NumTemplateArgs, |
537 | unsigned knownArity); |
538 | void mangleCastExpression(const Expr *E, StringRef CastEncoding); |
539 | void mangleInitListElements(const InitListExpr *InitList); |
540 | void mangleExpression(const Expr *E, unsigned Arity = UnknownArity); |
541 | void mangleCXXCtorType(CXXCtorType T, const CXXRecordDecl *InheritedFrom); |
542 | void mangleCXXDtorType(CXXDtorType T); |
543 | |
544 | void mangleTemplateArgs(const TemplateArgumentLoc *TemplateArgs, |
545 | unsigned NumTemplateArgs); |
546 | void mangleTemplateArgs(const TemplateArgument *TemplateArgs, |
547 | unsigned NumTemplateArgs); |
548 | void mangleTemplateArgs(const TemplateArgumentList &AL); |
549 | void mangleTemplateArg(TemplateArgument A); |
550 | |
551 | void mangleTemplateParameter(unsigned Index); |
552 | |
553 | void mangleFunctionParam(const ParmVarDecl *parm); |
554 | |
555 | void writeAbiTags(const NamedDecl *ND, |
556 | const AbiTagList *AdditionalAbiTags); |
557 | |
558 | |
559 | AbiTagList makeFunctionReturnTypeTags(const FunctionDecl *FD); |
560 | |
561 | AbiTagList makeVariableTypeTags(const VarDecl *VD); |
562 | }; |
563 | |
564 | } |
565 | |
566 | bool ItaniumMangleContextImpl::shouldMangleCXXName(const NamedDecl *D) { |
567 | const FunctionDecl *FD = dyn_cast<FunctionDecl>(D); |
568 | if (FD) { |
569 | LanguageLinkage L = FD->getLanguageLinkage(); |
570 | |
571 | if (FD->hasAttr<OverloadableAttr>()) |
572 | return true; |
573 | |
574 | |
575 | if (FD->isMain()) |
576 | return false; |
577 | |
578 | |
579 | |
580 | |
581 | |
582 | |
583 | |
584 | |
585 | |
586 | |
587 | if (FD->isMSVCRTEntryPoint()) |
588 | return false; |
589 | |
590 | |
591 | |
592 | if (!FD->getDeclName().isIdentifier() || L == CXXLanguageLinkage) |
593 | return true; |
594 | |
595 | |
596 | if (L == CLanguageLinkage) |
597 | return false; |
598 | } |
599 | |
600 | |
601 | if (!getASTContext().getLangOpts().CPlusPlus) |
602 | return false; |
603 | |
604 | const VarDecl *VD = dyn_cast<VarDecl>(D); |
605 | if (VD && !isa<DecompositionDecl>(D)) { |
606 | |
607 | if (VD->isExternC()) |
608 | return false; |
609 | |
610 | |
611 | const DeclContext *DC = getEffectiveDeclContext(D); |
612 | |
613 | if (DC->isFunctionOrMethod() && D->hasLinkage()) |
614 | while (!DC->isNamespace() && !DC->isTranslationUnit()) |
615 | DC = getEffectiveParentContext(DC); |
616 | if (DC->isTranslationUnit() && D->getFormalLinkage() != InternalLinkage && |
617 | !CXXNameMangler::shouldHaveAbiTags(*this, VD) && |
618 | !isa<VarTemplateSpecializationDecl>(D)) |
619 | return false; |
620 | } |
621 | |
622 | return true; |
623 | } |
624 | |
625 | void CXXNameMangler::writeAbiTags(const NamedDecl *ND, |
626 | const AbiTagList *AdditionalAbiTags) { |
627 | (0) . __assert_fail ("AbiTags && \"require AbiTagState\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 627, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(AbiTags && "require AbiTagState"); |
628 | AbiTags->write(Out, ND, DisableDerivedAbiTags ? nullptr : AdditionalAbiTags); |
629 | } |
630 | |
631 | void CXXNameMangler::mangleSourceNameWithAbiTags( |
632 | const NamedDecl *ND, const AbiTagList *AdditionalAbiTags) { |
633 | mangleSourceName(ND->getIdentifier()); |
634 | writeAbiTags(ND, AdditionalAbiTags); |
635 | } |
636 | |
637 | void CXXNameMangler::mangle(const NamedDecl *D) { |
638 | |
639 | |
640 | |
641 | Out << "_Z"; |
642 | if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) |
643 | mangleFunctionEncoding(FD); |
644 | else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) |
645 | mangleName(VD); |
646 | else if (const IndirectFieldDecl *IFD = dyn_cast<IndirectFieldDecl>(D)) |
647 | mangleName(IFD->getAnonField()); |
648 | else |
649 | mangleName(cast<FieldDecl>(D)); |
650 | } |
651 | |
652 | void CXXNameMangler::mangleFunctionEncoding(const FunctionDecl *FD) { |
653 | |
654 | |
655 | |
656 | if (!Context.shouldMangleDeclName(FD)) { |
657 | mangleName(FD); |
658 | return; |
659 | } |
660 | |
661 | AbiTagList ReturnTypeAbiTags = makeFunctionReturnTypeTags(FD); |
662 | if (ReturnTypeAbiTags.empty()) { |
663 | |
664 | mangleName(FD); |
665 | mangleFunctionEncodingBareType(FD); |
666 | return; |
667 | } |
668 | |
669 | |
670 | |
671 | |
672 | SmallString<256> FunctionEncodingBuf; |
673 | llvm::raw_svector_ostream FunctionEncodingStream(FunctionEncodingBuf); |
674 | CXXNameMangler FunctionEncodingMangler(*this, FunctionEncodingStream); |
675 | |
676 | FunctionEncodingMangler.disableDerivedAbiTags(); |
677 | FunctionEncodingMangler.mangleNameWithAbiTags(FD, nullptr); |
678 | |
679 | |
680 | size_t EncodingPositionStart = FunctionEncodingStream.str().size(); |
681 | FunctionEncodingMangler.mangleFunctionEncodingBareType(FD); |
682 | |
683 | |
684 | |
685 | const AbiTagList &UsedAbiTags = |
686 | FunctionEncodingMangler.AbiTagsRoot.getSortedUniqueUsedAbiTags(); |
687 | AbiTagList AdditionalAbiTags(ReturnTypeAbiTags.size()); |
688 | AdditionalAbiTags.erase( |
689 | std::set_difference(ReturnTypeAbiTags.begin(), ReturnTypeAbiTags.end(), |
690 | UsedAbiTags.begin(), UsedAbiTags.end(), |
691 | AdditionalAbiTags.begin()), |
692 | AdditionalAbiTags.end()); |
693 | |
694 | |
695 | mangleNameWithAbiTags(FD, &AdditionalAbiTags); |
696 | Out << FunctionEncodingStream.str().substr(EncodingPositionStart); |
697 | |
698 | |
699 | |
700 | extendSubstitutions(&FunctionEncodingMangler); |
701 | } |
702 | |
703 | void CXXNameMangler::mangleFunctionEncodingBareType(const FunctionDecl *FD) { |
704 | if (FD->hasAttr<EnableIfAttr>()) { |
705 | FunctionTypeDepthState Saved = FunctionTypeDepth.push(); |
706 | Out << "Ua9enable_ifI"; |
707 | for (AttrVec::const_iterator I = FD->getAttrs().begin(), |
708 | E = FD->getAttrs().end(); |
709 | I != E; ++I) { |
710 | EnableIfAttr *EIA = dyn_cast<EnableIfAttr>(*I); |
711 | if (!EIA) |
712 | continue; |
713 | Out << 'X'; |
714 | mangleExpression(EIA->getCond()); |
715 | Out << 'E'; |
716 | } |
717 | Out << 'E'; |
718 | FunctionTypeDepth.pop(Saved); |
719 | } |
720 | |
721 | |
722 | |
723 | if (auto *CD = dyn_cast<CXXConstructorDecl>(FD)) |
724 | if (auto Inherited = CD->getInheritedConstructor()) |
725 | FD = Inherited.getConstructor(); |
726 | |
727 | |
728 | |
729 | |
730 | |
731 | |
732 | |
733 | |
734 | |
735 | |
736 | |
737 | |
738 | |
739 | |
740 | |
741 | |
742 | |
743 | bool MangleReturnType = false; |
744 | if (FunctionTemplateDecl *PrimaryTemplate = FD->getPrimaryTemplate()) { |
745 | if (!(isa<CXXConstructorDecl>(FD) || isa<CXXDestructorDecl>(FD) || |
746 | isa<CXXConversionDecl>(FD))) |
747 | MangleReturnType = true; |
748 | |
749 | |
750 | FD = PrimaryTemplate->getTemplatedDecl(); |
751 | } |
752 | |
753 | mangleBareFunctionType(FD->getType()->castAs<FunctionProtoType>(), |
754 | MangleReturnType, FD); |
755 | } |
756 | |
757 | static const DeclContext *IgnoreLinkageSpecDecls(const DeclContext *DC) { |
758 | while (isa<LinkageSpecDecl>(DC)) { |
759 | DC = getEffectiveParentContext(DC); |
760 | } |
761 | |
762 | return DC; |
763 | } |
764 | |
765 | |
766 | static bool isStd(const NamespaceDecl *NS) { |
767 | if (!IgnoreLinkageSpecDecls(getEffectiveParentContext(NS)) |
768 | ->isTranslationUnit()) |
769 | return false; |
770 | |
771 | const IdentifierInfo *II = NS->getOriginalNamespace()->getIdentifier(); |
772 | return II && II->isStr("std"); |
773 | } |
774 | |
775 | |
776 | |
777 | static bool isStdNamespace(const DeclContext *DC) { |
778 | if (!DC->isNamespace()) |
779 | return false; |
780 | |
781 | return isStd(cast<NamespaceDecl>(DC)); |
782 | } |
783 | |
784 | static const TemplateDecl * |
785 | isTemplate(const NamedDecl *ND, const TemplateArgumentList *&TemplateArgs) { |
786 | |
787 | if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) { |
788 | if (const TemplateDecl *TD = FD->getPrimaryTemplate()) { |
789 | TemplateArgs = FD->getTemplateSpecializationArgs(); |
790 | return TD; |
791 | } |
792 | } |
793 | |
794 | |
795 | if (const ClassTemplateSpecializationDecl *Spec = |
796 | dyn_cast<ClassTemplateSpecializationDecl>(ND)) { |
797 | TemplateArgs = &Spec->getTemplateArgs(); |
798 | return Spec->getSpecializedTemplate(); |
799 | } |
800 | |
801 | |
802 | if (const VarTemplateSpecializationDecl *Spec = |
803 | dyn_cast<VarTemplateSpecializationDecl>(ND)) { |
804 | TemplateArgs = &Spec->getTemplateArgs(); |
805 | return Spec->getSpecializedTemplate(); |
806 | } |
807 | |
808 | return nullptr; |
809 | } |
810 | |
811 | void CXXNameMangler::mangleName(const NamedDecl *ND) { |
812 | if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) { |
813 | |
814 | AbiTagList VariableTypeAbiTags = makeVariableTypeTags(VD); |
815 | if (VariableTypeAbiTags.empty()) { |
816 | |
817 | mangleNameWithAbiTags(VD, nullptr); |
818 | return; |
819 | } |
820 | |
821 | |
822 | llvm::raw_null_ostream NullOutStream; |
823 | CXXNameMangler VariableNameMangler(*this, NullOutStream); |
824 | VariableNameMangler.disableDerivedAbiTags(); |
825 | VariableNameMangler.mangleNameWithAbiTags(VD, nullptr); |
826 | |
827 | |
828 | const AbiTagList &UsedAbiTags = |
829 | VariableNameMangler.AbiTagsRoot.getSortedUniqueUsedAbiTags(); |
830 | AbiTagList AdditionalAbiTags(VariableTypeAbiTags.size()); |
831 | AdditionalAbiTags.erase( |
832 | std::set_difference(VariableTypeAbiTags.begin(), |
833 | VariableTypeAbiTags.end(), UsedAbiTags.begin(), |
834 | UsedAbiTags.end(), AdditionalAbiTags.begin()), |
835 | AdditionalAbiTags.end()); |
836 | |
837 | |
838 | mangleNameWithAbiTags(VD, &AdditionalAbiTags); |
839 | } else { |
840 | mangleNameWithAbiTags(ND, nullptr); |
841 | } |
842 | } |
843 | |
844 | void CXXNameMangler::mangleNameWithAbiTags(const NamedDecl *ND, |
845 | const AbiTagList *AdditionalAbiTags) { |
846 | |
847 | |
848 | |
849 | |
850 | |
851 | const DeclContext *DC = getEffectiveDeclContext(ND); |
852 | |
853 | |
854 | |
855 | |
856 | |
857 | if (isLocalContainerContext(DC) && ND->hasLinkage() && !isLambda(ND)) |
858 | while (!DC->isNamespace() && !DC->isTranslationUnit()) |
859 | DC = getEffectiveParentContext(DC); |
860 | else if (GetLocalClassDecl(ND)) { |
861 | mangleLocalName(ND, AdditionalAbiTags); |
862 | return; |
863 | } |
864 | |
865 | DC = IgnoreLinkageSpecDecls(DC); |
866 | |
867 | if (isLocalContainerContext(DC)) { |
868 | mangleLocalName(ND, AdditionalAbiTags); |
869 | return; |
870 | } |
871 | |
872 | |
873 | |
874 | |
875 | |
876 | if (!ND->hasExternalFormalLinkage()) |
877 | if (Module *M = ND->getOwningModuleForLinkage()) |
878 | mangleModuleName(M); |
879 | |
880 | if (DC->isTranslationUnit() || isStdNamespace(DC)) { |
881 | |
882 | const TemplateArgumentList *TemplateArgs = nullptr; |
883 | if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) { |
884 | mangleUnscopedTemplateName(TD, AdditionalAbiTags); |
885 | mangleTemplateArgs(*TemplateArgs); |
886 | return; |
887 | } |
888 | |
889 | mangleUnscopedName(ND, AdditionalAbiTags); |
890 | return; |
891 | } |
892 | |
893 | mangleNestedName(ND, DC, AdditionalAbiTags); |
894 | } |
895 | |
896 | void CXXNameMangler::mangleModuleName(const Module *M) { |
897 | |
898 | |
899 | |
900 | |
901 | |
902 | Out << 'W'; |
903 | mangleModuleNamePrefix(M->Name); |
904 | Out << 'E'; |
905 | } |
906 | |
907 | void CXXNameMangler::mangleModuleNamePrefix(StringRef Name) { |
908 | |
909 | |
910 | auto It = ModuleSubstitutions.find(Name); |
911 | if (It != ModuleSubstitutions.end()) { |
912 | if (It->second < 10) |
913 | Out << '_' << static_cast<char>('0' + It->second); |
914 | else |
915 | Out << 'W' << (It->second - 10) << '_'; |
916 | return; |
917 | } |
918 | |
919 | |
920 | |
921 | auto Parts = Name.rsplit('.'); |
922 | if (Parts.second.empty()) |
923 | Parts.second = Parts.first; |
924 | else |
925 | mangleModuleNamePrefix(Parts.first); |
926 | |
927 | Out << Parts.second.size() << Parts.second; |
928 | ModuleSubstitutions.insert({Name, ModuleSubstitutions.size()}); |
929 | } |
930 | |
931 | void CXXNameMangler::mangleTemplateName(const TemplateDecl *TD, |
932 | const TemplateArgument *TemplateArgs, |
933 | unsigned NumTemplateArgs) { |
934 | const DeclContext *DC = IgnoreLinkageSpecDecls(getEffectiveDeclContext(TD)); |
935 | |
936 | if (DC->isTranslationUnit() || isStdNamespace(DC)) { |
937 | mangleUnscopedTemplateName(TD, nullptr); |
938 | mangleTemplateArgs(TemplateArgs, NumTemplateArgs); |
939 | } else { |
940 | mangleNestedName(TD, TemplateArgs, NumTemplateArgs); |
941 | } |
942 | } |
943 | |
944 | void CXXNameMangler::mangleUnscopedName(const NamedDecl *ND, |
945 | const AbiTagList *AdditionalAbiTags) { |
946 | |
947 | |
948 | |
949 | if (isStdNamespace(IgnoreLinkageSpecDecls(getEffectiveDeclContext(ND)))) |
950 | Out << "St"; |
951 | |
952 | mangleUnqualifiedName(ND, AdditionalAbiTags); |
953 | } |
954 | |
955 | void CXXNameMangler::mangleUnscopedTemplateName( |
956 | const TemplateDecl *ND, const AbiTagList *AdditionalAbiTags) { |
957 | |
958 | |
959 | if (mangleSubstitution(ND)) |
960 | return; |
961 | |
962 | |
963 | if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) { |
964 | (0) . __assert_fail ("!AdditionalAbiTags && \"template template param cannot have abi tags\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 965, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!AdditionalAbiTags && |
965 | (0) . __assert_fail ("!AdditionalAbiTags && \"template template param cannot have abi tags\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 965, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "template template param cannot have abi tags"); |
966 | mangleTemplateParameter(TTP->getIndex()); |
967 | } else if (isa<BuiltinTemplateDecl>(ND)) { |
968 | mangleUnscopedName(ND, AdditionalAbiTags); |
969 | } else { |
970 | mangleUnscopedName(ND->getTemplatedDecl(), AdditionalAbiTags); |
971 | } |
972 | |
973 | addSubstitution(ND); |
974 | } |
975 | |
976 | void CXXNameMangler::mangleUnscopedTemplateName( |
977 | TemplateName Template, const AbiTagList *AdditionalAbiTags) { |
978 | |
979 | |
980 | if (TemplateDecl *TD = Template.getAsTemplateDecl()) |
981 | return mangleUnscopedTemplateName(TD, AdditionalAbiTags); |
982 | |
983 | if (mangleSubstitution(Template)) |
984 | return; |
985 | |
986 | (0) . __assert_fail ("!AdditionalAbiTags && \"dependent template name cannot have abi tags\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 987, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!AdditionalAbiTags && |
987 | (0) . __assert_fail ("!AdditionalAbiTags && \"dependent template name cannot have abi tags\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 987, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "dependent template name cannot have abi tags"); |
988 | |
989 | DependentTemplateName *Dependent = Template.getAsDependentTemplateName(); |
990 | (0) . __assert_fail ("Dependent && \"Not a dependent template name?\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 990, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(Dependent && "Not a dependent template name?"); |
991 | if (const IdentifierInfo *Id = Dependent->getIdentifier()) |
992 | mangleSourceName(Id); |
993 | else |
994 | mangleOperatorName(Dependent->getOperator(), UnknownArity); |
995 | |
996 | addSubstitution(Template); |
997 | } |
998 | |
999 | void CXXNameMangler::mangleFloat(const llvm::APFloat &f) { |
1000 | |
1001 | |
1002 | |
1003 | |
1004 | |
1005 | |
1006 | |
1007 | |
1008 | |
1009 | |
1010 | |
1011 | |
1012 | |
1013 | llvm::APInt valueBits = f.bitcastToAPInt(); |
1014 | unsigned numCharacters = (valueBits.getBitWidth() + 3) / 4; |
1015 | assert(numCharacters != 0); |
1016 | |
1017 | |
1018 | SmallVector<char, 20> buffer(numCharacters); |
1019 | |
1020 | |
1021 | for (unsigned stringIndex = 0; stringIndex != numCharacters; ++stringIndex) { |
1022 | |
1023 | unsigned digitBitIndex = 4 * (numCharacters - stringIndex - 1); |
1024 | |
1025 | |
1026 | uint64_t hexDigit = valueBits.getRawData()[digitBitIndex / 64]; |
1027 | hexDigit >>= (digitBitIndex % 64); |
1028 | hexDigit &= 0xF; |
1029 | |
1030 | |
1031 | static const char charForHex[16] = { |
1032 | '0', '1', '2', '3', '4', '5', '6', '7', |
1033 | '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' |
1034 | }; |
1035 | buffer[stringIndex] = charForHex[hexDigit]; |
1036 | } |
1037 | |
1038 | Out.write(buffer.data(), numCharacters); |
1039 | } |
1040 | |
1041 | void CXXNameMangler::mangleNumber(const llvm::APSInt &Value) { |
1042 | if (Value.isSigned() && Value.isNegative()) { |
1043 | Out << 'n'; |
1044 | Value.abs().print(Out, false); |
1045 | } else { |
1046 | Value.print(Out, false); |
1047 | } |
1048 | } |
1049 | |
1050 | void CXXNameMangler::mangleNumber(int64_t Number) { |
1051 | |
1052 | if (Number < 0) { |
1053 | Out << 'n'; |
1054 | Number = -Number; |
1055 | } |
1056 | |
1057 | Out << Number; |
1058 | } |
1059 | |
1060 | void CXXNameMangler::mangleCallOffset(int64_t NonVirtual, int64_t Virtual) { |
1061 | |
1062 | |
1063 | |
1064 | |
1065 | |
1066 | if (!Virtual) { |
1067 | Out << 'h'; |
1068 | mangleNumber(NonVirtual); |
1069 | Out << '_'; |
1070 | return; |
1071 | } |
1072 | |
1073 | Out << 'v'; |
1074 | mangleNumber(NonVirtual); |
1075 | Out << '_'; |
1076 | mangleNumber(Virtual); |
1077 | Out << '_'; |
1078 | } |
1079 | |
1080 | void CXXNameMangler::manglePrefix(QualType type) { |
1081 | if (const auto *TST = type->getAs<TemplateSpecializationType>()) { |
1082 | if (!mangleSubstitution(QualType(TST, 0))) { |
1083 | mangleTemplatePrefix(TST->getTemplateName()); |
1084 | |
1085 | |
1086 | |
1087 | |
1088 | mangleTemplateArgs(TST->getArgs(), TST->getNumArgs()); |
1089 | addSubstitution(QualType(TST, 0)); |
1090 | } |
1091 | } else if (const auto *DTST = |
1092 | type->getAs<DependentTemplateSpecializationType>()) { |
1093 | if (!mangleSubstitution(QualType(DTST, 0))) { |
1094 | TemplateName Template = getASTContext().getDependentTemplateName( |
1095 | DTST->getQualifier(), DTST->getIdentifier()); |
1096 | mangleTemplatePrefix(Template); |
1097 | |
1098 | |
1099 | |
1100 | |
1101 | mangleTemplateArgs(DTST->getArgs(), DTST->getNumArgs()); |
1102 | addSubstitution(QualType(DTST, 0)); |
1103 | } |
1104 | } else { |
1105 | |
1106 | |
1107 | mangleType(type); |
1108 | } |
1109 | } |
1110 | |
1111 | |
1112 | |
1113 | |
1114 | |
1115 | void CXXNameMangler::mangleUnresolvedPrefix(NestedNameSpecifier *qualifier, |
1116 | bool recursive) { |
1117 | |
1118 | |
1119 | |
1120 | |
1121 | |
1122 | |
1123 | |
1124 | |
1125 | |
1126 | |
1127 | |
1128 | |
1129 | |
1130 | |
1131 | |
1132 | switch (qualifier->getKind()) { |
1133 | case NestedNameSpecifier::Global: |
1134 | Out << "gs"; |
1135 | |
1136 | |
1137 | if (recursive) |
1138 | Out << "sr"; |
1139 | |
1140 | |
1141 | return; |
1142 | |
1143 | case NestedNameSpecifier::Super: |
1144 | llvm_unreachable("Can't mangle __super specifier"); |
1145 | |
1146 | case NestedNameSpecifier::Namespace: |
1147 | if (qualifier->getPrefix()) |
1148 | mangleUnresolvedPrefix(qualifier->getPrefix(), |
1149 | true); |
1150 | else |
1151 | Out << "sr"; |
1152 | mangleSourceNameWithAbiTags(qualifier->getAsNamespace()); |
1153 | break; |
1154 | case NestedNameSpecifier::NamespaceAlias: |
1155 | if (qualifier->getPrefix()) |
1156 | mangleUnresolvedPrefix(qualifier->getPrefix(), |
1157 | true); |
1158 | else |
1159 | Out << "sr"; |
1160 | mangleSourceNameWithAbiTags(qualifier->getAsNamespaceAlias()); |
1161 | break; |
1162 | |
1163 | case NestedNameSpecifier::TypeSpec: |
1164 | case NestedNameSpecifier::TypeSpecWithTemplate: { |
1165 | const Type *type = qualifier->getAsType(); |
1166 | |
1167 | |
1168 | |
1169 | |
1170 | |
1171 | |
1172 | if (qualifier->getPrefix()) { |
1173 | mangleUnresolvedPrefix(qualifier->getPrefix(), |
1174 | true); |
1175 | } else { |
1176 | |
1177 | Out << "sr"; |
1178 | } |
1179 | |
1180 | if (mangleUnresolvedTypeOrSimpleId(QualType(type, 0), recursive ? "N" : "")) |
1181 | return; |
1182 | |
1183 | break; |
1184 | } |
1185 | |
1186 | case NestedNameSpecifier::Identifier: |
1187 | |
1188 | if (qualifier->getPrefix()) |
1189 | mangleUnresolvedPrefix(qualifier->getPrefix(), |
1190 | true); |
1191 | else |
1192 | Out << "sr"; |
1193 | |
1194 | mangleSourceName(qualifier->getAsIdentifier()); |
1195 | |
1196 | break; |
1197 | } |
1198 | |
1199 | |
1200 | |
1201 | if (!recursive) |
1202 | Out << 'E'; |
1203 | } |
1204 | |
1205 | |
1206 | |
1207 | void CXXNameMangler::mangleUnresolvedName( |
1208 | NestedNameSpecifier *qualifier, DeclarationName name, |
1209 | const TemplateArgumentLoc *TemplateArgs, unsigned NumTemplateArgs, |
1210 | unsigned knownArity) { |
1211 | if (qualifier) mangleUnresolvedPrefix(qualifier); |
1212 | switch (name.getNameKind()) { |
1213 | |
1214 | case DeclarationName::Identifier: |
1215 | mangleSourceName(name.getAsIdentifierInfo()); |
1216 | break; |
1217 | |
1218 | case DeclarationName::CXXDestructorName: |
1219 | Out << "dn"; |
1220 | mangleUnresolvedTypeOrSimpleId(name.getCXXNameType()); |
1221 | break; |
1222 | |
1223 | case DeclarationName::CXXConversionFunctionName: |
1224 | case DeclarationName::CXXLiteralOperatorName: |
1225 | case DeclarationName::CXXOperatorName: |
1226 | Out << "on"; |
1227 | mangleOperatorName(name, knownArity); |
1228 | break; |
1229 | case DeclarationName::CXXConstructorName: |
1230 | llvm_unreachable("Can't mangle a constructor name!"); |
1231 | case DeclarationName::CXXUsingDirective: |
1232 | llvm_unreachable("Can't mangle a using directive name!"); |
1233 | case DeclarationName::CXXDeductionGuideName: |
1234 | llvm_unreachable("Can't mangle a deduction guide name!"); |
1235 | case DeclarationName::ObjCMultiArgSelector: |
1236 | case DeclarationName::ObjCOneArgSelector: |
1237 | case DeclarationName::ObjCZeroArgSelector: |
1238 | llvm_unreachable("Can't mangle Objective-C selector names here!"); |
1239 | } |
1240 | |
1241 | |
1242 | |
1243 | if (TemplateArgs) |
1244 | mangleTemplateArgs(TemplateArgs, NumTemplateArgs); |
1245 | } |
1246 | |
1247 | void CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND, |
1248 | DeclarationName Name, |
1249 | unsigned KnownArity, |
1250 | const AbiTagList *AdditionalAbiTags) { |
1251 | unsigned Arity = KnownArity; |
1252 | |
1253 | |
1254 | |
1255 | switch (Name.getNameKind()) { |
1256 | case DeclarationName::Identifier: { |
1257 | const IdentifierInfo *II = Name.getAsIdentifierInfo(); |
1258 | |
1259 | |
1260 | if (auto *DD = dyn_cast<DecompositionDecl>(ND)) { |
1261 | |
1262 | |
1263 | |
1264 | |
1265 | |
1266 | |
1267 | |
1268 | Out << "DC"; |
1269 | for (auto *BD : DD->bindings()) |
1270 | mangleSourceName(BD->getDeclName().getAsIdentifierInfo()); |
1271 | Out << 'E'; |
1272 | writeAbiTags(ND, AdditionalAbiTags); |
1273 | break; |
1274 | } |
1275 | |
1276 | if (II) { |
1277 | |
1278 | |
1279 | |
1280 | |
1281 | |
1282 | |
1283 | |
1284 | |
1285 | |
1286 | |
1287 | |
1288 | |
1289 | |
1290 | if (ND && ND->getFormalLinkage() == InternalLinkage && |
1291 | !ND->isExternallyVisible() && |
1292 | getEffectiveDeclContext(ND)->isFileContext() && |
1293 | !ND->isInAnonymousNamespace()) |
1294 | Out << 'L'; |
1295 | |
1296 | auto *FD = dyn_cast<FunctionDecl>(ND); |
1297 | bool IsRegCall = FD && |
1298 | FD->getType()->castAs<FunctionType>()->getCallConv() == |
1299 | clang::CC_X86RegCall; |
1300 | if (IsRegCall) |
1301 | mangleRegCallName(II); |
1302 | else |
1303 | mangleSourceName(II); |
1304 | |
1305 | writeAbiTags(ND, AdditionalAbiTags); |
1306 | break; |
1307 | } |
1308 | |
1309 | |
1310 | (0) . __assert_fail ("ND && \"mangling empty name without declaration\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1310, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(ND && "mangling empty name without declaration"); |
1311 | |
1312 | if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) { |
1313 | if (NS->isAnonymousNamespace()) { |
1314 | |
1315 | Out << "12_GLOBAL__N_1"; |
1316 | break; |
1317 | } |
1318 | } |
1319 | |
1320 | if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) { |
1321 | |
1322 | const RecordDecl *RD = VD->getType()->getAs<RecordType>()->getDecl(); |
1323 | |
1324 | |
1325 | |
1326 | |
1327 | |
1328 | |
1329 | |
1330 | |
1331 | |
1332 | |
1333 | (0) . __assert_fail ("RD->isAnonymousStructOrUnion() && \"Expected anonymous struct or union!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1334, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(RD->isAnonymousStructOrUnion() |
1334 | (0) . __assert_fail ("RD->isAnonymousStructOrUnion() && \"Expected anonymous struct or union!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1334, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> && "Expected anonymous struct or union!"); |
1335 | const FieldDecl *FD = RD->findFirstNamedDataMember(); |
1336 | |
1337 | |
1338 | |
1339 | |
1340 | if (!FD) break; |
1341 | (0) . __assert_fail ("FD->getIdentifier() && \"Data member name isn't an identifier!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1341, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(FD->getIdentifier() && "Data member name isn't an identifier!"); |
1342 | |
1343 | mangleSourceName(FD->getIdentifier()); |
1344 | |
1345 | break; |
1346 | } |
1347 | |
1348 | |
1349 | |
1350 | |
1351 | |
1352 | |
1353 | |
1354 | if (isa<ObjCContainerDecl>(ND)) |
1355 | break; |
1356 | |
1357 | |
1358 | const TagDecl *TD = cast<TagDecl>(ND); |
1359 | if (const TypedefNameDecl *D = TD->getTypedefNameForAnonDecl()) { |
1360 | (0) . __assert_fail ("TD->getDeclContext() == D->getDeclContext() && \"Typedef should not be in another decl context!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1361, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(TD->getDeclContext() == D->getDeclContext() && |
1361 | (0) . __assert_fail ("TD->getDeclContext() == D->getDeclContext() && \"Typedef should not be in another decl context!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1361, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "Typedef should not be in another decl context!"); |
1362 | (0) . __assert_fail ("D->getDeclName().getAsIdentifierInfo() && \"Typedef was not named!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1363, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(D->getDeclName().getAsIdentifierInfo() && |
1363 | (0) . __assert_fail ("D->getDeclName().getAsIdentifierInfo() && \"Typedef was not named!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1363, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "Typedef was not named!"); |
1364 | mangleSourceName(D->getDeclName().getAsIdentifierInfo()); |
1365 | (0) . __assert_fail ("!AdditionalAbiTags && \"Type cannot have additional abi tags\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1365, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!AdditionalAbiTags && "Type cannot have additional abi tags"); |
1366 | |
1367 | |
1368 | writeAbiTags(TD, nullptr); |
1369 | break; |
1370 | } |
1371 | |
1372 | |
1373 | |
1374 | |
1375 | |
1376 | if (const CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(TD)) { |
1377 | if (Record->isLambda() && Record->getLambdaManglingNumber()) { |
1378 | (0) . __assert_fail ("!AdditionalAbiTags && \"Lambda type cannot have additional abi tags\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1379, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!AdditionalAbiTags && |
1379 | (0) . __assert_fail ("!AdditionalAbiTags && \"Lambda type cannot have additional abi tags\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1379, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "Lambda type cannot have additional abi tags"); |
1380 | mangleLambda(Record); |
1381 | break; |
1382 | } |
1383 | } |
1384 | |
1385 | if (TD->isExternallyVisible()) { |
1386 | unsigned UnnamedMangle = getASTContext().getManglingNumber(TD); |
1387 | Out << "Ut"; |
1388 | if (UnnamedMangle > 1) |
1389 | Out << UnnamedMangle - 2; |
1390 | Out << '_'; |
1391 | writeAbiTags(TD, AdditionalAbiTags); |
1392 | break; |
1393 | } |
1394 | |
1395 | |
1396 | |
1397 | unsigned AnonStructId = NullOut ? 0 : Context.getAnonymousStructId(TD); |
1398 | |
1399 | |
1400 | |
1401 | |
1402 | SmallString<8> Str; |
1403 | Str += "$_"; |
1404 | Str += llvm::utostr(AnonStructId); |
1405 | |
1406 | Out << Str.size(); |
1407 | Out << Str; |
1408 | break; |
1409 | } |
1410 | |
1411 | case DeclarationName::ObjCZeroArgSelector: |
1412 | case DeclarationName::ObjCOneArgSelector: |
1413 | case DeclarationName::ObjCMultiArgSelector: |
1414 | llvm_unreachable("Can't mangle Objective-C selector names here!"); |
1415 | |
1416 | case DeclarationName::CXXConstructorName: { |
1417 | const CXXRecordDecl *InheritedFrom = nullptr; |
1418 | const TemplateArgumentList *InheritedTemplateArgs = nullptr; |
1419 | if (auto Inherited = |
1420 | cast<CXXConstructorDecl>(ND)->getInheritedConstructor()) { |
1421 | InheritedFrom = Inherited.getConstructor()->getParent(); |
1422 | InheritedTemplateArgs = |
1423 | Inherited.getConstructor()->getTemplateSpecializationArgs(); |
1424 | } |
1425 | |
1426 | if (ND == Structor) |
1427 | |
1428 | |
1429 | mangleCXXCtorType(static_cast<CXXCtorType>(StructorType), InheritedFrom); |
1430 | else |
1431 | |
1432 | |
1433 | mangleCXXCtorType(Ctor_Complete, InheritedFrom); |
1434 | |
1435 | |
1436 | |
1437 | if (InheritedTemplateArgs) |
1438 | mangleTemplateArgs(*InheritedTemplateArgs); |
1439 | |
1440 | writeAbiTags(ND, AdditionalAbiTags); |
1441 | break; |
1442 | } |
1443 | |
1444 | case DeclarationName::CXXDestructorName: |
1445 | if (ND == Structor) |
1446 | |
1447 | |
1448 | mangleCXXDtorType(static_cast<CXXDtorType>(StructorType)); |
1449 | else |
1450 | |
1451 | |
1452 | mangleCXXDtorType(Dtor_Complete); |
1453 | writeAbiTags(ND, AdditionalAbiTags); |
1454 | break; |
1455 | |
1456 | case DeclarationName::CXXOperatorName: |
1457 | if (ND && Arity == UnknownArity) { |
1458 | Arity = cast<FunctionDecl>(ND)->getNumParams(); |
1459 | |
1460 | |
1461 | if (const auto *MD = dyn_cast<CXXMethodDecl>(ND)) |
1462 | if (!MD->isStatic()) |
1463 | Arity++; |
1464 | } |
1465 | LLVM_FALLTHROUGH; |
1466 | case DeclarationName::CXXConversionFunctionName: |
1467 | case DeclarationName::CXXLiteralOperatorName: |
1468 | mangleOperatorName(Name, Arity); |
1469 | writeAbiTags(ND, AdditionalAbiTags); |
1470 | break; |
1471 | |
1472 | case DeclarationName::CXXDeductionGuideName: |
1473 | llvm_unreachable("Can't mangle a deduction guide name!"); |
1474 | |
1475 | case DeclarationName::CXXUsingDirective: |
1476 | llvm_unreachable("Can't mangle a using directive name!"); |
1477 | } |
1478 | } |
1479 | |
1480 | void CXXNameMangler::mangleRegCallName(const IdentifierInfo *II) { |
1481 | |
1482 | |
1483 | |
1484 | Out << II->getLength() + sizeof("__regcall3__") - 1 << "__regcall3__" |
1485 | << II->getName(); |
1486 | } |
1487 | |
1488 | void CXXNameMangler::mangleSourceName(const IdentifierInfo *II) { |
1489 | |
1490 | |
1491 | |
1492 | Out << II->getLength() << II->getName(); |
1493 | } |
1494 | |
1495 | void CXXNameMangler::mangleNestedName(const NamedDecl *ND, |
1496 | const DeclContext *DC, |
1497 | const AbiTagList *AdditionalAbiTags, |
1498 | bool NoFunction) { |
1499 | |
1500 | |
1501 | |
1502 | |
1503 | |
1504 | Out << 'N'; |
1505 | if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(ND)) { |
1506 | Qualifiers MethodQuals = Method->getMethodQualifiers(); |
1507 | |
1508 | |
1509 | MethodQuals.removeRestrict(); |
1510 | mangleQualifiers(MethodQuals); |
1511 | mangleRefQualifier(Method->getRefQualifier()); |
1512 | } |
1513 | |
1514 | |
1515 | const TemplateArgumentList *TemplateArgs = nullptr; |
1516 | if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) { |
1517 | mangleTemplatePrefix(TD, NoFunction); |
1518 | mangleTemplateArgs(*TemplateArgs); |
1519 | } |
1520 | else { |
1521 | manglePrefix(DC, NoFunction); |
1522 | mangleUnqualifiedName(ND, AdditionalAbiTags); |
1523 | } |
1524 | |
1525 | Out << 'E'; |
1526 | } |
1527 | void CXXNameMangler::mangleNestedName(const TemplateDecl *TD, |
1528 | const TemplateArgument *TemplateArgs, |
1529 | unsigned NumTemplateArgs) { |
1530 | |
1531 | |
1532 | Out << 'N'; |
1533 | |
1534 | mangleTemplatePrefix(TD); |
1535 | mangleTemplateArgs(TemplateArgs, NumTemplateArgs); |
1536 | |
1537 | Out << 'E'; |
1538 | } |
1539 | |
1540 | void CXXNameMangler::mangleLocalName(const Decl *D, |
1541 | const AbiTagList *AdditionalAbiTags) { |
1542 | |
1543 | |
1544 | |
1545 | |
1546 | |
1547 | (D) || isa(D)", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1547, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(isa<NamedDecl>(D) || isa<BlockDecl>(D)); |
1548 | const RecordDecl *RD = GetLocalClassDecl(D); |
1549 | const DeclContext *DC = getEffectiveDeclContext(RD ? RD : D); |
1550 | |
1551 | Out << 'Z'; |
1552 | |
1553 | { |
1554 | AbiTagState LocalAbiTags(AbiTags); |
1555 | |
1556 | if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(DC)) |
1557 | mangleObjCMethodName(MD); |
1558 | else if (const BlockDecl *BD = dyn_cast<BlockDecl>(DC)) |
1559 | mangleBlockForPrefix(BD); |
1560 | else |
1561 | mangleFunctionEncoding(cast<FunctionDecl>(DC)); |
1562 | |
1563 | |
1564 | |
1565 | LocalAbiTags.setUsedAbiTags(LocalAbiTags.getEmittedAbiTags()); |
1566 | } |
1567 | |
1568 | Out << 'E'; |
1569 | |
1570 | |
1571 | |
1572 | |
1573 | if (RD) { |
1574 | |
1575 | |
1576 | |
1577 | |
1578 | |
1579 | const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD); |
1580 | if (CXXRD && CXXRD->isLambda()) { |
1581 | if (const ParmVarDecl *Parm |
1582 | = dyn_cast_or_null<ParmVarDecl>(CXXRD->getLambdaContextDecl())) { |
1583 | if (const FunctionDecl *Func |
1584 | = dyn_cast<FunctionDecl>(Parm->getDeclContext())) { |
1585 | Out << 'd'; |
1586 | unsigned Num = Func->getNumParams() - Parm->getFunctionScopeIndex(); |
1587 | if (Num > 1) |
1588 | mangleNumber(Num - 2); |
1589 | Out << '_'; |
1590 | } |
1591 | } |
1592 | } |
1593 | |
1594 | |
1595 | |
1596 | if (D == RD) { |
1597 | mangleUnqualifiedName(RD, AdditionalAbiTags); |
1598 | } else if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) { |
1599 | manglePrefix(getEffectiveDeclContext(BD), true ); |
1600 | (0) . __assert_fail ("!AdditionalAbiTags && \"Block cannot have additional abi tags\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1600, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!AdditionalAbiTags && "Block cannot have additional abi tags"); |
1601 | mangleUnqualifiedBlock(BD); |
1602 | } else { |
1603 | const NamedDecl *ND = cast<NamedDecl>(D); |
1604 | mangleNestedName(ND, getEffectiveDeclContext(ND), AdditionalAbiTags, |
1605 | true ); |
1606 | } |
1607 | } else if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) { |
1608 | |
1609 | |
1610 | if (const ParmVarDecl *Parm |
1611 | = dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl())) { |
1612 | if (const FunctionDecl *Func |
1613 | = dyn_cast<FunctionDecl>(Parm->getDeclContext())) { |
1614 | Out << 'd'; |
1615 | unsigned Num = Func->getNumParams() - Parm->getFunctionScopeIndex(); |
1616 | if (Num > 1) |
1617 | mangleNumber(Num - 2); |
1618 | Out << '_'; |
1619 | } |
1620 | } |
1621 | |
1622 | (0) . __assert_fail ("!AdditionalAbiTags && \"Block cannot have additional abi tags\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1622, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!AdditionalAbiTags && "Block cannot have additional abi tags"); |
1623 | mangleUnqualifiedBlock(BD); |
1624 | } else { |
1625 | mangleUnqualifiedName(cast<NamedDecl>(D), AdditionalAbiTags); |
1626 | } |
1627 | |
1628 | if (const NamedDecl *ND = dyn_cast<NamedDecl>(RD ? RD : D)) { |
1629 | unsigned disc; |
1630 | if (Context.getNextDiscriminator(ND, disc)) { |
1631 | if (disc < 10) |
1632 | Out << '_' << disc; |
1633 | else |
1634 | Out << "__" << disc << '_'; |
1635 | } |
1636 | } |
1637 | } |
1638 | |
1639 | void CXXNameMangler::mangleBlockForPrefix(const BlockDecl *Block) { |
1640 | if (GetLocalClassDecl(Block)) { |
1641 | mangleLocalName(Block, nullptr); |
1642 | return; |
1643 | } |
1644 | const DeclContext *DC = getEffectiveDeclContext(Block); |
1645 | if (isLocalContainerContext(DC)) { |
1646 | mangleLocalName(Block, nullptr); |
1647 | return; |
1648 | } |
1649 | manglePrefix(getEffectiveDeclContext(Block)); |
1650 | mangleUnqualifiedBlock(Block); |
1651 | } |
1652 | |
1653 | void CXXNameMangler::mangleUnqualifiedBlock(const BlockDecl *Block) { |
1654 | if (Decl *Context = Block->getBlockManglingContextDecl()) { |
1655 | if ((isa<VarDecl>(Context) || isa<FieldDecl>(Context)) && |
1656 | Context->getDeclContext()->isRecord()) { |
1657 | const auto *ND = cast<NamedDecl>(Context); |
1658 | if (ND->getIdentifier()) { |
1659 | mangleSourceNameWithAbiTags(ND); |
1660 | Out << 'M'; |
1661 | } |
1662 | } |
1663 | } |
1664 | |
1665 | |
1666 | unsigned Number = Block->getBlockManglingNumber(); |
1667 | |
1668 | |
1669 | if (!Number) |
1670 | Number = Context.getBlockId(Block, false); |
1671 | else { |
1672 | |
1673 | --Number; |
1674 | } |
1675 | Out << "Ub"; |
1676 | if (Number > 0) |
1677 | Out << Number - 1; |
1678 | Out << '_'; |
1679 | } |
1680 | |
1681 | void CXXNameMangler::mangleLambda(const CXXRecordDecl *Lambda) { |
1682 | |
1683 | |
1684 | |
1685 | |
1686 | |
1687 | |
1688 | |
1689 | |
1690 | |
1691 | if (Decl *Context = Lambda->getLambdaContextDecl()) { |
1692 | if ((isa<VarDecl>(Context) || isa<FieldDecl>(Context)) && |
1693 | !isa<ParmVarDecl>(Context)) { |
1694 | |
1695 | |
1696 | if (const IdentifierInfo *Name |
1697 | = cast<NamedDecl>(Context)->getIdentifier()) { |
1698 | mangleSourceName(Name); |
1699 | const TemplateArgumentList *TemplateArgs = nullptr; |
1700 | if (isTemplate(cast<NamedDecl>(Context), TemplateArgs)) |
1701 | mangleTemplateArgs(*TemplateArgs); |
1702 | Out << 'M'; |
1703 | } |
1704 | } |
1705 | } |
1706 | |
1707 | Out << "Ul"; |
1708 | const FunctionProtoType *Proto = Lambda->getLambdaTypeInfo()->getType()-> |
1709 | getAs<FunctionProtoType>(); |
1710 | mangleBareFunctionType(Proto, , |
1711 | Lambda->getLambdaStaticInvoker()); |
1712 | Out << "E"; |
1713 | |
1714 | |
1715 | |
1716 | |
1717 | |
1718 | |
1719 | unsigned Number = Lambda->getLambdaManglingNumber(); |
1720 | (0) . __assert_fail ("Number > 0 && \"Lambda should be mangled as an unnamed class\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1720, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(Number > 0 && "Lambda should be mangled as an unnamed class"); |
1721 | if (Number > 1) |
1722 | mangleNumber(Number - 2); |
1723 | Out << '_'; |
1724 | } |
1725 | |
1726 | void CXXNameMangler::manglePrefix(NestedNameSpecifier *qualifier) { |
1727 | switch (qualifier->getKind()) { |
1728 | case NestedNameSpecifier::Global: |
1729 | |
1730 | return; |
1731 | |
1732 | case NestedNameSpecifier::Super: |
1733 | llvm_unreachable("Can't mangle __super specifier"); |
1734 | |
1735 | case NestedNameSpecifier::Namespace: |
1736 | mangleName(qualifier->getAsNamespace()); |
1737 | return; |
1738 | |
1739 | case NestedNameSpecifier::NamespaceAlias: |
1740 | mangleName(qualifier->getAsNamespaceAlias()->getNamespace()); |
1741 | return; |
1742 | |
1743 | case NestedNameSpecifier::TypeSpec: |
1744 | case NestedNameSpecifier::TypeSpecWithTemplate: |
1745 | manglePrefix(QualType(qualifier->getAsType(), 0)); |
1746 | return; |
1747 | |
1748 | case NestedNameSpecifier::Identifier: |
1749 | |
1750 | |
1751 | getPrefix()", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1751, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(qualifier->getPrefix()); |
1752 | manglePrefix(qualifier->getPrefix()); |
1753 | |
1754 | mangleSourceName(qualifier->getAsIdentifier()); |
1755 | return; |
1756 | } |
1757 | |
1758 | llvm_unreachable("unexpected nested name specifier"); |
1759 | } |
1760 | |
1761 | void CXXNameMangler::manglePrefix(const DeclContext *DC, bool NoFunction) { |
1762 | |
1763 | |
1764 | |
1765 | |
1766 | |
1767 | |
1768 | DC = IgnoreLinkageSpecDecls(DC); |
1769 | |
1770 | if (DC->isTranslationUnit()) |
1771 | return; |
1772 | |
1773 | if (NoFunction && isLocalContainerContext(DC)) |
1774 | return; |
1775 | |
1776 | assert(!isLocalContainerContext(DC)); |
1777 | |
1778 | const NamedDecl *ND = cast<NamedDecl>(DC); |
1779 | if (mangleSubstitution(ND)) |
1780 | return; |
1781 | |
1782 | |
1783 | const TemplateArgumentList *TemplateArgs = nullptr; |
1784 | if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) { |
1785 | mangleTemplatePrefix(TD); |
1786 | mangleTemplateArgs(*TemplateArgs); |
1787 | } else { |
1788 | manglePrefix(getEffectiveDeclContext(ND), NoFunction); |
1789 | mangleUnqualifiedName(ND, nullptr); |
1790 | } |
1791 | |
1792 | addSubstitution(ND); |
1793 | } |
1794 | |
1795 | void CXXNameMangler::mangleTemplatePrefix(TemplateName Template) { |
1796 | |
1797 | |
1798 | |
1799 | if (TemplateDecl *TD = Template.getAsTemplateDecl()) |
1800 | return mangleTemplatePrefix(TD); |
1801 | |
1802 | if (QualifiedTemplateName *Qualified = Template.getAsQualifiedTemplateName()) |
1803 | manglePrefix(Qualified->getQualifier()); |
1804 | |
1805 | if (OverloadedTemplateStorage *Overloaded |
1806 | = Template.getAsOverloadedTemplate()) { |
1807 | mangleUnqualifiedName(nullptr, (*Overloaded->begin())->getDeclName(), |
1808 | UnknownArity, nullptr); |
1809 | return; |
1810 | } |
1811 | |
1812 | DependentTemplateName *Dependent = Template.getAsDependentTemplateName(); |
1813 | (0) . __assert_fail ("Dependent && \"Unknown template name kind?\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1813, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(Dependent && "Unknown template name kind?"); |
1814 | if (NestedNameSpecifier *Qualifier = Dependent->getQualifier()) |
1815 | manglePrefix(Qualifier); |
1816 | mangleUnscopedTemplateName(Template, nullptr); |
1817 | } |
1818 | |
1819 | void CXXNameMangler::mangleTemplatePrefix(const TemplateDecl *ND, |
1820 | bool NoFunction) { |
1821 | |
1822 | |
1823 | |
1824 | |
1825 | |
1826 | |
1827 | if (mangleSubstitution(ND)) |
1828 | return; |
1829 | |
1830 | |
1831 | if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) { |
1832 | mangleTemplateParameter(TTP->getIndex()); |
1833 | } else { |
1834 | manglePrefix(getEffectiveDeclContext(ND), NoFunction); |
1835 | if (isa<BuiltinTemplateDecl>(ND)) |
1836 | mangleUnqualifiedName(ND, nullptr); |
1837 | else |
1838 | mangleUnqualifiedName(ND->getTemplatedDecl(), nullptr); |
1839 | } |
1840 | |
1841 | addSubstitution(ND); |
1842 | } |
1843 | |
1844 | |
1845 | |
1846 | |
1847 | |
1848 | |
1849 | void CXXNameMangler::mangleType(TemplateName TN) { |
1850 | if (mangleSubstitution(TN)) |
1851 | return; |
1852 | |
1853 | TemplateDecl *TD = nullptr; |
1854 | |
1855 | switch (TN.getKind()) { |
1856 | case TemplateName::QualifiedTemplate: |
1857 | TD = TN.getAsQualifiedTemplateName()->getTemplateDecl(); |
1858 | goto HaveDecl; |
1859 | |
1860 | case TemplateName::Template: |
1861 | TD = TN.getAsTemplateDecl(); |
1862 | goto HaveDecl; |
1863 | |
1864 | HaveDecl: |
1865 | if (isa<TemplateTemplateParmDecl>(TD)) |
1866 | mangleTemplateParameter(cast<TemplateTemplateParmDecl>(TD)->getIndex()); |
1867 | else |
1868 | mangleName(TD); |
1869 | break; |
1870 | |
1871 | case TemplateName::OverloadedTemplate: |
1872 | llvm_unreachable("can't mangle an overloaded template name as a <type>"); |
1873 | |
1874 | case TemplateName::DependentTemplate: { |
1875 | const DependentTemplateName *Dependent = TN.getAsDependentTemplateName(); |
1876 | isIdentifier()", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 1876, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(Dependent->isIdentifier()); |
1877 | |
1878 | |
1879 | |
1880 | mangleUnresolvedPrefix(Dependent->getQualifier()); |
1881 | mangleSourceName(Dependent->getIdentifier()); |
1882 | break; |
1883 | } |
1884 | |
1885 | case TemplateName::SubstTemplateTemplateParm: { |
1886 | |
1887 | |
1888 | |
1889 | |
1890 | SubstTemplateTemplateParmStorage *subst |
1891 | = TN.getAsSubstTemplateTemplateParm(); |
1892 | mangleType(subst->getReplacement()); |
1893 | return; |
1894 | } |
1895 | |
1896 | case TemplateName::SubstTemplateTemplateParmPack: { |
1897 | |
1898 | |
1899 | |
1900 | |
1901 | Out << "_SUBSTPACK_"; |
1902 | break; |
1903 | } |
1904 | } |
1905 | |
1906 | addSubstitution(TN); |
1907 | } |
1908 | |
1909 | bool CXXNameMangler::mangleUnresolvedTypeOrSimpleId(QualType Ty, |
1910 | StringRef Prefix) { |
1911 | |
1912 | switch (Ty->getTypeClass()) { |
1913 | case Type::Builtin: |
1914 | case Type::Complex: |
1915 | case Type::Adjusted: |
1916 | case Type::Decayed: |
1917 | case Type::Pointer: |
1918 | case Type::BlockPointer: |
1919 | case Type::LValueReference: |
1920 | case Type::RValueReference: |
1921 | case Type::MemberPointer: |
1922 | case Type::ConstantArray: |
1923 | case Type::IncompleteArray: |
1924 | case Type::VariableArray: |
1925 | case Type::DependentSizedArray: |
1926 | case Type::DependentAddressSpace: |
1927 | case Type::DependentVector: |
1928 | case Type::DependentSizedExtVector: |
1929 | case Type::Vector: |
1930 | case Type::ExtVector: |
1931 | case Type::FunctionProto: |
1932 | case Type::FunctionNoProto: |
1933 | case Type::Paren: |
1934 | case Type::Attributed: |
1935 | case Type::Auto: |
1936 | case Type::DeducedTemplateSpecialization: |
1937 | case Type::PackExpansion: |
1938 | case Type::ObjCObject: |
1939 | case Type::ObjCInterface: |
1940 | case Type::ObjCObjectPointer: |
1941 | case Type::ObjCTypeParam: |
1942 | case Type::Atomic: |
1943 | case Type::Pipe: |
1944 | llvm_unreachable("type is illegal as a nested name specifier"); |
1945 | |
1946 | case Type::SubstTemplateTypeParmPack: |
1947 | |
1948 | |
1949 | |
1950 | |
1951 | Out << "_SUBSTPACK_"; |
1952 | break; |
1953 | |
1954 | |
1955 | |
1956 | |
1957 | |
1958 | case Type::TypeOfExpr: |
1959 | case Type::TypeOf: |
1960 | case Type::Decltype: |
1961 | case Type::TemplateTypeParm: |
1962 | case Type::UnaryTransform: |
1963 | case Type::SubstTemplateTypeParm: |
1964 | unresolvedType: |
1965 | |
1966 | Out << Prefix; |
1967 | |
1968 | |
1969 | |
1970 | mangleType(Ty); |
1971 | |
1972 | |
1973 | |
1974 | return true; |
1975 | |
1976 | case Type::Typedef: |
1977 | mangleSourceNameWithAbiTags(cast<TypedefType>(Ty)->getDecl()); |
1978 | break; |
1979 | |
1980 | case Type::UnresolvedUsing: |
1981 | mangleSourceNameWithAbiTags( |
1982 | cast<UnresolvedUsingType>(Ty)->getDecl()); |
1983 | break; |
1984 | |
1985 | case Type::Enum: |
1986 | case Type::Record: |
1987 | mangleSourceNameWithAbiTags(cast<TagType>(Ty)->getDecl()); |
1988 | break; |
1989 | |
1990 | case Type::TemplateSpecialization: { |
1991 | const TemplateSpecializationType *TST = |
1992 | cast<TemplateSpecializationType>(Ty); |
1993 | TemplateName TN = TST->getTemplateName(); |
1994 | switch (TN.getKind()) { |
1995 | case TemplateName::Template: |
1996 | case TemplateName::QualifiedTemplate: { |
1997 | TemplateDecl *TD = TN.getAsTemplateDecl(); |
1998 | |
1999 | |
2000 | |
2001 | (0) . __assert_fail ("TD && \"no template for template specialization type\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 2001, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(TD && "no template for template specialization type"); |
2002 | if (isa<TemplateTemplateParmDecl>(TD)) |
2003 | goto unresolvedType; |
2004 | |
2005 | mangleSourceNameWithAbiTags(TD); |
2006 | break; |
2007 | } |
2008 | |
2009 | case TemplateName::OverloadedTemplate: |
2010 | case TemplateName::DependentTemplate: |
2011 | llvm_unreachable("invalid base for a template specialization type"); |
2012 | |
2013 | case TemplateName::SubstTemplateTemplateParm: { |
2014 | SubstTemplateTemplateParmStorage *subst = |
2015 | TN.getAsSubstTemplateTemplateParm(); |
2016 | mangleExistingSubstitution(subst->getReplacement()); |
2017 | break; |
2018 | } |
2019 | |
2020 | case TemplateName::SubstTemplateTemplateParmPack: { |
2021 | |
2022 | |
2023 | |
2024 | |
2025 | Out << "_SUBSTPACK_"; |
2026 | break; |
2027 | } |
2028 | } |
2029 | |
2030 | mangleTemplateArgs(TST->getArgs(), TST->getNumArgs()); |
2031 | break; |
2032 | } |
2033 | |
2034 | case Type::InjectedClassName: |
2035 | mangleSourceNameWithAbiTags( |
2036 | cast<InjectedClassNameType>(Ty)->getDecl()); |
2037 | break; |
2038 | |
2039 | case Type::DependentName: |
2040 | mangleSourceName(cast<DependentNameType>(Ty)->getIdentifier()); |
2041 | break; |
2042 | |
2043 | case Type::DependentTemplateSpecialization: { |
2044 | const DependentTemplateSpecializationType *DTST = |
2045 | cast<DependentTemplateSpecializationType>(Ty); |
2046 | mangleSourceName(DTST->getIdentifier()); |
2047 | mangleTemplateArgs(DTST->getArgs(), DTST->getNumArgs()); |
2048 | break; |
2049 | } |
2050 | |
2051 | case Type::Elaborated: |
2052 | return mangleUnresolvedTypeOrSimpleId( |
2053 | cast<ElaboratedType>(Ty)->getNamedType(), Prefix); |
2054 | } |
2055 | |
2056 | return false; |
2057 | } |
2058 | |
2059 | void CXXNameMangler::mangleOperatorName(DeclarationName Name, unsigned Arity) { |
2060 | switch (Name.getNameKind()) { |
2061 | case DeclarationName::CXXConstructorName: |
2062 | case DeclarationName::CXXDestructorName: |
2063 | case DeclarationName::CXXDeductionGuideName: |
2064 | case DeclarationName::CXXUsingDirective: |
2065 | case DeclarationName::Identifier: |
2066 | case DeclarationName::ObjCMultiArgSelector: |
2067 | case DeclarationName::ObjCOneArgSelector: |
2068 | case DeclarationName::ObjCZeroArgSelector: |
2069 | llvm_unreachable("Not an operator name"); |
2070 | |
2071 | case DeclarationName::CXXConversionFunctionName: |
2072 | |
2073 | Out << "cv"; |
2074 | mangleType(Name.getCXXNameType()); |
2075 | break; |
2076 | |
2077 | case DeclarationName::CXXLiteralOperatorName: |
2078 | Out << "li"; |
2079 | mangleSourceName(Name.getCXXLiteralIdentifier()); |
2080 | return; |
2081 | |
2082 | case DeclarationName::CXXOperatorName: |
2083 | mangleOperatorName(Name.getCXXOverloadedOperator(), Arity); |
2084 | break; |
2085 | } |
2086 | } |
2087 | |
2088 | void |
2089 | CXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity) { |
2090 | switch (OO) { |
2091 | |
2092 | case OO_New: Out << "nw"; break; |
2093 | |
2094 | case OO_Array_New: Out << "na"; break; |
2095 | |
2096 | case OO_Delete: Out << "dl"; break; |
2097 | |
2098 | case OO_Array_Delete: Out << "da"; break; |
2099 | |
2100 | |
2101 | case OO_Plus: |
2102 | Out << (Arity == 1? "ps" : "pl"); break; |
2103 | |
2104 | |
2105 | case OO_Minus: |
2106 | Out << (Arity == 1? "ng" : "mi"); break; |
2107 | |
2108 | |
2109 | case OO_Amp: |
2110 | Out << (Arity == 1? "ad" : "an"); break; |
2111 | |
2112 | |
2113 | case OO_Star: |
2114 | |
2115 | Out << (Arity == 1? "de" : "ml"); break; |
2116 | |
2117 | case OO_Tilde: Out << "co"; break; |
2118 | |
2119 | case OO_Slash: Out << "dv"; break; |
2120 | |
2121 | case OO_Percent: Out << "rm"; break; |
2122 | |
2123 | case OO_Pipe: Out << "or"; break; |
2124 | |
2125 | case OO_Caret: Out << "eo"; break; |
2126 | |
2127 | case OO_Equal: Out << "aS"; break; |
2128 | |
2129 | case OO_PlusEqual: Out << "pL"; break; |
2130 | |
2131 | case OO_MinusEqual: Out << "mI"; break; |
2132 | |
2133 | case OO_StarEqual: Out << "mL"; break; |
2134 | |
2135 | case OO_SlashEqual: Out << "dV"; break; |
2136 | |
2137 | case OO_PercentEqual: Out << "rM"; break; |
2138 | |
2139 | case OO_AmpEqual: Out << "aN"; break; |
2140 | |
2141 | case OO_PipeEqual: Out << "oR"; break; |
2142 | |
2143 | case OO_CaretEqual: Out << "eO"; break; |
2144 | |
2145 | case OO_LessLess: Out << "ls"; break; |
2146 | |
2147 | case OO_GreaterGreater: Out << "rs"; break; |
2148 | |
2149 | case OO_LessLessEqual: Out << "lS"; break; |
2150 | |
2151 | case OO_GreaterGreaterEqual: Out << "rS"; break; |
2152 | |
2153 | case OO_EqualEqual: Out << "eq"; break; |
2154 | |
2155 | case OO_ExclaimEqual: Out << "ne"; break; |
2156 | |
2157 | case OO_Less: Out << "lt"; break; |
2158 | |
2159 | case OO_Greater: Out << "gt"; break; |
2160 | |
2161 | case OO_LessEqual: Out << "le"; break; |
2162 | |
2163 | case OO_GreaterEqual: Out << "ge"; break; |
2164 | |
2165 | case OO_Exclaim: Out << "nt"; break; |
2166 | |
2167 | case OO_AmpAmp: Out << "aa"; break; |
2168 | |
2169 | case OO_PipePipe: Out << "oo"; break; |
2170 | |
2171 | case OO_PlusPlus: Out << "pp"; break; |
2172 | |
2173 | case OO_MinusMinus: Out << "mm"; break; |
2174 | |
2175 | case OO_Comma: Out << "cm"; break; |
2176 | |
2177 | case OO_ArrowStar: Out << "pm"; break; |
2178 | |
2179 | case OO_Arrow: Out << "pt"; break; |
2180 | |
2181 | case OO_Call: Out << "cl"; break; |
2182 | |
2183 | case OO_Subscript: Out << "ix"; break; |
2184 | |
2185 | |
2186 | |
2187 | |
2188 | case OO_Conditional: Out << "qu"; break; |
2189 | |
2190 | |
2191 | case OO_Coawait: Out << "aw"; break; |
2192 | |
2193 | |
2194 | case OO_Spaceship: Out << "ss"; break; |
2195 | |
2196 | case OO_None: |
2197 | case NUM_OVERLOADED_OPERATORS: |
2198 | llvm_unreachable("Not an overloaded operator"); |
2199 | } |
2200 | } |
2201 | |
2202 | void CXXNameMangler::mangleQualifiers(Qualifiers Quals, const DependentAddressSpaceType *DAST) { |
2203 | |
2204 | |
2205 | |
2206 | |
2207 | if (DAST) { |
2208 | Out << "U2ASI"; |
2209 | mangleExpression(DAST->getAddrSpaceExpr()); |
2210 | Out << "E"; |
2211 | } |
2212 | |
2213 | |
2214 | if (Quals.hasAddressSpace()) { |
2215 | |
2216 | |
2217 | |
2218 | |
2219 | |
2220 | |
2221 | SmallString<64> ASString; |
2222 | LangAS AS = Quals.getAddressSpace(); |
2223 | |
2224 | if (Context.getASTContext().addressSpaceMapManglingFor(AS)) { |
2225 | |
2226 | unsigned TargetAS = Context.getASTContext().getTargetAddressSpace(AS); |
2227 | if (TargetAS != 0) |
2228 | ASString = "AS" + llvm::utostr(TargetAS); |
2229 | } else { |
2230 | switch (AS) { |
2231 | default: llvm_unreachable("Not a language specific address space"); |
2232 | |
2233 | |
2234 | case LangAS::opencl_global: ASString = "CLglobal"; break; |
2235 | case LangAS::opencl_local: ASString = "CLlocal"; break; |
2236 | case LangAS::opencl_constant: ASString = "CLconstant"; break; |
2237 | case LangAS::opencl_private: ASString = "CLprivate"; break; |
2238 | case LangAS::opencl_generic: ASString = "CLgeneric"; break; |
2239 | |
2240 | case LangAS::cuda_device: ASString = "CUdevice"; break; |
2241 | case LangAS::cuda_constant: ASString = "CUconstant"; break; |
2242 | case LangAS::cuda_shared: ASString = "CUshared"; break; |
2243 | } |
2244 | } |
2245 | if (!ASString.empty()) |
2246 | mangleVendorQualifier(ASString); |
2247 | } |
2248 | |
2249 | |
2250 | |
2251 | |
2252 | |
2253 | |
2254 | |
2255 | |
2256 | |
2257 | |
2258 | if (Quals.getObjCLifetime() == Qualifiers::OCL_Weak) |
2259 | mangleVendorQualifier("__weak"); |
2260 | |
2261 | |
2262 | if (Quals.hasUnaligned()) |
2263 | mangleVendorQualifier("__unaligned"); |
2264 | |
2265 | |
2266 | switch (Quals.getObjCLifetime()) { |
2267 | case Qualifiers::OCL_None: |
2268 | break; |
2269 | |
2270 | case Qualifiers::OCL_Weak: |
2271 | |
2272 | break; |
2273 | |
2274 | case Qualifiers::OCL_Strong: |
2275 | mangleVendorQualifier("__strong"); |
2276 | break; |
2277 | |
2278 | case Qualifiers::OCL_Autoreleasing: |
2279 | mangleVendorQualifier("__autoreleasing"); |
2280 | break; |
2281 | |
2282 | case Qualifiers::OCL_ExplicitNone: |
2283 | |
2284 | |
2285 | |
2286 | |
2287 | |
2288 | |
2289 | |
2290 | break; |
2291 | } |
2292 | |
2293 | |
2294 | if (Quals.hasRestrict()) |
2295 | Out << 'r'; |
2296 | if (Quals.hasVolatile()) |
2297 | Out << 'V'; |
2298 | if (Quals.hasConst()) |
2299 | Out << 'K'; |
2300 | } |
2301 | |
2302 | void CXXNameMangler::mangleVendorQualifier(StringRef name) { |
2303 | Out << 'U' << name.size() << name; |
2304 | } |
2305 | |
2306 | void CXXNameMangler::mangleRefQualifier(RefQualifierKind RefQualifier) { |
2307 | |
2308 | |
2309 | switch (RefQualifier) { |
2310 | case RQ_None: |
2311 | break; |
2312 | |
2313 | case RQ_LValue: |
2314 | Out << 'R'; |
2315 | break; |
2316 | |
2317 | case RQ_RValue: |
2318 | Out << 'O'; |
2319 | break; |
2320 | } |
2321 | } |
2322 | |
2323 | void CXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) { |
2324 | Context.mangleObjCMethodName(MD, Out); |
2325 | } |
2326 | |
2327 | static bool isTypeSubstitutable(Qualifiers Quals, const Type *Ty, |
2328 | ASTContext &Ctx) { |
2329 | if (Quals) |
2330 | return true; |
2331 | if (Ty->isSpecificBuiltinType(BuiltinType::ObjCSel)) |
2332 | return true; |
2333 | if (Ty->isOpenCLSpecificType()) |
2334 | return true; |
2335 | if (Ty->isBuiltinType()) |
2336 | return false; |
2337 | |
2338 | |
2339 | if (Ctx.getLangOpts().getClangABICompat() > LangOptions::ClangABI::Ver6 && |
2340 | isa<AutoType>(Ty)) |
2341 | return false; |
2342 | return true; |
2343 | } |
2344 | |
2345 | void CXXNameMangler::mangleType(QualType T) { |
2346 | |
2347 | |
2348 | |
2349 | |
2350 | |
2351 | |
2352 | |
2353 | |
2354 | |
2355 | |
2356 | |
2357 | |
2358 | |
2359 | |
2360 | |
2361 | |
2362 | |
2363 | |
2364 | |
2365 | |
2366 | |
2367 | |
2368 | |
2369 | |
2370 | |
2371 | |
2372 | |
2373 | |
2374 | |
2375 | |
2376 | |
2377 | |
2378 | if (!T->isInstantiationDependentType() || T->isDependentType()) |
2379 | T = T.getCanonicalType(); |
2380 | else { |
2381 | |
2382 | do { |
2383 | |
2384 | |
2385 | if (const TemplateSpecializationType *TST |
2386 | = dyn_cast<TemplateSpecializationType>(T)) |
2387 | if (!TST->isTypeAlias()) |
2388 | break; |
2389 | |
2390 | QualType Desugared |
2391 | = T.getSingleStepDesugaredType(Context.getASTContext()); |
2392 | if (Desugared == T) |
2393 | break; |
2394 | |
2395 | T = Desugared; |
2396 | } while (true); |
2397 | } |
2398 | SplitQualType split = T.split(); |
2399 | Qualifiers quals = split.Quals; |
2400 | const Type *ty = split.Ty; |
2401 | |
2402 | bool isSubstitutable = |
2403 | isTypeSubstitutable(quals, ty, Context.getASTContext()); |
2404 | if (isSubstitutable && mangleSubstitution(T)) |
2405 | return; |
2406 | |
2407 | |
2408 | |
2409 | if (quals && isa<ArrayType>(T)) { |
2410 | ty = Context.getASTContext().getAsArrayType(T); |
2411 | quals = Qualifiers(); |
2412 | |
2413 | |
2414 | |
2415 | } |
2416 | |
2417 | if (quals || ty->isDependentAddressSpaceType()) { |
2418 | if (const DependentAddressSpaceType *DAST = |
2419 | dyn_cast<DependentAddressSpaceType>(ty)) { |
2420 | SplitQualType splitDAST = DAST->getPointeeType().split(); |
2421 | mangleQualifiers(splitDAST.Quals, DAST); |
2422 | mangleType(QualType(splitDAST.Ty, 0)); |
2423 | } else { |
2424 | mangleQualifiers(quals); |
2425 | |
2426 | |
2427 | |
2428 | mangleType(QualType(ty, 0)); |
2429 | } |
2430 | } else { |
2431 | switch (ty->getTypeClass()) { |
2432 | #define ABSTRACT_TYPE(CLASS, PARENT) |
2433 | #define NON_CANONICAL_TYPE(CLASS, PARENT) \ |
2434 | case Type::CLASS: \ |
2435 | llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \ |
2436 | return; |
2437 | #define TYPE(CLASS, PARENT) \ |
2438 | case Type::CLASS: \ |
2439 | mangleType(static_cast<const CLASS##Type*>(ty)); \ |
2440 | break; |
2441 | #include "clang/AST/TypeNodes.def" |
2442 | } |
2443 | } |
2444 | |
2445 | |
2446 | if (isSubstitutable) |
2447 | addSubstitution(T); |
2448 | } |
2449 | |
2450 | void CXXNameMangler::mangleNameOrStandardSubstitution(const NamedDecl *ND) { |
2451 | if (!mangleStandardSubstitution(ND)) |
2452 | mangleName(ND); |
2453 | } |
2454 | |
2455 | void CXXNameMangler::mangleType(const BuiltinType *T) { |
2456 | |
2457 | |
2458 | |
2459 | |
2460 | |
2461 | |
2462 | |
2463 | |
2464 | |
2465 | |
2466 | |
2467 | |
2468 | |
2469 | |
2470 | |
2471 | |
2472 | |
2473 | |
2474 | |
2475 | |
2476 | |
2477 | |
2478 | |
2479 | |
2480 | |
2481 | |
2482 | |
2483 | |
2484 | |
2485 | |
2486 | std::string type_name; |
2487 | switch (T->getKind()) { |
2488 | case BuiltinType::Void: |
2489 | Out << 'v'; |
2490 | break; |
2491 | case BuiltinType::Bool: |
2492 | Out << 'b'; |
2493 | break; |
2494 | case BuiltinType::Char_U: |
2495 | case BuiltinType::Char_S: |
2496 | Out << 'c'; |
2497 | break; |
2498 | case BuiltinType::UChar: |
2499 | Out << 'h'; |
2500 | break; |
2501 | case BuiltinType::UShort: |
2502 | Out << 't'; |
2503 | break; |
2504 | case BuiltinType::UInt: |
2505 | Out << 'j'; |
2506 | break; |
2507 | case BuiltinType::ULong: |
2508 | Out << 'm'; |
2509 | break; |
2510 | case BuiltinType::ULongLong: |
2511 | Out << 'y'; |
2512 | break; |
2513 | case BuiltinType::UInt128: |
2514 | Out << 'o'; |
2515 | break; |
2516 | case BuiltinType::SChar: |
2517 | Out << 'a'; |
2518 | break; |
2519 | case BuiltinType::WChar_S: |
2520 | case BuiltinType::WChar_U: |
2521 | Out << 'w'; |
2522 | break; |
2523 | case BuiltinType::Char8: |
2524 | Out << "Du"; |
2525 | break; |
2526 | case BuiltinType::Char16: |
2527 | Out << "Ds"; |
2528 | break; |
2529 | case BuiltinType::Char32: |
2530 | Out << "Di"; |
2531 | break; |
2532 | case BuiltinType::Short: |
2533 | Out << 's'; |
2534 | break; |
2535 | case BuiltinType::Int: |
2536 | Out << 'i'; |
2537 | break; |
2538 | case BuiltinType::Long: |
2539 | Out << 'l'; |
2540 | break; |
2541 | case BuiltinType::LongLong: |
2542 | Out << 'x'; |
2543 | break; |
2544 | case BuiltinType::Int128: |
2545 | Out << 'n'; |
2546 | break; |
2547 | case BuiltinType::Float16: |
2548 | Out << "DF16_"; |
2549 | break; |
2550 | case BuiltinType::ShortAccum: |
2551 | case BuiltinType::Accum: |
2552 | case BuiltinType::LongAccum: |
2553 | case BuiltinType::UShortAccum: |
2554 | case BuiltinType::UAccum: |
2555 | case BuiltinType::ULongAccum: |
2556 | case BuiltinType::ShortFract: |
2557 | case BuiltinType::Fract: |
2558 | case BuiltinType::LongFract: |
2559 | case BuiltinType::UShortFract: |
2560 | case BuiltinType::UFract: |
2561 | case BuiltinType::ULongFract: |
2562 | case BuiltinType::SatShortAccum: |
2563 | case BuiltinType::SatAccum: |
2564 | case BuiltinType::SatLongAccum: |
2565 | case BuiltinType::SatUShortAccum: |
2566 | case BuiltinType::SatUAccum: |
2567 | case BuiltinType::SatULongAccum: |
2568 | case BuiltinType::SatShortFract: |
2569 | case BuiltinType::SatFract: |
2570 | case BuiltinType::SatLongFract: |
2571 | case BuiltinType::SatUShortFract: |
2572 | case BuiltinType::SatUFract: |
2573 | case BuiltinType::SatULongFract: |
2574 | llvm_unreachable("Fixed point types are disabled for c++"); |
2575 | case BuiltinType::Half: |
2576 | Out << "Dh"; |
2577 | break; |
2578 | case BuiltinType::Float: |
2579 | Out << 'f'; |
2580 | break; |
2581 | case BuiltinType::Double: |
2582 | Out << 'd'; |
2583 | break; |
2584 | case BuiltinType::LongDouble: |
2585 | Out << (getASTContext().getTargetInfo().useFloat128ManglingForLongDouble() |
2586 | ? 'g' |
2587 | : 'e'); |
2588 | break; |
2589 | case BuiltinType::Float128: |
2590 | if (getASTContext().getTargetInfo().useFloat128ManglingForLongDouble()) |
2591 | Out << "U10__float128"; |
2592 | else |
2593 | Out << 'g'; |
2594 | break; |
2595 | case BuiltinType::NullPtr: |
2596 | Out << "Dn"; |
2597 | break; |
2598 | |
2599 | #define BUILTIN_TYPE(Id, SingletonId) |
2600 | #define PLACEHOLDER_TYPE(Id, SingletonId) \ |
2601 | case BuiltinType::Id: |
2602 | #include "clang/AST/BuiltinTypes.def" |
2603 | case BuiltinType::Dependent: |
2604 | if (!NullOut) |
2605 | llvm_unreachable("mangling a placeholder type"); |
2606 | break; |
2607 | case BuiltinType::ObjCId: |
2608 | Out << "11objc_object"; |
2609 | break; |
2610 | case BuiltinType::ObjCClass: |
2611 | Out << "10objc_class"; |
2612 | break; |
2613 | case BuiltinType::ObjCSel: |
2614 | Out << "13objc_selector"; |
2615 | break; |
2616 | #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ |
2617 | case BuiltinType::Id: \ |
2618 | type_name = "ocl_" #ImgType "_" #Suffix; \ |
2619 | Out << type_name.size() << type_name; \ |
2620 | break; |
2621 | #include "clang/Basic/OpenCLImageTypes.def" |
2622 | case BuiltinType::OCLSampler: |
2623 | Out << "11ocl_sampler"; |
2624 | break; |
2625 | case BuiltinType::OCLEvent: |
2626 | Out << "9ocl_event"; |
2627 | break; |
2628 | case BuiltinType::OCLClkEvent: |
2629 | Out << "12ocl_clkevent"; |
2630 | break; |
2631 | case BuiltinType::OCLQueue: |
2632 | Out << "9ocl_queue"; |
2633 | break; |
2634 | case BuiltinType::OCLReserveID: |
2635 | Out << "13ocl_reserveid"; |
2636 | break; |
2637 | #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ |
2638 | case BuiltinType::Id: \ |
2639 | type_name = "ocl_" #ExtType; \ |
2640 | Out << type_name.size() << type_name; \ |
2641 | break; |
2642 | #include "clang/Basic/OpenCLExtensionTypes.def" |
2643 | } |
2644 | } |
2645 | |
2646 | StringRef CXXNameMangler::getCallingConvQualifierName(CallingConv CC) { |
2647 | switch (CC) { |
2648 | case CC_C: |
2649 | return ""; |
2650 | |
2651 | case CC_X86VectorCall: |
2652 | case CC_X86Pascal: |
2653 | case CC_X86RegCall: |
2654 | case CC_AAPCS: |
2655 | case CC_AAPCS_VFP: |
2656 | case CC_AArch64VectorCall: |
2657 | case CC_IntelOclBicc: |
2658 | case CC_SpirFunction: |
2659 | case CC_OpenCLKernel: |
2660 | case CC_PreserveMost: |
2661 | case CC_PreserveAll: |
2662 | |
2663 | return ""; |
2664 | |
2665 | case CC_X86ThisCall: |
2666 | |
2667 | |
2668 | |
2669 | |
2670 | |
2671 | return ""; |
2672 | |
2673 | case CC_X86StdCall: |
2674 | return "stdcall"; |
2675 | case CC_X86FastCall: |
2676 | return "fastcall"; |
2677 | case CC_X86_64SysV: |
2678 | return "sysv_abi"; |
2679 | case CC_Win64: |
2680 | return "ms_abi"; |
2681 | case CC_Swift: |
2682 | return "swiftcall"; |
2683 | } |
2684 | llvm_unreachable("bad calling convention"); |
2685 | } |
2686 | |
2687 | void CXXNameMangler::mangleExtFunctionInfo(const FunctionType *T) { |
2688 | |
2689 | if (T->getExtInfo() == FunctionType::ExtInfo()) |
2690 | return; |
2691 | |
2692 | |
2693 | |
2694 | |
2695 | |
2696 | StringRef CCQualifier = getCallingConvQualifierName(T->getExtInfo().getCC()); |
2697 | if (!CCQualifier.empty()) |
2698 | mangleVendorQualifier(CCQualifier); |
2699 | |
2700 | |
2701 | |
2702 | } |
2703 | |
2704 | void |
2705 | CXXNameMangler::mangleExtParameterInfo(FunctionProtoType::ExtParameterInfo PI) { |
2706 | |
2707 | |
2708 | |
2709 | |
2710 | |
2711 | switch (PI.getABI()) { |
2712 | case ParameterABI::Ordinary: |
2713 | break; |
2714 | |
2715 | |
2716 | case ParameterABI::SwiftContext: |
2717 | case ParameterABI::SwiftErrorResult: |
2718 | case ParameterABI::SwiftIndirectResult: |
2719 | mangleVendorQualifier(getParameterABISpelling(PI.getABI())); |
2720 | break; |
2721 | } |
2722 | |
2723 | if (PI.isConsumed()) |
2724 | mangleVendorQualifier("ns_consumed"); |
2725 | |
2726 | if (PI.isNoEscape()) |
2727 | mangleVendorQualifier("noescape"); |
2728 | } |
2729 | |
2730 | |
2731 | |
2732 | |
2733 | void CXXNameMangler::mangleType(const FunctionProtoType *T) { |
2734 | mangleExtFunctionInfo(T); |
2735 | |
2736 | |
2737 | |
2738 | mangleQualifiers(T->getMethodQuals()); |
2739 | |
2740 | |
2741 | |
2742 | if (T->hasInstantiationDependentExceptionSpec()) { |
2743 | if (isComputedNoexcept(T->getExceptionSpecType())) { |
2744 | Out << "DO"; |
2745 | mangleExpression(T->getNoexceptExpr()); |
2746 | Out << "E"; |
2747 | } else { |
2748 | getExceptionSpecType() == EST_Dynamic", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 2748, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(T->getExceptionSpecType() == EST_Dynamic); |
2749 | Out << "Dw"; |
2750 | for (auto ExceptTy : T->exceptions()) |
2751 | mangleType(ExceptTy); |
2752 | Out << "E"; |
2753 | } |
2754 | } else if (T->isNothrow()) { |
2755 | Out << "Do"; |
2756 | } |
2757 | |
2758 | Out << 'F'; |
2759 | |
2760 | |
2761 | |
2762 | mangleBareFunctionType(T, ); |
2763 | |
2764 | |
2765 | mangleRefQualifier(T->getRefQualifier()); |
2766 | |
2767 | Out << 'E'; |
2768 | } |
2769 | |
2770 | void CXXNameMangler::mangleType(const FunctionNoProtoType *T) { |
2771 | |
2772 | |
2773 | |
2774 | Out << 'F'; |
2775 | |
2776 | FunctionTypeDepthState saved = FunctionTypeDepth.push(); |
2777 | |
2778 | FunctionTypeDepth.enterResultType(); |
2779 | mangleType(T->getReturnType()); |
2780 | FunctionTypeDepth.leaveResultType(); |
2781 | |
2782 | FunctionTypeDepth.pop(saved); |
2783 | Out << 'E'; |
2784 | } |
2785 | |
2786 | void CXXNameMangler::mangleBareFunctionType(const FunctionProtoType *Proto, |
2787 | bool MangleReturnType, |
2788 | const FunctionDecl *FD) { |
2789 | |
2790 | |
2791 | FunctionTypeDepthState saved = FunctionTypeDepth.push(); |
2792 | |
2793 | |
2794 | if (MangleReturnType) { |
2795 | FunctionTypeDepth.enterResultType(); |
2796 | |
2797 | |
2798 | if (Proto->getExtInfo().getProducesResult() && FD == nullptr) |
2799 | mangleVendorQualifier("ns_returns_retained"); |
2800 | |
2801 | |
2802 | QualType ReturnTy = Proto->getReturnType(); |
2803 | if (ReturnTy.getObjCLifetime()) { |
2804 | auto SplitReturnTy = ReturnTy.split(); |
2805 | SplitReturnTy.Quals.removeObjCLifetime(); |
2806 | ReturnTy = getASTContext().getQualifiedType(SplitReturnTy); |
2807 | } |
2808 | mangleType(ReturnTy); |
2809 | |
2810 | FunctionTypeDepth.leaveResultType(); |
2811 | } |
2812 | |
2813 | if (Proto->getNumParams() == 0 && !Proto->isVariadic()) { |
2814 | |
2815 | Out << 'v'; |
2816 | |
2817 | FunctionTypeDepth.pop(saved); |
2818 | return; |
2819 | } |
2820 | |
2821 | getNumParams() == Proto->getNumParams()", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 2821, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!FD || FD->getNumParams() == Proto->getNumParams()); |
2822 | for (unsigned I = 0, E = Proto->getNumParams(); I != E; ++I) { |
2823 | |
2824 | if (Proto->hasExtParameterInfos() && FD == nullptr) { |
2825 | mangleExtParameterInfo(Proto->getExtParameterInfo(I)); |
2826 | } |
2827 | |
2828 | |
2829 | QualType ParamTy = Proto->getParamType(I); |
2830 | mangleType(Context.getASTContext().getSignatureParameterType(ParamTy)); |
2831 | |
2832 | if (FD) { |
2833 | if (auto *Attr = FD->getParamDecl(I)->getAttr<PassObjectSizeAttr>()) { |
2834 | |
2835 | getType() <= 9 && Attr->getType() >= 0", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 2835, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(Attr->getType() <= 9 && Attr->getType() >= 0); |
2836 | if (Attr->isDynamic()) |
2837 | Out << "U25pass_dynamic_object_size" << Attr->getType(); |
2838 | else |
2839 | Out << "U17pass_object_size" << Attr->getType(); |
2840 | } |
2841 | } |
2842 | } |
2843 | |
2844 | FunctionTypeDepth.pop(saved); |
2845 | |
2846 | |
2847 | if (Proto->isVariadic()) |
2848 | Out << 'z'; |
2849 | } |
2850 | |
2851 | |
2852 | |
2853 | void CXXNameMangler::mangleType(const UnresolvedUsingType *T) { |
2854 | mangleName(T->getDecl()); |
2855 | } |
2856 | |
2857 | |
2858 | |
2859 | void CXXNameMangler::mangleType(const EnumType *T) { |
2860 | mangleType(static_cast<const TagType*>(T)); |
2861 | } |
2862 | void CXXNameMangler::mangleType(const RecordType *T) { |
2863 | mangleType(static_cast<const TagType*>(T)); |
2864 | } |
2865 | void CXXNameMangler::mangleType(const TagType *T) { |
2866 | mangleName(T->getDecl()); |
2867 | } |
2868 | |
2869 | |
2870 | |
2871 | |
2872 | void CXXNameMangler::mangleType(const ConstantArrayType *T) { |
2873 | Out << 'A' << T->getSize() << '_'; |
2874 | mangleType(T->getElementType()); |
2875 | } |
2876 | void CXXNameMangler::mangleType(const VariableArrayType *T) { |
2877 | Out << 'A'; |
2878 | |
2879 | if (T->getSizeExpr()) |
2880 | mangleExpression(T->getSizeExpr()); |
2881 | Out << '_'; |
2882 | mangleType(T->getElementType()); |
2883 | } |
2884 | void CXXNameMangler::mangleType(const DependentSizedArrayType *T) { |
2885 | Out << 'A'; |
2886 | mangleExpression(T->getSizeExpr()); |
2887 | Out << '_'; |
2888 | mangleType(T->getElementType()); |
2889 | } |
2890 | void CXXNameMangler::mangleType(const IncompleteArrayType *T) { |
2891 | Out << "A_"; |
2892 | mangleType(T->getElementType()); |
2893 | } |
2894 | |
2895 | |
2896 | |
2897 | void CXXNameMangler::mangleType(const MemberPointerType *T) { |
2898 | Out << 'M'; |
2899 | mangleType(QualType(T->getClass(), 0)); |
2900 | QualType PointeeType = T->getPointeeType(); |
2901 | if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(PointeeType)) { |
2902 | mangleType(FPT); |
2903 | |
2904 | |
2905 | |
2906 | |
2907 | |
2908 | |
2909 | |
2910 | |
2911 | |
2912 | |
2913 | |
2914 | |
2915 | |
2916 | |
2917 | |
2918 | |
2919 | |
2920 | ++SeqID; |
2921 | } else |
2922 | mangleType(PointeeType); |
2923 | } |
2924 | |
2925 | |
2926 | void CXXNameMangler::mangleType(const TemplateTypeParmType *T) { |
2927 | mangleTemplateParameter(T->getIndex()); |
2928 | } |
2929 | |
2930 | |
2931 | void CXXNameMangler::mangleType(const SubstTemplateTypeParmPackType *T) { |
2932 | |
2933 | |
2934 | |
2935 | |
2936 | Out << "_SUBSTPACK_"; |
2937 | } |
2938 | |
2939 | |
2940 | void CXXNameMangler::mangleType(const PointerType *T) { |
2941 | Out << 'P'; |
2942 | mangleType(T->getPointeeType()); |
2943 | } |
2944 | void CXXNameMangler::mangleType(const ObjCObjectPointerType *T) { |
2945 | Out << 'P'; |
2946 | mangleType(T->getPointeeType()); |
2947 | } |
2948 | |
2949 | |
2950 | void CXXNameMangler::mangleType(const LValueReferenceType *T) { |
2951 | Out << 'R'; |
2952 | mangleType(T->getPointeeType()); |
2953 | } |
2954 | |
2955 | |
2956 | void CXXNameMangler::mangleType(const RValueReferenceType *T) { |
2957 | Out << 'O'; |
2958 | mangleType(T->getPointeeType()); |
2959 | } |
2960 | |
2961 | |
2962 | void CXXNameMangler::mangleType(const ComplexType *T) { |
2963 | Out << 'C'; |
2964 | mangleType(T->getElementType()); |
2965 | } |
2966 | |
2967 | |
2968 | |
2969 | |
2970 | void CXXNameMangler::mangleNeonVectorType(const VectorType *T) { |
2971 | QualType EltType = T->getElementType(); |
2972 | (0) . __assert_fail ("EltType->isBuiltinType() && \"Neon vector element not a BuiltinType\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 2972, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(EltType->isBuiltinType() && "Neon vector element not a BuiltinType"); |
2973 | const char *EltName = nullptr; |
2974 | if (T->getVectorKind() == VectorType::NeonPolyVector) { |
2975 | switch (cast<BuiltinType>(EltType)->getKind()) { |
2976 | case BuiltinType::SChar: |
2977 | case BuiltinType::UChar: |
2978 | EltName = "poly8_t"; |
2979 | break; |
2980 | case BuiltinType::Short: |
2981 | case BuiltinType::UShort: |
2982 | EltName = "poly16_t"; |
2983 | break; |
2984 | case BuiltinType::ULongLong: |
2985 | EltName = "poly64_t"; |
2986 | break; |
2987 | default: llvm_unreachable("unexpected Neon polynomial vector element type"); |
2988 | } |
2989 | } else { |
2990 | switch (cast<BuiltinType>(EltType)->getKind()) { |
2991 | case BuiltinType::SChar: EltName = "int8_t"; break; |
2992 | case BuiltinType::UChar: EltName = "uint8_t"; break; |
2993 | case BuiltinType::Short: EltName = "int16_t"; break; |
2994 | case BuiltinType::UShort: EltName = "uint16_t"; break; |
2995 | case BuiltinType::Int: EltName = "int32_t"; break; |
2996 | case BuiltinType::UInt: EltName = "uint32_t"; break; |
2997 | case BuiltinType::LongLong: EltName = "int64_t"; break; |
2998 | case BuiltinType::ULongLong: EltName = "uint64_t"; break; |
2999 | case BuiltinType::Double: EltName = "float64_t"; break; |
3000 | case BuiltinType::Float: EltName = "float32_t"; break; |
3001 | case BuiltinType::Half: EltName = "float16_t";break; |
3002 | default: |
3003 | llvm_unreachable("unexpected Neon vector element type"); |
3004 | } |
3005 | } |
3006 | const char *BaseName = nullptr; |
3007 | unsigned BitSize = (T->getNumElements() * |
3008 | getASTContext().getTypeSize(EltType)); |
3009 | if (BitSize == 64) |
3010 | BaseName = "__simd64_"; |
3011 | else { |
3012 | (0) . __assert_fail ("BitSize == 128 && \"Neon vector type not 64 or 128 bits\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3012, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(BitSize == 128 && "Neon vector type not 64 or 128 bits"); |
3013 | BaseName = "__simd128_"; |
3014 | } |
3015 | Out << strlen(BaseName) + strlen(EltName); |
3016 | Out << BaseName << EltName; |
3017 | } |
3018 | |
3019 | void CXXNameMangler::mangleNeonVectorType(const DependentVectorType *T) { |
3020 | DiagnosticsEngine &Diags = Context.getDiags(); |
3021 | unsigned DiagID = Diags.getCustomDiagID( |
3022 | DiagnosticsEngine::Error, |
3023 | "cannot mangle this dependent neon vector type yet"); |
3024 | Diags.Report(T->getAttributeLoc(), DiagID); |
3025 | } |
3026 | |
3027 | static StringRef mangleAArch64VectorBase(const BuiltinType *EltType) { |
3028 | switch (EltType->getKind()) { |
3029 | case BuiltinType::SChar: |
3030 | return "Int8"; |
3031 | case BuiltinType::Short: |
3032 | return "Int16"; |
3033 | case BuiltinType::Int: |
3034 | return "Int32"; |
3035 | case BuiltinType::Long: |
3036 | case BuiltinType::LongLong: |
3037 | return "Int64"; |
3038 | case BuiltinType::UChar: |
3039 | return "Uint8"; |
3040 | case BuiltinType::UShort: |
3041 | return "Uint16"; |
3042 | case BuiltinType::UInt: |
3043 | return "Uint32"; |
3044 | case BuiltinType::ULong: |
3045 | case BuiltinType::ULongLong: |
3046 | return "Uint64"; |
3047 | case BuiltinType::Half: |
3048 | return "Float16"; |
3049 | case BuiltinType::Float: |
3050 | return "Float32"; |
3051 | case BuiltinType::Double: |
3052 | return "Float64"; |
3053 | default: |
3054 | llvm_unreachable("Unexpected vector element base type"); |
3055 | } |
3056 | } |
3057 | |
3058 | |
3059 | |
3060 | |
3061 | void CXXNameMangler::mangleAArch64NeonVectorType(const VectorType *T) { |
3062 | QualType EltType = T->getElementType(); |
3063 | (0) . __assert_fail ("EltType->isBuiltinType() && \"Neon vector element not a BuiltinType\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3063, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(EltType->isBuiltinType() && "Neon vector element not a BuiltinType"); |
3064 | unsigned BitSize = |
3065 | (T->getNumElements() * getASTContext().getTypeSize(EltType)); |
3066 | (void)BitSize; |
3067 | |
3068 | (0) . __assert_fail ("(BitSize == 64 || BitSize == 128) && \"Neon vector type not 64 or 128 bits\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3069, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert((BitSize == 64 || BitSize == 128) && |
3069 | (0) . __assert_fail ("(BitSize == 64 || BitSize == 128) && \"Neon vector type not 64 or 128 bits\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3069, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "Neon vector type not 64 or 128 bits"); |
3070 | |
3071 | StringRef EltName; |
3072 | if (T->getVectorKind() == VectorType::NeonPolyVector) { |
3073 | switch (cast<BuiltinType>(EltType)->getKind()) { |
3074 | case BuiltinType::UChar: |
3075 | EltName = "Poly8"; |
3076 | break; |
3077 | case BuiltinType::UShort: |
3078 | EltName = "Poly16"; |
3079 | break; |
3080 | case BuiltinType::ULong: |
3081 | case BuiltinType::ULongLong: |
3082 | EltName = "Poly64"; |
3083 | break; |
3084 | default: |
3085 | llvm_unreachable("unexpected Neon polynomial vector element type"); |
3086 | } |
3087 | } else |
3088 | EltName = mangleAArch64VectorBase(cast<BuiltinType>(EltType)); |
3089 | |
3090 | std::string TypeName = |
3091 | ("__" + EltName + "x" + Twine(T->getNumElements()) + "_t").str(); |
3092 | Out << TypeName.length() << TypeName; |
3093 | } |
3094 | void CXXNameMangler::mangleAArch64NeonVectorType(const DependentVectorType *T) { |
3095 | DiagnosticsEngine &Diags = Context.getDiags(); |
3096 | unsigned DiagID = Diags.getCustomDiagID( |
3097 | DiagnosticsEngine::Error, |
3098 | "cannot mangle this dependent neon vector type yet"); |
3099 | Diags.Report(T->getAttributeLoc(), DiagID); |
3100 | } |
3101 | |
3102 | |
3103 | |
3104 | |
3105 | |
3106 | |
3107 | |
3108 | |
3109 | |
3110 | void CXXNameMangler::mangleType(const VectorType *T) { |
3111 | if ((T->getVectorKind() == VectorType::NeonVector || |
3112 | T->getVectorKind() == VectorType::NeonPolyVector)) { |
3113 | llvm::Triple Target = getASTContext().getTargetInfo().getTriple(); |
3114 | llvm::Triple::ArchType Arch = |
3115 | getASTContext().getTargetInfo().getTriple().getArch(); |
3116 | if ((Arch == llvm::Triple::aarch64 || |
3117 | Arch == llvm::Triple::aarch64_be) && !Target.isOSDarwin()) |
3118 | mangleAArch64NeonVectorType(T); |
3119 | else |
3120 | mangleNeonVectorType(T); |
3121 | return; |
3122 | } |
3123 | Out << "Dv" << T->getNumElements() << '_'; |
3124 | if (T->getVectorKind() == VectorType::AltiVecPixel) |
3125 | Out << 'p'; |
3126 | else if (T->getVectorKind() == VectorType::AltiVecBool) |
3127 | Out << 'b'; |
3128 | else |
3129 | mangleType(T->getElementType()); |
3130 | } |
3131 | |
3132 | void CXXNameMangler::mangleType(const DependentVectorType *T) { |
3133 | if ((T->getVectorKind() == VectorType::NeonVector || |
3134 | T->getVectorKind() == VectorType::NeonPolyVector)) { |
3135 | llvm::Triple Target = getASTContext().getTargetInfo().getTriple(); |
3136 | llvm::Triple::ArchType Arch = |
3137 | getASTContext().getTargetInfo().getTriple().getArch(); |
3138 | if ((Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_be) && |
3139 | !Target.isOSDarwin()) |
3140 | mangleAArch64NeonVectorType(T); |
3141 | else |
3142 | mangleNeonVectorType(T); |
3143 | return; |
3144 | } |
3145 | |
3146 | Out << "Dv"; |
3147 | mangleExpression(T->getSizeExpr()); |
3148 | Out << '_'; |
3149 | if (T->getVectorKind() == VectorType::AltiVecPixel) |
3150 | Out << 'p'; |
3151 | else if (T->getVectorKind() == VectorType::AltiVecBool) |
3152 | Out << 'b'; |
3153 | else |
3154 | mangleType(T->getElementType()); |
3155 | } |
3156 | |
3157 | void CXXNameMangler::mangleType(const ExtVectorType *T) { |
3158 | mangleType(static_cast<const VectorType*>(T)); |
3159 | } |
3160 | void CXXNameMangler::mangleType(const DependentSizedExtVectorType *T) { |
3161 | Out << "Dv"; |
3162 | mangleExpression(T->getSizeExpr()); |
3163 | Out << '_'; |
3164 | mangleType(T->getElementType()); |
3165 | } |
3166 | |
3167 | void CXXNameMangler::mangleType(const DependentAddressSpaceType *T) { |
3168 | SplitQualType split = T->getPointeeType().split(); |
3169 | mangleQualifiers(split.Quals, T); |
3170 | mangleType(QualType(split.Ty, 0)); |
3171 | } |
3172 | |
3173 | void CXXNameMangler::mangleType(const PackExpansionType *T) { |
3174 | |
3175 | Out << "Dp"; |
3176 | mangleType(T->getPattern()); |
3177 | } |
3178 | |
3179 | void CXXNameMangler::mangleType(const ObjCInterfaceType *T) { |
3180 | mangleSourceName(T->getDecl()->getIdentifier()); |
3181 | } |
3182 | |
3183 | void CXXNameMangler::mangleType(const ObjCObjectType *T) { |
3184 | |
3185 | if (T->isKindOfType()) |
3186 | Out << "U8__kindof"; |
3187 | |
3188 | if (!T->qual_empty()) { |
3189 | |
3190 | SmallString<64> QualStr; |
3191 | llvm::raw_svector_ostream QualOS(QualStr); |
3192 | QualOS << "objcproto"; |
3193 | for (const auto *I : T->quals()) { |
3194 | StringRef name = I->getName(); |
3195 | QualOS << name.size() << name; |
3196 | } |
3197 | Out << 'U' << QualStr.size() << QualStr; |
3198 | } |
3199 | |
3200 | mangleType(T->getBaseType()); |
3201 | |
3202 | if (T->isSpecialized()) { |
3203 | |
3204 | Out << 'I'; |
3205 | for (auto typeArg : T->getTypeArgs()) |
3206 | mangleType(typeArg); |
3207 | Out << 'E'; |
3208 | } |
3209 | } |
3210 | |
3211 | void CXXNameMangler::mangleType(const BlockPointerType *T) { |
3212 | Out << "U13block_pointer"; |
3213 | mangleType(T->getPointeeType()); |
3214 | } |
3215 | |
3216 | void CXXNameMangler::mangleType(const InjectedClassNameType *T) { |
3217 | |
3218 | |
3219 | |
3220 | mangleType(T->getInjectedSpecializationType()); |
3221 | } |
3222 | |
3223 | void CXXNameMangler::mangleType(const TemplateSpecializationType *T) { |
3224 | if (TemplateDecl *TD = T->getTemplateName().getAsTemplateDecl()) { |
3225 | mangleTemplateName(TD, T->getArgs(), T->getNumArgs()); |
3226 | } else { |
3227 | if (mangleSubstitution(QualType(T, 0))) |
3228 | return; |
3229 | |
3230 | mangleTemplatePrefix(T->getTemplateName()); |
3231 | |
3232 | |
3233 | |
3234 | |
3235 | mangleTemplateArgs(T->getArgs(), T->getNumArgs()); |
3236 | addSubstitution(QualType(T, 0)); |
3237 | } |
3238 | } |
3239 | |
3240 | void CXXNameMangler::mangleType(const DependentNameType *T) { |
3241 | |
3242 | |
3243 | |
3244 | |
3245 | |
3246 | |
3247 | |
3248 | |
3249 | |
3250 | |
3251 | switch (T->getKeyword()) { |
3252 | case ETK_None: |
3253 | case ETK_Typename: |
3254 | break; |
3255 | case ETK_Struct: |
3256 | case ETK_Class: |
3257 | case ETK_Interface: |
3258 | Out << "Ts"; |
3259 | break; |
3260 | case ETK_Union: |
3261 | Out << "Tu"; |
3262 | break; |
3263 | case ETK_Enum: |
3264 | Out << "Te"; |
3265 | break; |
3266 | } |
3267 | |
3268 | Out << 'N'; |
3269 | manglePrefix(T->getQualifier()); |
3270 | mangleSourceName(T->getIdentifier()); |
3271 | Out << 'E'; |
3272 | } |
3273 | |
3274 | void CXXNameMangler::mangleType(const DependentTemplateSpecializationType *T) { |
3275 | |
3276 | Out << 'N'; |
3277 | |
3278 | |
3279 | TemplateName Prefix = |
3280 | getASTContext().getDependentTemplateName(T->getQualifier(), |
3281 | T->getIdentifier()); |
3282 | mangleTemplatePrefix(Prefix); |
3283 | |
3284 | |
3285 | |
3286 | |
3287 | mangleTemplateArgs(T->getArgs(), T->getNumArgs()); |
3288 | Out << 'E'; |
3289 | } |
3290 | |
3291 | void CXXNameMangler::mangleType(const TypeOfType *T) { |
3292 | |
3293 | |
3294 | Out << "u6typeof"; |
3295 | } |
3296 | |
3297 | void CXXNameMangler::mangleType(const TypeOfExprType *T) { |
3298 | |
3299 | |
3300 | Out << "u6typeof"; |
3301 | } |
3302 | |
3303 | void CXXNameMangler::mangleType(const DecltypeType *T) { |
3304 | Expr *E = T->getUnderlyingExpr(); |
3305 | |
3306 | |
3307 | |
3308 | |
3309 | |
3310 | |
3311 | |
3312 | |
3313 | |
3314 | if (isa<DeclRefExpr>(E) || |
3315 | isa<MemberExpr>(E) || |
3316 | isa<UnresolvedLookupExpr>(E) || |
3317 | isa<DependentScopeDeclRefExpr>(E) || |
3318 | isa<CXXDependentScopeMemberExpr>(E) || |
3319 | isa<UnresolvedMemberExpr>(E)) |
3320 | Out << "Dt"; |
3321 | else |
3322 | Out << "DT"; |
3323 | mangleExpression(E); |
3324 | Out << 'E'; |
3325 | } |
3326 | |
3327 | void CXXNameMangler::mangleType(const UnaryTransformType *T) { |
3328 | |
3329 | |
3330 | if (T->isDependentType()) { |
3331 | Out << 'U'; |
3332 | |
3333 | switch (T->getUTTKind()) { |
3334 | case UnaryTransformType::EnumUnderlyingType: |
3335 | Out << "3eut"; |
3336 | break; |
3337 | } |
3338 | } |
3339 | |
3340 | mangleType(T->getBaseType()); |
3341 | } |
3342 | |
3343 | void CXXNameMangler::mangleType(const AutoType *T) { |
3344 | (0) . __assert_fail ("T->getDeducedType().isNull() && \"Deduced AutoType shouldn't be handled here!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3345, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(T->getDeducedType().isNull() && |
3345 | (0) . __assert_fail ("T->getDeducedType().isNull() && \"Deduced AutoType shouldn't be handled here!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3345, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "Deduced AutoType shouldn't be handled here!"); |
3346 | (0) . __assert_fail ("T->getKeyword() != AutoTypeKeyword..GNUAutoType && \"shouldn't need to mangle __auto_type!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3347, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(T->getKeyword() != AutoTypeKeyword::GNUAutoType && |
3347 | (0) . __assert_fail ("T->getKeyword() != AutoTypeKeyword..GNUAutoType && \"shouldn't need to mangle __auto_type!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3347, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "shouldn't need to mangle __auto_type!"); |
3348 | |
3349 | |
3350 | Out << (T->isDecltypeAuto() ? "Dc" : "Da"); |
3351 | } |
3352 | |
3353 | void CXXNameMangler::mangleType(const DeducedTemplateSpecializationType *T) { |
3354 | |
3355 | |
3356 | QualType D = T->getDeducedType(); |
3357 | if (D.isNull()) |
3358 | mangleUnscopedTemplateName(T->getTemplateName(), nullptr); |
3359 | else |
3360 | mangleType(D); |
3361 | } |
3362 | |
3363 | void CXXNameMangler::mangleType(const AtomicType *T) { |
3364 | |
3365 | |
3366 | Out << "U7_Atomic"; |
3367 | mangleType(T->getValueType()); |
3368 | } |
3369 | |
3370 | void CXXNameMangler::mangleType(const PipeType *T) { |
3371 | |
3372 | |
3373 | |
3374 | Out << "8ocl_pipe"; |
3375 | } |
3376 | |
3377 | void CXXNameMangler::mangleIntegerLiteral(QualType T, |
3378 | const llvm::APSInt &Value) { |
3379 | |
3380 | Out << 'L'; |
3381 | |
3382 | mangleType(T); |
3383 | if (T->isBooleanType()) { |
3384 | |
3385 | Out << (Value.getBoolValue() ? '1' : '0'); |
3386 | } else { |
3387 | mangleNumber(Value); |
3388 | } |
3389 | Out << 'E'; |
3390 | |
3391 | } |
3392 | |
3393 | void CXXNameMangler::mangleMemberExprBase(const Expr *Base, bool IsArrow) { |
3394 | |
3395 | while (const auto *RT = Base->getType()->getAs<RecordType>()) { |
3396 | if (!RT->getDecl()->isAnonymousStructOrUnion()) |
3397 | break; |
3398 | const auto *ME = dyn_cast<MemberExpr>(Base); |
3399 | if (!ME) |
3400 | break; |
3401 | Base = ME->getBase(); |
3402 | IsArrow = ME->isArrow(); |
3403 | } |
3404 | |
3405 | if (Base->isImplicitCXXThis()) { |
3406 | |
3407 | |
3408 | |
3409 | Out << "dtdefpT"; |
3410 | } else { |
3411 | Out << (IsArrow ? "pt" : "dt"); |
3412 | mangleExpression(Base); |
3413 | } |
3414 | } |
3415 | |
3416 | |
3417 | void CXXNameMangler::mangleMemberExpr(const Expr *base, |
3418 | bool isArrow, |
3419 | NestedNameSpecifier *qualifier, |
3420 | NamedDecl *firstQualifierLookup, |
3421 | DeclarationName member, |
3422 | const TemplateArgumentLoc *TemplateArgs, |
3423 | unsigned NumTemplateArgs, |
3424 | unsigned arity) { |
3425 | |
3426 | |
3427 | if (base) |
3428 | mangleMemberExprBase(base, isArrow); |
3429 | mangleUnresolvedName(qualifier, member, TemplateArgs, NumTemplateArgs, arity); |
3430 | } |
3431 | |
3432 | |
3433 | |
3434 | |
3435 | static bool isParenthesizedADLCallee(const CallExpr *call) { |
3436 | const Expr *callee = call->getCallee(); |
3437 | const Expr *fn = callee->IgnoreParens(); |
3438 | |
3439 | |
3440 | |
3441 | |
3442 | if (callee == fn) return false; |
3443 | |
3444 | |
3445 | const UnresolvedLookupExpr *lookup = dyn_cast<UnresolvedLookupExpr>(fn); |
3446 | if (!lookup) return false; |
3447 | |
3448 | requiresADL()", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3448, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!lookup->requiresADL()); |
3449 | |
3450 | |
3451 | if (lookup->getQualifier()) return false; |
3452 | |
3453 | |
3454 | |
3455 | if (lookup->getNumDecls() > 0 && |
3456 | (*lookup->decls_begin())->isCXXClassMember()) |
3457 | return false; |
3458 | |
3459 | |
3460 | return true; |
3461 | } |
3462 | |
3463 | void CXXNameMangler::mangleCastExpression(const Expr *E, StringRef CastEncoding) { |
3464 | const ExplicitCastExpr *ECE = cast<ExplicitCastExpr>(E); |
3465 | Out << CastEncoding; |
3466 | mangleType(ECE->getType()); |
3467 | mangleExpression(ECE->getSubExpr()); |
3468 | } |
3469 | |
3470 | void CXXNameMangler::mangleInitListElements(const InitListExpr *InitList) { |
3471 | if (auto *Syntactic = InitList->getSyntacticForm()) |
3472 | InitList = Syntactic; |
3473 | for (unsigned i = 0, e = InitList->getNumInits(); i != e; ++i) |
3474 | mangleExpression(InitList->getInit(i)); |
3475 | } |
3476 | |
3477 | void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) { |
3478 | |
3479 | |
3480 | |
3481 | |
3482 | |
3483 | |
3484 | |
3485 | |
3486 | |
3487 | |
3488 | |
3489 | |
3490 | |
3491 | |
3492 | |
3493 | |
3494 | |
3495 | |
3496 | |
3497 | |
3498 | |
3499 | |
3500 | |
3501 | QualType ImplicitlyConvertedToType; |
3502 | |
3503 | recurse: |
3504 | switch (E->getStmtClass()) { |
3505 | case Expr::NoStmtClass: |
3506 | #define ABSTRACT_STMT(Type) |
3507 | #define EXPR(Type, Base) |
3508 | #define STMT(Type, Base) \ |
3509 | case Expr::Type##Class: |
3510 | #include "clang/AST/StmtNodes.inc" |
3511 | |
3512 | |
3513 | |
3514 | |
3515 | case Expr::AddrLabelExprClass: |
3516 | case Expr::DesignatedInitUpdateExprClass: |
3517 | case Expr::ImplicitValueInitExprClass: |
3518 | case Expr::ArrayInitLoopExprClass: |
3519 | case Expr::ArrayInitIndexExprClass: |
3520 | case Expr::NoInitExprClass: |
3521 | case Expr::ParenListExprClass: |
3522 | case Expr::LambdaExprClass: |
3523 | case Expr::MSPropertyRefExprClass: |
3524 | case Expr::MSPropertySubscriptExprClass: |
3525 | case Expr::TypoExprClass: |
3526 | case Expr::OMPArraySectionExprClass: |
3527 | case Expr::CXXInheritedCtorInitExprClass: |
3528 | llvm_unreachable("unexpected statement kind"); |
3529 | |
3530 | case Expr::ConstantExprClass: |
3531 | E = cast<ConstantExpr>(E)->getSubExpr(); |
3532 | goto recurse; |
3533 | |
3534 | |
3535 | case Expr::BlockExprClass: |
3536 | case Expr::ChooseExprClass: |
3537 | case Expr::CompoundLiteralExprClass: |
3538 | case Expr::ExtVectorElementExprClass: |
3539 | case Expr::GenericSelectionExprClass: |
3540 | case Expr::ObjCEncodeExprClass: |
3541 | case Expr::ObjCIsaExprClass: |
3542 | case Expr::ObjCIvarRefExprClass: |
3543 | case Expr::ObjCMessageExprClass: |
3544 | case Expr::ObjCPropertyRefExprClass: |
3545 | case Expr::ObjCProtocolExprClass: |
3546 | case Expr::ObjCSelectorExprClass: |
3547 | case Expr::ObjCStringLiteralClass: |
3548 | case Expr::ObjCBoxedExprClass: |
3549 | case Expr::ObjCArrayLiteralClass: |
3550 | case Expr::ObjCDictionaryLiteralClass: |
3551 | case Expr::ObjCSubscriptRefExprClass: |
3552 | case Expr::ObjCIndirectCopyRestoreExprClass: |
3553 | case Expr::ObjCAvailabilityCheckExprClass: |
3554 | case Expr::OffsetOfExprClass: |
3555 | case Expr::PredefinedExprClass: |
3556 | case Expr::ShuffleVectorExprClass: |
3557 | case Expr::ConvertVectorExprClass: |
3558 | case Expr::StmtExprClass: |
3559 | case Expr::TypeTraitExprClass: |
3560 | case Expr::ArrayTypeTraitExprClass: |
3561 | case Expr::ExpressionTraitExprClass: |
3562 | case Expr::VAArgExprClass: |
3563 | case Expr::CUDAKernelCallExprClass: |
3564 | case Expr::AsTypeExprClass: |
3565 | case Expr::PseudoObjectExprClass: |
3566 | case Expr::AtomicExprClass: |
3567 | case Expr::FixedPointLiteralClass: |
3568 | { |
3569 | if (!NullOut) { |
3570 | |
3571 | DiagnosticsEngine &Diags = Context.getDiags(); |
3572 | unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, |
3573 | "cannot yet mangle expression type %0"); |
3574 | Diags.Report(E->getExprLoc(), DiagID) |
3575 | << E->getStmtClassName() << E->getSourceRange(); |
3576 | } |
3577 | break; |
3578 | } |
3579 | |
3580 | case Expr::CXXUuidofExprClass: { |
3581 | const CXXUuidofExpr *UE = cast<CXXUuidofExpr>(E); |
3582 | if (UE->isTypeOperand()) { |
3583 | QualType UuidT = UE->getTypeOperand(Context.getASTContext()); |
3584 | Out << "u8__uuidoft"; |
3585 | mangleType(UuidT); |
3586 | } else { |
3587 | Expr *UuidExp = UE->getExprOperand(); |
3588 | Out << "u8__uuidofz"; |
3589 | mangleExpression(UuidExp, Arity); |
3590 | } |
3591 | break; |
3592 | } |
3593 | |
3594 | |
3595 | case Expr::BinaryConditionalOperatorClass: { |
3596 | DiagnosticsEngine &Diags = Context.getDiags(); |
3597 | unsigned DiagID = |
3598 | Diags.getCustomDiagID(DiagnosticsEngine::Error, |
3599 | "?: operator with omitted middle operand cannot be mangled"); |
3600 | Diags.Report(E->getExprLoc(), DiagID) |
3601 | << E->getStmtClassName() << E->getSourceRange(); |
3602 | break; |
3603 | } |
3604 | |
3605 | |
3606 | case Expr::OpaqueValueExprClass: |
3607 | llvm_unreachable("cannot mangle opaque value; mangling wrong thing?"); |
3608 | |
3609 | case Expr::InitListExprClass: { |
3610 | Out << "il"; |
3611 | mangleInitListElements(cast<InitListExpr>(E)); |
3612 | Out << "E"; |
3613 | break; |
3614 | } |
3615 | |
3616 | case Expr::DesignatedInitExprClass: { |
3617 | auto *DIE = cast<DesignatedInitExpr>(E); |
3618 | for (const auto &Designator : DIE->designators()) { |
3619 | if (Designator.isFieldDesignator()) { |
3620 | Out << "di"; |
3621 | mangleSourceName(Designator.getFieldName()); |
3622 | } else if (Designator.isArrayDesignator()) { |
3623 | Out << "dx"; |
3624 | mangleExpression(DIE->getArrayIndex(Designator)); |
3625 | } else { |
3626 | (0) . __assert_fail ("Designator.isArrayRangeDesignator() && \"unknown designator kind\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3627, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(Designator.isArrayRangeDesignator() && |
3627 | (0) . __assert_fail ("Designator.isArrayRangeDesignator() && \"unknown designator kind\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3627, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "unknown designator kind"); |
3628 | Out << "dX"; |
3629 | mangleExpression(DIE->getArrayRangeStart(Designator)); |
3630 | mangleExpression(DIE->getArrayRangeEnd(Designator)); |
3631 | } |
3632 | } |
3633 | mangleExpression(DIE->getInit()); |
3634 | break; |
3635 | } |
3636 | |
3637 | case Expr::CXXDefaultArgExprClass: |
3638 | mangleExpression(cast<CXXDefaultArgExpr>(E)->getExpr(), Arity); |
3639 | break; |
3640 | |
3641 | case Expr::CXXDefaultInitExprClass: |
3642 | mangleExpression(cast<CXXDefaultInitExpr>(E)->getExpr(), Arity); |
3643 | break; |
3644 | |
3645 | case Expr::CXXStdInitializerListExprClass: |
3646 | mangleExpression(cast<CXXStdInitializerListExpr>(E)->getSubExpr(), Arity); |
3647 | break; |
3648 | |
3649 | case Expr::SubstNonTypeTemplateParmExprClass: |
3650 | mangleExpression(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement(), |
3651 | Arity); |
3652 | break; |
3653 | |
3654 | case Expr::UserDefinedLiteralClass: |
3655 | |
3656 | |
3657 | case Expr::CXXMemberCallExprClass: |
3658 | case Expr::CallExprClass: { |
3659 | const CallExpr *CE = cast<CallExpr>(E); |
3660 | |
3661 | |
3662 | |
3663 | |
3664 | |
3665 | if (isParenthesizedADLCallee(CE)) { |
3666 | Out << "cp"; |
3667 | |
3668 | |
3669 | |
3670 | |
3671 | |
3672 | } else { |
3673 | Out << "cl"; |
3674 | } |
3675 | |
3676 | unsigned CallArity = CE->getNumArgs(); |
3677 | for (const Expr *Arg : CE->arguments()) |
3678 | if (isa<PackExpansionExpr>(Arg)) |
3679 | CallArity = UnknownArity; |
3680 | |
3681 | mangleExpression(CE->getCallee(), CallArity); |
3682 | for (const Expr *Arg : CE->arguments()) |
3683 | mangleExpression(Arg); |
3684 | Out << 'E'; |
3685 | break; |
3686 | } |
3687 | |
3688 | case Expr::CXXNewExprClass: { |
3689 | const CXXNewExpr *New = cast<CXXNewExpr>(E); |
3690 | if (New->isGlobalNew()) Out << "gs"; |
3691 | Out << (New->isArray() ? "na" : "nw"); |
3692 | for (CXXNewExpr::const_arg_iterator I = New->placement_arg_begin(), |
3693 | E = New->placement_arg_end(); I != E; ++I) |
3694 | mangleExpression(*I); |
3695 | Out << '_'; |
3696 | mangleType(New->getAllocatedType()); |
3697 | if (New->hasInitializer()) { |
3698 | if (New->getInitializationStyle() == CXXNewExpr::ListInit) |
3699 | Out << "il"; |
3700 | else |
3701 | Out << "pi"; |
3702 | const Expr *Init = New->getInitializer(); |
3703 | if (const CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(Init)) { |
3704 | |
3705 | for (CXXConstructExpr::const_arg_iterator I = CCE->arg_begin(), |
3706 | E = CCE->arg_end(); |
3707 | I != E; ++I) |
3708 | mangleExpression(*I); |
3709 | } else if (const ParenListExpr *PLE = dyn_cast<ParenListExpr>(Init)) { |
3710 | for (unsigned i = 0, e = PLE->getNumExprs(); i != e; ++i) |
3711 | mangleExpression(PLE->getExpr(i)); |
3712 | } else if (New->getInitializationStyle() == CXXNewExpr::ListInit && |
3713 | isa<InitListExpr>(Init)) { |
3714 | |
3715 | mangleInitListElements(cast<InitListExpr>(Init)); |
3716 | } else |
3717 | mangleExpression(Init); |
3718 | } |
3719 | Out << 'E'; |
3720 | break; |
3721 | } |
3722 | |
3723 | case Expr::CXXPseudoDestructorExprClass: { |
3724 | const auto *PDE = cast<CXXPseudoDestructorExpr>(E); |
3725 | if (const Expr *Base = PDE->getBase()) |
3726 | mangleMemberExprBase(Base, PDE->isArrow()); |
3727 | NestedNameSpecifier *Qualifier = PDE->getQualifier(); |
3728 | if (TypeSourceInfo *ScopeInfo = PDE->getScopeTypeInfo()) { |
3729 | if (Qualifier) { |
3730 | mangleUnresolvedPrefix(Qualifier, |
3731 | ); |
3732 | mangleUnresolvedTypeOrSimpleId(ScopeInfo->getType()); |
3733 | Out << 'E'; |
3734 | } else { |
3735 | Out << "sr"; |
3736 | if (!mangleUnresolvedTypeOrSimpleId(ScopeInfo->getType())) |
3737 | Out << 'E'; |
3738 | } |
3739 | } else if (Qualifier) { |
3740 | mangleUnresolvedPrefix(Qualifier); |
3741 | } |
3742 | |
3743 | Out << "dn"; |
3744 | QualType DestroyedType = PDE->getDestroyedType(); |
3745 | mangleUnresolvedTypeOrSimpleId(DestroyedType); |
3746 | break; |
3747 | } |
3748 | |
3749 | case Expr::MemberExprClass: { |
3750 | const MemberExpr *ME = cast<MemberExpr>(E); |
3751 | mangleMemberExpr(ME->getBase(), ME->isArrow(), |
3752 | ME->getQualifier(), nullptr, |
3753 | ME->getMemberDecl()->getDeclName(), |
3754 | ME->getTemplateArgs(), ME->getNumTemplateArgs(), |
3755 | Arity); |
3756 | break; |
3757 | } |
3758 | |
3759 | case Expr::UnresolvedMemberExprClass: { |
3760 | const UnresolvedMemberExpr *ME = cast<UnresolvedMemberExpr>(E); |
3761 | mangleMemberExpr(ME->isImplicitAccess() ? nullptr : ME->getBase(), |
3762 | ME->isArrow(), ME->getQualifier(), nullptr, |
3763 | ME->getMemberName(), |
3764 | ME->getTemplateArgs(), ME->getNumTemplateArgs(), |
3765 | Arity); |
3766 | break; |
3767 | } |
3768 | |
3769 | case Expr::CXXDependentScopeMemberExprClass: { |
3770 | const CXXDependentScopeMemberExpr *ME |
3771 | = cast<CXXDependentScopeMemberExpr>(E); |
3772 | mangleMemberExpr(ME->isImplicitAccess() ? nullptr : ME->getBase(), |
3773 | ME->isArrow(), ME->getQualifier(), |
3774 | ME->getFirstQualifierFoundInScope(), |
3775 | ME->getMember(), |
3776 | ME->getTemplateArgs(), ME->getNumTemplateArgs(), |
3777 | Arity); |
3778 | break; |
3779 | } |
3780 | |
3781 | case Expr::UnresolvedLookupExprClass: { |
3782 | const UnresolvedLookupExpr *ULE = cast<UnresolvedLookupExpr>(E); |
3783 | mangleUnresolvedName(ULE->getQualifier(), ULE->getName(), |
3784 | ULE->getTemplateArgs(), ULE->getNumTemplateArgs(), |
3785 | Arity); |
3786 | break; |
3787 | } |
3788 | |
3789 | case Expr::CXXUnresolvedConstructExprClass: { |
3790 | const CXXUnresolvedConstructExpr *CE = cast<CXXUnresolvedConstructExpr>(E); |
3791 | unsigned N = CE->arg_size(); |
3792 | |
3793 | if (CE->isListInitialization()) { |
3794 | (0) . __assert_fail ("N == 1 && \"unexpected form for list initialization\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3794, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(N == 1 && "unexpected form for list initialization"); |
3795 | auto *IL = cast<InitListExpr>(CE->getArg(0)); |
3796 | Out << "tl"; |
3797 | mangleType(CE->getType()); |
3798 | mangleInitListElements(IL); |
3799 | Out << "E"; |
3800 | return; |
3801 | } |
3802 | |
3803 | Out << "cv"; |
3804 | mangleType(CE->getType()); |
3805 | if (N != 1) Out << '_'; |
3806 | for (unsigned I = 0; I != N; ++I) mangleExpression(CE->getArg(I)); |
3807 | if (N != 1) Out << 'E'; |
3808 | break; |
3809 | } |
3810 | |
3811 | case Expr::CXXConstructExprClass: { |
3812 | const auto *CE = cast<CXXConstructExpr>(E); |
3813 | if (!CE->isListInitialization() || CE->isStdInitListInitialization()) { |
3814 | (0) . __assert_fail ("CE->getNumArgs() >= 1 && (CE->getNumArgs() == 1 || isa(CE->getArg(1))) && \"implicit CXXConstructExpr must have one argument\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3817, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert( |
3815 | (0) . __assert_fail ("CE->getNumArgs() >= 1 && (CE->getNumArgs() == 1 || isa(CE->getArg(1))) && \"implicit CXXConstructExpr must have one argument\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3817, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> CE->getNumArgs() >= 1 && |
3816 | (0) . __assert_fail ("CE->getNumArgs() >= 1 && (CE->getNumArgs() == 1 || isa(CE->getArg(1))) && \"implicit CXXConstructExpr must have one argument\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3817, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> (CE->getNumArgs() == 1 || isa<CXXDefaultArgExpr>(CE->getArg(1))) && |
3817 | (0) . __assert_fail ("CE->getNumArgs() >= 1 && (CE->getNumArgs() == 1 || isa(CE->getArg(1))) && \"implicit CXXConstructExpr must have one argument\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 3817, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "implicit CXXConstructExpr must have one argument"); |
3818 | return mangleExpression(cast<CXXConstructExpr>(E)->getArg(0)); |
3819 | } |
3820 | Out << "il"; |
3821 | for (auto *E : CE->arguments()) |
3822 | mangleExpression(E); |
3823 | Out << "E"; |
3824 | break; |
3825 | } |
3826 | |
3827 | case Expr::CXXTemporaryObjectExprClass: { |
3828 | const auto *CE = cast<CXXTemporaryObjectExpr>(E); |
3829 | unsigned N = CE->getNumArgs(); |
3830 | bool List = CE->isListInitialization(); |
3831 | |
3832 | if (List) |
3833 | Out << "tl"; |
3834 | else |
3835 | Out << "cv"; |
3836 | mangleType(CE->getType()); |
3837 | if (!List && N != 1) |
3838 | Out << '_'; |
3839 | if (CE->isStdInitListInitialization()) { |
3840 | |
3841 | |
3842 | |
3843 | auto *SILE = |
3844 | cast<CXXStdInitializerListExpr>(CE->getArg(0)->IgnoreImplicit()); |
3845 | auto *ILE = cast<InitListExpr>(SILE->getSubExpr()->IgnoreImplicit()); |
3846 | mangleInitListElements(ILE); |
3847 | } else { |
3848 | for (auto *E : CE->arguments()) |
3849 | mangleExpression(E); |
3850 | } |
3851 | if (List || N != 1) |
3852 | Out << 'E'; |
3853 | break; |
3854 | } |
3855 | |
3856 | case Expr::CXXScalarValueInitExprClass: |
3857 | Out << "cv"; |
3858 | mangleType(E->getType()); |
3859 | Out << "_E"; |
3860 | break; |
3861 | |
3862 | case Expr::CXXNoexceptExprClass: |
3863 | Out << "nx"; |
3864 | mangleExpression(cast<CXXNoexceptExpr>(E)->getOperand()); |
3865 | break; |
3866 | |
3867 | case Expr::UnaryExprOrTypeTraitExprClass: { |
3868 | const UnaryExprOrTypeTraitExpr *SAE = cast<UnaryExprOrTypeTraitExpr>(E); |
3869 | |
3870 | if (!SAE->isInstantiationDependent()) { |
3871 | |
3872 | |
3873 | |
3874 | |
3875 | |
3876 | |
3877 | |
3878 | |
3879 | QualType T = (ImplicitlyConvertedToType.isNull() || |
3880 | !ImplicitlyConvertedToType->isIntegerType())? SAE->getType() |
3881 | : ImplicitlyConvertedToType; |
3882 | llvm::APSInt V = SAE->EvaluateKnownConstInt(Context.getASTContext()); |
3883 | mangleIntegerLiteral(T, V); |
3884 | break; |
3885 | } |
3886 | |
3887 | switch(SAE->getKind()) { |
3888 | case UETT_SizeOf: |
3889 | Out << 's'; |
3890 | break; |
3891 | case UETT_PreferredAlignOf: |
3892 | case UETT_AlignOf: |
3893 | Out << 'a'; |
3894 | break; |
3895 | case UETT_VecStep: { |
3896 | DiagnosticsEngine &Diags = Context.getDiags(); |
3897 | unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, |
3898 | "cannot yet mangle vec_step expression"); |
3899 | Diags.Report(DiagID); |
3900 | return; |
3901 | } |
3902 | case UETT_OpenMPRequiredSimdAlign: |
3903 | DiagnosticsEngine &Diags = Context.getDiags(); |
3904 | unsigned DiagID = Diags.getCustomDiagID( |
3905 | DiagnosticsEngine::Error, |
3906 | "cannot yet mangle __builtin_omp_required_simd_align expression"); |
3907 | Diags.Report(DiagID); |
3908 | return; |
3909 | } |
3910 | if (SAE->isArgumentType()) { |
3911 | Out << 't'; |
3912 | mangleType(SAE->getArgumentType()); |
3913 | } else { |
3914 | Out << 'z'; |
3915 | mangleExpression(SAE->getArgumentExpr()); |
3916 | } |
3917 | break; |
3918 | } |
3919 | |
3920 | case Expr::CXXThrowExprClass: { |
3921 | const CXXThrowExpr *TE = cast<CXXThrowExpr>(E); |
3922 | |
3923 | |
3924 | if (TE->getSubExpr()) { |
3925 | Out << "tw"; |
3926 | mangleExpression(TE->getSubExpr()); |
3927 | } else { |
3928 | Out << "tr"; |
3929 | } |
3930 | break; |
3931 | } |
3932 | |
3933 | case Expr::CXXTypeidExprClass: { |
3934 | const CXXTypeidExpr *TIE = cast<CXXTypeidExpr>(E); |
3935 | |
3936 | |
3937 | if (TIE->isTypeOperand()) { |
3938 | Out << "ti"; |
3939 | mangleType(TIE->getTypeOperand(Context.getASTContext())); |
3940 | } else { |
3941 | Out << "te"; |
3942 | mangleExpression(TIE->getExprOperand()); |
3943 | } |
3944 | break; |
3945 | } |
3946 | |
3947 | case Expr::CXXDeleteExprClass: { |
3948 | const CXXDeleteExpr *DE = cast<CXXDeleteExpr>(E); |
3949 | |
3950 | |
3951 | if (DE->isGlobalDelete()) Out << "gs"; |
3952 | Out << (DE->isArrayForm() ? "da" : "dl"); |
3953 | mangleExpression(DE->getArgument()); |
3954 | break; |
3955 | } |
3956 | |
3957 | case Expr::UnaryOperatorClass: { |
3958 | const UnaryOperator *UO = cast<UnaryOperator>(E); |
3959 | mangleOperatorName(UnaryOperator::getOverloadedOperator(UO->getOpcode()), |
3960 | ); |
3961 | mangleExpression(UO->getSubExpr()); |
3962 | break; |
3963 | } |
3964 | |
3965 | case Expr::ArraySubscriptExprClass: { |
3966 | const ArraySubscriptExpr *AE = cast<ArraySubscriptExpr>(E); |
3967 | |
3968 | |
3969 | |
3970 | Out << "ix"; |
3971 | mangleExpression(AE->getLHS()); |
3972 | mangleExpression(AE->getRHS()); |
3973 | break; |
3974 | } |
3975 | |
3976 | case Expr::CompoundAssignOperatorClass: |
3977 | case Expr::BinaryOperatorClass: { |
3978 | const BinaryOperator *BO = cast<BinaryOperator>(E); |
3979 | if (BO->getOpcode() == BO_PtrMemD) |
3980 | Out << "ds"; |
3981 | else |
3982 | mangleOperatorName(BinaryOperator::getOverloadedOperator(BO->getOpcode()), |
3983 | ); |
3984 | mangleExpression(BO->getLHS()); |
3985 | mangleExpression(BO->getRHS()); |
3986 | break; |
3987 | } |
3988 | |
3989 | case Expr::ConditionalOperatorClass: { |
3990 | const ConditionalOperator *CO = cast<ConditionalOperator>(E); |
3991 | mangleOperatorName(OO_Conditional, ); |
3992 | mangleExpression(CO->getCond()); |
3993 | mangleExpression(CO->getLHS(), Arity); |
3994 | mangleExpression(CO->getRHS(), Arity); |
3995 | break; |
3996 | } |
3997 | |
3998 | case Expr::ImplicitCastExprClass: { |
3999 | ImplicitlyConvertedToType = E->getType(); |
4000 | E = cast<ImplicitCastExpr>(E)->getSubExpr(); |
4001 | goto recurse; |
4002 | } |
4003 | |
4004 | case Expr::ObjCBridgedCastExprClass: { |
4005 | |
4006 | |
4007 | StringRef Kind = cast<ObjCBridgedCastExpr>(E)->getBridgeKindName(); |
4008 | Out << "v1U" << Kind.size() << Kind; |
4009 | } |
4010 | |
4011 | LLVM_FALLTHROUGH; |
4012 | |
4013 | case Expr::CStyleCastExprClass: |
4014 | mangleCastExpression(E, "cv"); |
4015 | break; |
4016 | |
4017 | case Expr::CXXFunctionalCastExprClass: { |
4018 | auto *Sub = cast<ExplicitCastExpr>(E)->getSubExpr()->IgnoreImplicit(); |
4019 | |
4020 | if (auto *CCE = dyn_cast<CXXConstructExpr>(Sub)) |
4021 | if (CCE->getParenOrBraceRange().isInvalid()) |
4022 | Sub = CCE->getArg(0)->IgnoreImplicit(); |
4023 | if (auto *StdInitList = dyn_cast<CXXStdInitializerListExpr>(Sub)) |
4024 | Sub = StdInitList->getSubExpr()->IgnoreImplicit(); |
4025 | if (auto *IL = dyn_cast<InitListExpr>(Sub)) { |
4026 | Out << "tl"; |
4027 | mangleType(E->getType()); |
4028 | mangleInitListElements(IL); |
4029 | Out << "E"; |
4030 | } else { |
4031 | mangleCastExpression(E, "cv"); |
4032 | } |
4033 | break; |
4034 | } |
4035 | |
4036 | case Expr::CXXStaticCastExprClass: |
4037 | mangleCastExpression(E, "sc"); |
4038 | break; |
4039 | case Expr::CXXDynamicCastExprClass: |
4040 | mangleCastExpression(E, "dc"); |
4041 | break; |
4042 | case Expr::CXXReinterpretCastExprClass: |
4043 | mangleCastExpression(E, "rc"); |
4044 | break; |
4045 | case Expr::CXXConstCastExprClass: |
4046 | mangleCastExpression(E, "cc"); |
4047 | break; |
4048 | |
4049 | case Expr::CXXOperatorCallExprClass: { |
4050 | const CXXOperatorCallExpr *CE = cast<CXXOperatorCallExpr>(E); |
4051 | unsigned NumArgs = CE->getNumArgs(); |
4052 | |
4053 | |
4054 | if (CE->getOperator() != OO_Arrow) |
4055 | mangleOperatorName(CE->getOperator(), ); |
4056 | |
4057 | for (unsigned i = 0; i != NumArgs; ++i) |
4058 | mangleExpression(CE->getArg(i)); |
4059 | break; |
4060 | } |
4061 | |
4062 | case Expr::ParenExprClass: |
4063 | mangleExpression(cast<ParenExpr>(E)->getSubExpr(), Arity); |
4064 | break; |
4065 | |
4066 | case Expr::DeclRefExprClass: { |
4067 | const NamedDecl *D = cast<DeclRefExpr>(E)->getDecl(); |
4068 | |
4069 | switch (D->getKind()) { |
4070 | default: |
4071 | |
4072 | Out << 'L'; |
4073 | mangle(D); |
4074 | Out << 'E'; |
4075 | break; |
4076 | |
4077 | case Decl::ParmVar: |
4078 | mangleFunctionParam(cast<ParmVarDecl>(D)); |
4079 | break; |
4080 | |
4081 | case Decl::EnumConstant: { |
4082 | const EnumConstantDecl *ED = cast<EnumConstantDecl>(D); |
4083 | mangleIntegerLiteral(ED->getType(), ED->getInitVal()); |
4084 | break; |
4085 | } |
4086 | |
4087 | case Decl::NonTypeTemplateParm: { |
4088 | const NonTypeTemplateParmDecl *PD = cast<NonTypeTemplateParmDecl>(D); |
4089 | mangleTemplateParameter(PD->getIndex()); |
4090 | break; |
4091 | } |
4092 | |
4093 | } |
4094 | |
4095 | break; |
4096 | } |
4097 | |
4098 | case Expr::SubstNonTypeTemplateParmPackExprClass: |
4099 | |
4100 | |
4101 | |
4102 | |
4103 | Out << "_SUBSTPACK_"; |
4104 | break; |
4105 | |
4106 | case Expr::FunctionParmPackExprClass: { |
4107 | |
4108 | const FunctionParmPackExpr *FPPE = cast<FunctionParmPackExpr>(E); |
4109 | Out << "v110_SUBSTPACK"; |
4110 | mangleFunctionParam(FPPE->getParameterPack()); |
4111 | break; |
4112 | } |
4113 | |
4114 | case Expr::DependentScopeDeclRefExprClass: { |
4115 | const DependentScopeDeclRefExpr *DRE = cast<DependentScopeDeclRefExpr>(E); |
4116 | mangleUnresolvedName(DRE->getQualifier(), DRE->getDeclName(), |
4117 | DRE->getTemplateArgs(), DRE->getNumTemplateArgs(), |
4118 | Arity); |
4119 | break; |
4120 | } |
4121 | |
4122 | case Expr::CXXBindTemporaryExprClass: |
4123 | mangleExpression(cast<CXXBindTemporaryExpr>(E)->getSubExpr()); |
4124 | break; |
4125 | |
4126 | case Expr::ExprWithCleanupsClass: |
4127 | mangleExpression(cast<ExprWithCleanups>(E)->getSubExpr(), Arity); |
4128 | break; |
4129 | |
4130 | case Expr::FloatingLiteralClass: { |
4131 | const FloatingLiteral *FL = cast<FloatingLiteral>(E); |
4132 | Out << 'L'; |
4133 | mangleType(FL->getType()); |
4134 | mangleFloat(FL->getValue()); |
4135 | Out << 'E'; |
4136 | break; |
4137 | } |
4138 | |
4139 | case Expr::CharacterLiteralClass: |
4140 | Out << 'L'; |
4141 | mangleType(E->getType()); |
4142 | Out << cast<CharacterLiteral>(E)->getValue(); |
4143 | Out << 'E'; |
4144 | break; |
4145 | |
4146 | |
4147 | case Expr::ObjCBoolLiteralExprClass: |
4148 | Out << "Lb"; |
4149 | Out << (cast<ObjCBoolLiteralExpr>(E)->getValue() ? '1' : '0'); |
4150 | Out << 'E'; |
4151 | break; |
4152 | |
4153 | case Expr::CXXBoolLiteralExprClass: |
4154 | Out << "Lb"; |
4155 | Out << (cast<CXXBoolLiteralExpr>(E)->getValue() ? '1' : '0'); |
4156 | Out << 'E'; |
4157 | break; |
4158 | |
4159 | case Expr::IntegerLiteralClass: { |
4160 | llvm::APSInt Value(cast<IntegerLiteral>(E)->getValue()); |
4161 | if (E->getType()->isSignedIntegerType()) |
4162 | Value.setIsSigned(true); |
4163 | mangleIntegerLiteral(E->getType(), Value); |
4164 | break; |
4165 | } |
4166 | |
4167 | case Expr::ImaginaryLiteralClass: { |
4168 | const ImaginaryLiteral *IE = cast<ImaginaryLiteral>(E); |
4169 | |
4170 | |
4171 | Out << 'L'; |
4172 | mangleType(E->getType()); |
4173 | if (const FloatingLiteral *Imag = |
4174 | dyn_cast<FloatingLiteral>(IE->getSubExpr())) { |
4175 | |
4176 | mangleFloat(llvm::APFloat(Imag->getValue().getSemantics())); |
4177 | Out << '_'; |
4178 | mangleFloat(Imag->getValue()); |
4179 | } else { |
4180 | Out << "0_"; |
4181 | llvm::APSInt Value(cast<IntegerLiteral>(IE->getSubExpr())->getValue()); |
4182 | if (IE->getSubExpr()->getType()->isSignedIntegerType()) |
4183 | Value.setIsSigned(true); |
4184 | mangleNumber(Value); |
4185 | } |
4186 | Out << 'E'; |
4187 | break; |
4188 | } |
4189 | |
4190 | case Expr::StringLiteralClass: { |
4191 | |
4192 | Out << 'L'; |
4193 | (E->getType())", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 4193, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(isa<ConstantArrayType>(E->getType())); |
4194 | mangleType(E->getType()); |
4195 | Out << 'E'; |
4196 | break; |
4197 | } |
4198 | |
4199 | case Expr::GNUNullExprClass: |
4200 | |
4201 | |
4202 | |
4203 | case Expr::CXXNullPtrLiteralExprClass: { |
4204 | Out << "LDnE"; |
4205 | break; |
4206 | } |
4207 | |
4208 | case Expr::PackExpansionExprClass: |
4209 | Out << "sp"; |
4210 | mangleExpression(cast<PackExpansionExpr>(E)->getPattern()); |
4211 | break; |
4212 | |
4213 | case Expr::SizeOfPackExprClass: { |
4214 | auto *SPE = cast<SizeOfPackExpr>(E); |
4215 | if (SPE->isPartiallySubstituted()) { |
4216 | Out << "sP"; |
4217 | for (const auto &A : SPE->getPartialArguments()) |
4218 | mangleTemplateArg(A); |
4219 | Out << "E"; |
4220 | break; |
4221 | } |
4222 | |
4223 | Out << "sZ"; |
4224 | const NamedDecl *Pack = SPE->getPack(); |
4225 | if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Pack)) |
4226 | mangleTemplateParameter(TTP->getIndex()); |
4227 | else if (const NonTypeTemplateParmDecl *NTTP |
4228 | = dyn_cast<NonTypeTemplateParmDecl>(Pack)) |
4229 | mangleTemplateParameter(NTTP->getIndex()); |
4230 | else if (const TemplateTemplateParmDecl *TempTP |
4231 | = dyn_cast<TemplateTemplateParmDecl>(Pack)) |
4232 | mangleTemplateParameter(TempTP->getIndex()); |
4233 | else |
4234 | mangleFunctionParam(cast<ParmVarDecl>(Pack)); |
4235 | break; |
4236 | } |
4237 | |
4238 | case Expr::MaterializeTemporaryExprClass: { |
4239 | mangleExpression(cast<MaterializeTemporaryExpr>(E)->GetTemporaryExpr()); |
4240 | break; |
4241 | } |
4242 | |
4243 | case Expr::CXXFoldExprClass: { |
4244 | auto *FE = cast<CXXFoldExpr>(E); |
4245 | if (FE->isLeftFold()) |
4246 | Out << (FE->getInit() ? "fL" : "fl"); |
4247 | else |
4248 | Out << (FE->getInit() ? "fR" : "fr"); |
4249 | |
4250 | if (FE->getOperator() == BO_PtrMemD) |
4251 | Out << "ds"; |
4252 | else |
4253 | mangleOperatorName( |
4254 | BinaryOperator::getOverloadedOperator(FE->getOperator()), |
4255 | ); |
4256 | |
4257 | if (FE->getLHS()) |
4258 | mangleExpression(FE->getLHS()); |
4259 | if (FE->getRHS()) |
4260 | mangleExpression(FE->getRHS()); |
4261 | break; |
4262 | } |
4263 | |
4264 | case Expr::CXXThisExprClass: |
4265 | Out << "fpT"; |
4266 | break; |
4267 | |
4268 | case Expr::CoawaitExprClass: |
4269 | |
4270 | Out << "v18co_await"; |
4271 | mangleExpression(cast<CoawaitExpr>(E)->getOperand()); |
4272 | break; |
4273 | |
4274 | case Expr::DependentCoawaitExprClass: |
4275 | |
4276 | Out << "v18co_await"; |
4277 | mangleExpression(cast<DependentCoawaitExpr>(E)->getOperand()); |
4278 | break; |
4279 | |
4280 | case Expr::CoyieldExprClass: |
4281 | |
4282 | Out << "v18co_yield"; |
4283 | mangleExpression(cast<CoawaitExpr>(E)->getOperand()); |
4284 | break; |
4285 | } |
4286 | } |
4287 | |
4288 | |
4289 | |
4290 | |
4291 | |
4292 | |
4293 | |
4294 | |
4295 | |
4296 | |
4297 | |
4298 | |
4299 | |
4300 | |
4301 | |
4302 | |
4303 | |
4304 | |
4305 | |
4306 | |
4307 | |
4308 | |
4309 | |
4310 | |
4311 | |
4312 | |
4313 | |
4314 | |
4315 | |
4316 | void CXXNameMangler::mangleFunctionParam(const ParmVarDecl *parm) { |
4317 | unsigned parmDepth = parm->getFunctionScopeDepth(); |
4318 | unsigned parmIndex = parm->getFunctionScopeIndex(); |
4319 | |
4320 | |
4321 | |
4322 | |
4323 | assert(parmDepth < FunctionTypeDepth.getDepth()); |
4324 | unsigned nestingDepth = FunctionTypeDepth.getDepth() - parmDepth; |
4325 | if (FunctionTypeDepth.isInResultType()) |
4326 | nestingDepth--; |
4327 | |
4328 | if (nestingDepth == 0) { |
4329 | Out << "fp"; |
4330 | } else { |
4331 | Out << "fL" << (nestingDepth - 1) << 'p'; |
4332 | } |
4333 | |
4334 | |
4335 | |
4336 | |
4337 | |
4338 | (0) . __assert_fail ("!parm->getType()->isArrayType() && \"parameter's type is still an array type?\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 4339, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!parm->getType()->isArrayType() |
4339 | (0) . __assert_fail ("!parm->getType()->isArrayType() && \"parameter's type is still an array type?\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 4339, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> && "parameter's type is still an array type?"); |
4340 | |
4341 | if (const DependentAddressSpaceType *DAST = |
4342 | dyn_cast<DependentAddressSpaceType>(parm->getType())) { |
4343 | mangleQualifiers(DAST->getPointeeType().getQualifiers(), DAST); |
4344 | } else { |
4345 | mangleQualifiers(parm->getType().getQualifiers()); |
4346 | } |
4347 | |
4348 | |
4349 | if (parmIndex != 0) { |
4350 | Out << (parmIndex - 1); |
4351 | } |
4352 | Out << '_'; |
4353 | } |
4354 | |
4355 | void CXXNameMangler::mangleCXXCtorType(CXXCtorType T, |
4356 | const CXXRecordDecl *InheritedFrom) { |
4357 | |
4358 | |
4359 | |
4360 | |
4361 | |
4362 | |
4363 | Out << 'C'; |
4364 | if (InheritedFrom) |
4365 | Out << 'I'; |
4366 | switch (T) { |
4367 | case Ctor_Complete: |
4368 | Out << '1'; |
4369 | break; |
4370 | case Ctor_Base: |
4371 | Out << '2'; |
4372 | break; |
4373 | case Ctor_Comdat: |
4374 | Out << '5'; |
4375 | break; |
4376 | case Ctor_DefaultClosure: |
4377 | case Ctor_CopyingClosure: |
4378 | llvm_unreachable("closure constructors don't exist for the Itanium ABI!"); |
4379 | } |
4380 | if (InheritedFrom) |
4381 | mangleName(InheritedFrom); |
4382 | } |
4383 | |
4384 | void CXXNameMangler::mangleCXXDtorType(CXXDtorType T) { |
4385 | |
4386 | |
4387 | |
4388 | |
4389 | |
4390 | switch (T) { |
4391 | case Dtor_Deleting: |
4392 | Out << "D0"; |
4393 | break; |
4394 | case Dtor_Complete: |
4395 | Out << "D1"; |
4396 | break; |
4397 | case Dtor_Base: |
4398 | Out << "D2"; |
4399 | break; |
4400 | case Dtor_Comdat: |
4401 | Out << "D5"; |
4402 | break; |
4403 | } |
4404 | } |
4405 | |
4406 | void CXXNameMangler::mangleTemplateArgs(const TemplateArgumentLoc *TemplateArgs, |
4407 | unsigned NumTemplateArgs) { |
4408 | |
4409 | Out << 'I'; |
4410 | for (unsigned i = 0; i != NumTemplateArgs; ++i) |
4411 | mangleTemplateArg(TemplateArgs[i].getArgument()); |
4412 | Out << 'E'; |
4413 | } |
4414 | |
4415 | void CXXNameMangler::mangleTemplateArgs(const TemplateArgumentList &AL) { |
4416 | |
4417 | Out << 'I'; |
4418 | for (unsigned i = 0, e = AL.size(); i != e; ++i) |
4419 | mangleTemplateArg(AL[i]); |
4420 | Out << 'E'; |
4421 | } |
4422 | |
4423 | void CXXNameMangler::mangleTemplateArgs(const TemplateArgument *TemplateArgs, |
4424 | unsigned NumTemplateArgs) { |
4425 | |
4426 | Out << 'I'; |
4427 | for (unsigned i = 0; i != NumTemplateArgs; ++i) |
4428 | mangleTemplateArg(TemplateArgs[i]); |
4429 | Out << 'E'; |
4430 | } |
4431 | |
4432 | void CXXNameMangler::mangleTemplateArg(TemplateArgument A) { |
4433 | |
4434 | |
4435 | |
4436 | |
4437 | if (!A.isInstantiationDependent() || A.isDependent()) |
4438 | A = Context.getASTContext().getCanonicalTemplateArgument(A); |
4439 | |
4440 | switch (A.getKind()) { |
4441 | case TemplateArgument::Null: |
4442 | llvm_unreachable("Cannot mangle NULL template argument"); |
4443 | |
4444 | case TemplateArgument::Type: |
4445 | mangleType(A.getAsType()); |
4446 | break; |
4447 | case TemplateArgument::Template: |
4448 | |
4449 | mangleType(A.getAsTemplate()); |
4450 | break; |
4451 | case TemplateArgument::TemplateExpansion: |
4452 | |
4453 | Out << "Dp"; |
4454 | mangleType(A.getAsTemplateOrTemplatePattern()); |
4455 | break; |
4456 | case TemplateArgument::Expression: { |
4457 | |
4458 | |
4459 | |
4460 | const Expr *E = A.getAsExpr()->IgnoreParens(); |
4461 | if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) { |
4462 | const ValueDecl *D = DRE->getDecl(); |
4463 | if (isa<VarDecl>(D) || isa<FunctionDecl>(D)) { |
4464 | Out << 'L'; |
4465 | mangle(D); |
4466 | Out << 'E'; |
4467 | break; |
4468 | } |
4469 | } |
4470 | |
4471 | Out << 'X'; |
4472 | mangleExpression(E); |
4473 | Out << 'E'; |
4474 | break; |
4475 | } |
4476 | case TemplateArgument::Integral: |
4477 | mangleIntegerLiteral(A.getIntegralType(), A.getAsIntegral()); |
4478 | break; |
4479 | case TemplateArgument::Declaration: { |
4480 | |
4481 | |
4482 | |
4483 | |
4484 | ValueDecl *D = A.getAsDecl(); |
4485 | bool compensateMangling = !A.getParamTypeForDecl()->isReferenceType(); |
4486 | if (compensateMangling) { |
4487 | Out << 'X'; |
4488 | mangleOperatorName(OO_Amp, 1); |
4489 | } |
4490 | |
4491 | Out << 'L'; |
4492 | |
4493 | |
4494 | mangle(D); |
4495 | Out << 'E'; |
4496 | |
4497 | if (compensateMangling) |
4498 | Out << 'E'; |
4499 | |
4500 | break; |
4501 | } |
4502 | case TemplateArgument::NullPtr: { |
4503 | |
4504 | Out << 'L'; |
4505 | mangleType(A.getNullPtrType()); |
4506 | Out << "0E"; |
4507 | break; |
4508 | } |
4509 | case TemplateArgument::Pack: { |
4510 | |
4511 | Out << 'J'; |
4512 | for (const auto &P : A.pack_elements()) |
4513 | mangleTemplateArg(P); |
4514 | Out << 'E'; |
4515 | } |
4516 | } |
4517 | } |
4518 | |
4519 | void CXXNameMangler::mangleTemplateParameter(unsigned Index) { |
4520 | |
4521 | |
4522 | if (Index == 0) |
4523 | Out << "T_"; |
4524 | else |
4525 | Out << 'T' << (Index - 1) << '_'; |
4526 | } |
4527 | |
4528 | void CXXNameMangler::mangleSeqID(unsigned SeqID) { |
4529 | if (SeqID == 1) |
4530 | Out << '0'; |
4531 | else if (SeqID > 1) { |
4532 | SeqID--; |
4533 | |
4534 | |
4535 | char Buffer[7]; |
4536 | MutableArrayRef<char> BufferRef(Buffer); |
4537 | MutableArrayRef<char>::reverse_iterator I = BufferRef.rbegin(); |
4538 | |
4539 | for (; SeqID != 0; SeqID /= 36) { |
4540 | unsigned C = SeqID % 36; |
4541 | *I++ = (C < 10 ? '0' + C : 'A' + C - 10); |
4542 | } |
4543 | |
4544 | Out.write(I.base(), I - BufferRef.rbegin()); |
4545 | } |
4546 | Out << '_'; |
4547 | } |
4548 | |
4549 | void CXXNameMangler::mangleExistingSubstitution(TemplateName tname) { |
4550 | bool result = mangleSubstitution(tname); |
4551 | (0) . __assert_fail ("result && \"no existing substitution for template name\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 4551, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(result && "no existing substitution for template name"); |
4552 | (void) result; |
4553 | } |
4554 | |
4555 | |
4556 | |
4557 | bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) { |
4558 | |
4559 | if (mangleStandardSubstitution(ND)) |
4560 | return true; |
4561 | |
4562 | ND = cast<NamedDecl>(ND->getCanonicalDecl()); |
4563 | return mangleSubstitution(reinterpret_cast<uintptr_t>(ND)); |
4564 | } |
4565 | |
4566 | |
4567 | |
4568 | static bool hasMangledSubstitutionQualifiers(QualType T) { |
4569 | Qualifiers Qs = T.getQualifiers(); |
4570 | return Qs.getCVRQualifiers() || Qs.hasAddressSpace() || Qs.hasUnaligned(); |
4571 | } |
4572 | |
4573 | bool CXXNameMangler::mangleSubstitution(QualType T) { |
4574 | if (!hasMangledSubstitutionQualifiers(T)) { |
4575 | if (const RecordType *RT = T->getAs<RecordType>()) |
4576 | return mangleSubstitution(RT->getDecl()); |
4577 | } |
4578 | |
4579 | uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr()); |
4580 | |
4581 | return mangleSubstitution(TypePtr); |
4582 | } |
4583 | |
4584 | bool CXXNameMangler::mangleSubstitution(TemplateName Template) { |
4585 | if (TemplateDecl *TD = Template.getAsTemplateDecl()) |
4586 | return mangleSubstitution(TD); |
4587 | |
4588 | Template = Context.getASTContext().getCanonicalTemplateName(Template); |
4589 | return mangleSubstitution( |
4590 | reinterpret_cast<uintptr_t>(Template.getAsVoidPointer())); |
4591 | } |
4592 | |
4593 | bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) { |
4594 | llvm::DenseMap<uintptr_t, unsigned>::iterator I = Substitutions.find(Ptr); |
4595 | if (I == Substitutions.end()) |
4596 | return false; |
4597 | |
4598 | unsigned SeqID = I->second; |
4599 | Out << 'S'; |
4600 | mangleSeqID(SeqID); |
4601 | |
4602 | return true; |
4603 | } |
4604 | |
4605 | static bool isCharType(QualType T) { |
4606 | if (T.isNull()) |
4607 | return false; |
4608 | |
4609 | return T->isSpecificBuiltinType(BuiltinType::Char_S) || |
4610 | T->isSpecificBuiltinType(BuiltinType::Char_U); |
4611 | } |
4612 | |
4613 | |
4614 | |
4615 | static bool isCharSpecialization(QualType T, const char *Name) { |
4616 | if (T.isNull()) |
4617 | return false; |
4618 | |
4619 | const RecordType *RT = T->getAs<RecordType>(); |
4620 | if (!RT) |
4621 | return false; |
4622 | |
4623 | const ClassTemplateSpecializationDecl *SD = |
4624 | dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl()); |
4625 | if (!SD) |
4626 | return false; |
4627 | |
4628 | if (!isStdNamespace(getEffectiveDeclContext(SD))) |
4629 | return false; |
4630 | |
4631 | const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs(); |
4632 | if (TemplateArgs.size() != 1) |
4633 | return false; |
4634 | |
4635 | if (!isCharType(TemplateArgs[0].getAsType())) |
4636 | return false; |
4637 | |
4638 | return SD->getIdentifier()->getName() == Name; |
4639 | } |
4640 | |
4641 | template <std::size_t StrLen> |
4642 | static bool isStreamCharSpecialization(const ClassTemplateSpecializationDecl*SD, |
4643 | const char (&Str)[StrLen]) { |
4644 | if (!SD->getIdentifier()->isStr(Str)) |
4645 | return false; |
4646 | |
4647 | const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs(); |
4648 | if (TemplateArgs.size() != 2) |
4649 | return false; |
4650 | |
4651 | if (!isCharType(TemplateArgs[0].getAsType())) |
4652 | return false; |
4653 | |
4654 | if (!isCharSpecialization(TemplateArgs[1].getAsType(), "char_traits")) |
4655 | return false; |
4656 | |
4657 | return true; |
4658 | } |
4659 | |
4660 | bool CXXNameMangler::mangleStandardSubstitution(const NamedDecl *ND) { |
4661 | |
4662 | if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) { |
4663 | if (isStd(NS)) { |
4664 | Out << "St"; |
4665 | return true; |
4666 | } |
4667 | } |
4668 | |
4669 | if (const ClassTemplateDecl *TD = dyn_cast<ClassTemplateDecl>(ND)) { |
4670 | if (!isStdNamespace(getEffectiveDeclContext(TD))) |
4671 | return false; |
4672 | |
4673 | |
4674 | if (TD->getIdentifier()->isStr("allocator")) { |
4675 | Out << "Sa"; |
4676 | return true; |
4677 | } |
4678 | |
4679 | |
4680 | if (TD->getIdentifier()->isStr("basic_string")) { |
4681 | Out << "Sb"; |
4682 | return true; |
4683 | } |
4684 | } |
4685 | |
4686 | if (const ClassTemplateSpecializationDecl *SD = |
4687 | dyn_cast<ClassTemplateSpecializationDecl>(ND)) { |
4688 | if (!isStdNamespace(getEffectiveDeclContext(SD))) |
4689 | return false; |
4690 | |
4691 | |
4692 | |
4693 | |
4694 | if (SD->getIdentifier()->isStr("basic_string")) { |
4695 | const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs(); |
4696 | |
4697 | if (TemplateArgs.size() != 3) |
4698 | return false; |
4699 | |
4700 | if (!isCharType(TemplateArgs[0].getAsType())) |
4701 | return false; |
4702 | |
4703 | if (!isCharSpecialization(TemplateArgs[1].getAsType(), "char_traits")) |
4704 | return false; |
4705 | |
4706 | if (!isCharSpecialization(TemplateArgs[2].getAsType(), "allocator")) |
4707 | return false; |
4708 | |
4709 | Out << "Ss"; |
4710 | return true; |
4711 | } |
4712 | |
4713 | |
4714 | |
4715 | if (isStreamCharSpecialization(SD, "basic_istream")) { |
4716 | Out << "Si"; |
4717 | return true; |
4718 | } |
4719 | |
4720 | |
4721 | |
4722 | if (isStreamCharSpecialization(SD, "basic_ostream")) { |
4723 | Out << "So"; |
4724 | return true; |
4725 | } |
4726 | |
4727 | |
4728 | |
4729 | if (isStreamCharSpecialization(SD, "basic_iostream")) { |
4730 | Out << "Sd"; |
4731 | return true; |
4732 | } |
4733 | } |
4734 | return false; |
4735 | } |
4736 | |
4737 | void CXXNameMangler::addSubstitution(QualType T) { |
4738 | if (!hasMangledSubstitutionQualifiers(T)) { |
4739 | if (const RecordType *RT = T->getAs<RecordType>()) { |
4740 | addSubstitution(RT->getDecl()); |
4741 | return; |
4742 | } |
4743 | } |
4744 | |
4745 | uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr()); |
4746 | addSubstitution(TypePtr); |
4747 | } |
4748 | |
4749 | void CXXNameMangler::addSubstitution(TemplateName Template) { |
4750 | if (TemplateDecl *TD = Template.getAsTemplateDecl()) |
4751 | return addSubstitution(TD); |
4752 | |
4753 | Template = Context.getASTContext().getCanonicalTemplateName(Template); |
4754 | addSubstitution(reinterpret_cast<uintptr_t>(Template.getAsVoidPointer())); |
4755 | } |
4756 | |
4757 | void CXXNameMangler::addSubstitution(uintptr_t Ptr) { |
4758 | (0) . __assert_fail ("!Substitutions.count(Ptr) && \"Substitution already exists!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 4758, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!Substitutions.count(Ptr) && "Substitution already exists!"); |
4759 | Substitutions[Ptr] = SeqID++; |
4760 | } |
4761 | |
4762 | void CXXNameMangler::extendSubstitutions(CXXNameMangler* Other) { |
4763 | (0) . __assert_fail ("Other->SeqID >= SeqID && \"Must be superset of substitutions!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 4763, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(Other->SeqID >= SeqID && "Must be superset of substitutions!"); |
4764 | if (Other->SeqID > SeqID) { |
4765 | Substitutions.swap(Other->Substitutions); |
4766 | SeqID = Other->SeqID; |
4767 | } |
4768 | } |
4769 | |
4770 | CXXNameMangler::AbiTagList |
4771 | CXXNameMangler::makeFunctionReturnTypeTags(const FunctionDecl *FD) { |
4772 | |
4773 | if (DisableDerivedAbiTags) |
4774 | return AbiTagList(); |
4775 | |
4776 | llvm::raw_null_ostream NullOutStream; |
4777 | CXXNameMangler TrackReturnTypeTags(*this, NullOutStream); |
4778 | TrackReturnTypeTags.disableDerivedAbiTags(); |
4779 | |
4780 | const FunctionProtoType *Proto = |
4781 | cast<FunctionProtoType>(FD->getType()->getAs<FunctionType>()); |
4782 | FunctionTypeDepthState saved = TrackReturnTypeTags.FunctionTypeDepth.push(); |
4783 | TrackReturnTypeTags.FunctionTypeDepth.enterResultType(); |
4784 | TrackReturnTypeTags.mangleType(Proto->getReturnType()); |
4785 | TrackReturnTypeTags.FunctionTypeDepth.leaveResultType(); |
4786 | TrackReturnTypeTags.FunctionTypeDepth.pop(saved); |
4787 | |
4788 | return TrackReturnTypeTags.AbiTagsRoot.getSortedUniqueUsedAbiTags(); |
4789 | } |
4790 | |
4791 | CXXNameMangler::AbiTagList |
4792 | CXXNameMangler::makeVariableTypeTags(const VarDecl *VD) { |
4793 | |
4794 | if (DisableDerivedAbiTags) |
4795 | return AbiTagList(); |
4796 | |
4797 | llvm::raw_null_ostream NullOutStream; |
4798 | CXXNameMangler TrackVariableType(*this, NullOutStream); |
4799 | TrackVariableType.disableDerivedAbiTags(); |
4800 | |
4801 | TrackVariableType.mangleType(VD->getType()); |
4802 | |
4803 | return TrackVariableType.AbiTagsRoot.getSortedUniqueUsedAbiTags(); |
4804 | } |
4805 | |
4806 | bool CXXNameMangler::shouldHaveAbiTags(ItaniumMangleContextImpl &C, |
4807 | const VarDecl *VD) { |
4808 | llvm::raw_null_ostream NullOutStream; |
4809 | CXXNameMangler TrackAbiTags(C, NullOutStream, nullptr, true); |
4810 | TrackAbiTags.mangle(VD); |
4811 | return TrackAbiTags.AbiTagsRoot.getUsedAbiTags().size(); |
4812 | } |
4813 | |
4814 | |
4815 | |
4816 | |
4817 | |
4818 | |
4819 | |
4820 | |
4821 | |
4822 | |
4823 | |
4824 | void ItaniumMangleContextImpl::mangleCXXName(const NamedDecl *D, |
4825 | raw_ostream &Out) { |
4826 | (0) . __assert_fail ("(isa(D) || isa(D)) && \"Invalid mangleName() call, argument is not a variable or function!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 4827, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert((isa<FunctionDecl>(D) || isa<VarDecl>(D)) && |
4827 | (0) . __assert_fail ("(isa(D) || isa(D)) && \"Invalid mangleName() call, argument is not a variable or function!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 4827, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "Invalid mangleName() call, argument is not a variable or function!"); |
4828 | (0) . __assert_fail ("!isa(D) && !isa(D) && \"Invalid mangleName() call on 'structor decl!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 4829, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!isa<CXXConstructorDecl>(D) && !isa<CXXDestructorDecl>(D) && |
4829 | (0) . __assert_fail ("!isa(D) && !isa(D) && \"Invalid mangleName() call on 'structor decl!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 4829, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "Invalid mangleName() call on 'structor decl!"); |
4830 | |
4831 | PrettyStackTraceDecl CrashInfo(D, SourceLocation(), |
4832 | getASTContext().getSourceManager(), |
4833 | "Mangling declaration"); |
4834 | |
4835 | CXXNameMangler Mangler(*this, Out, D); |
4836 | Mangler.mangle(D); |
4837 | } |
4838 | |
4839 | void ItaniumMangleContextImpl::mangleCXXCtor(const CXXConstructorDecl *D, |
4840 | CXXCtorType Type, |
4841 | raw_ostream &Out) { |
4842 | CXXNameMangler Mangler(*this, Out, D, Type); |
4843 | Mangler.mangle(D); |
4844 | } |
4845 | |
4846 | void ItaniumMangleContextImpl::mangleCXXDtor(const CXXDestructorDecl *D, |
4847 | CXXDtorType Type, |
4848 | raw_ostream &Out) { |
4849 | CXXNameMangler Mangler(*this, Out, D, Type); |
4850 | Mangler.mangle(D); |
4851 | } |
4852 | |
4853 | void ItaniumMangleContextImpl::mangleCXXCtorComdat(const CXXConstructorDecl *D, |
4854 | raw_ostream &Out) { |
4855 | CXXNameMangler Mangler(*this, Out, D, Ctor_Comdat); |
4856 | Mangler.mangle(D); |
4857 | } |
4858 | |
4859 | void ItaniumMangleContextImpl::mangleCXXDtorComdat(const CXXDestructorDecl *D, |
4860 | raw_ostream &Out) { |
4861 | CXXNameMangler Mangler(*this, Out, D, Dtor_Comdat); |
4862 | Mangler.mangle(D); |
4863 | } |
4864 | |
4865 | void ItaniumMangleContextImpl::mangleThunk(const CXXMethodDecl *MD, |
4866 | const ThunkInfo &Thunk, |
4867 | raw_ostream &Out) { |
4868 | |
4869 | |
4870 | |
4871 | |
4872 | |
4873 | |
4874 | |
4875 | (0) . __assert_fail ("!isa(MD) && \"Use mangleCXXDtor for destructor decls!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 4876, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!isa<CXXDestructorDecl>(MD) && |
4876 | (0) . __assert_fail ("!isa(MD) && \"Use mangleCXXDtor for destructor decls!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 4876, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true"> "Use mangleCXXDtor for destructor decls!"); |
4877 | CXXNameMangler Mangler(*this, Out); |
4878 | Mangler.getStream() << "_ZT"; |
4879 | if (!Thunk.Return.isEmpty()) |
4880 | Mangler.getStream() << 'c'; |
4881 | |
4882 | |
4883 | Mangler.mangleCallOffset(Thunk.This.NonVirtual, |
4884 | Thunk.This.Virtual.Itanium.VCallOffsetOffset); |
4885 | |
4886 | |
4887 | if (!Thunk.Return.isEmpty()) |
4888 | Mangler.mangleCallOffset(Thunk.Return.NonVirtual, |
4889 | Thunk.Return.Virtual.Itanium.VBaseOffsetOffset); |
4890 | |
4891 | Mangler.mangleFunctionEncoding(MD); |
4892 | } |
4893 | |
4894 | void ItaniumMangleContextImpl::mangleCXXDtorThunk( |
4895 | const CXXDestructorDecl *DD, CXXDtorType Type, |
4896 | const ThisAdjustment &ThisAdjustment, raw_ostream &Out) { |
4897 | |
4898 | |
4899 | CXXNameMangler Mangler(*this, Out, DD, Type); |
4900 | Mangler.getStream() << "_ZT"; |
4901 | |
4902 | |
4903 | Mangler.mangleCallOffset(ThisAdjustment.NonVirtual, |
4904 | ThisAdjustment.Virtual.Itanium.VCallOffsetOffset); |
4905 | |
4906 | Mangler.mangleFunctionEncoding(DD); |
4907 | } |
4908 | |
4909 | |
4910 | void ItaniumMangleContextImpl::mangleStaticGuardVariable(const VarDecl *D, |
4911 | raw_ostream &Out) { |
4912 | |
4913 | |
4914 | CXXNameMangler Mangler(*this, Out); |
4915 | |
4916 | |
4917 | Mangler.getStream() << "_ZGV"; |
4918 | Mangler.mangleName(D); |
4919 | } |
4920 | |
4921 | void ItaniumMangleContextImpl::mangleDynamicInitializer(const VarDecl *MD, |
4922 | raw_ostream &Out) { |
4923 | |
4924 | |
4925 | |
4926 | Out << "__cxx_global_var_init"; |
4927 | } |
4928 | |
4929 | void ItaniumMangleContextImpl::mangleDynamicAtExitDestructor(const VarDecl *D, |
4930 | raw_ostream &Out) { |
4931 | |
4932 | CXXNameMangler Mangler(*this, Out); |
4933 | Mangler.getStream() << "__dtor_"; |
4934 | if (shouldMangleDeclName(D)) |
4935 | Mangler.mangle(D); |
4936 | else |
4937 | Mangler.getStream() << D->getName(); |
4938 | } |
4939 | |
4940 | void ItaniumMangleContextImpl::mangleSEHFilterExpression( |
4941 | const NamedDecl *EnclosingDecl, raw_ostream &Out) { |
4942 | CXXNameMangler Mangler(*this, Out); |
4943 | Mangler.getStream() << "__filt_"; |
4944 | if (shouldMangleDeclName(EnclosingDecl)) |
4945 | Mangler.mangle(EnclosingDecl); |
4946 | else |
4947 | Mangler.getStream() << EnclosingDecl->getName(); |
4948 | } |
4949 | |
4950 | void ItaniumMangleContextImpl::mangleSEHFinallyBlock( |
4951 | const NamedDecl *EnclosingDecl, raw_ostream &Out) { |
4952 | CXXNameMangler Mangler(*this, Out); |
4953 | Mangler.getStream() << "__fin_"; |
4954 | if (shouldMangleDeclName(EnclosingDecl)) |
4955 | Mangler.mangle(EnclosingDecl); |
4956 | else |
4957 | Mangler.getStream() << EnclosingDecl->getName(); |
4958 | } |
4959 | |
4960 | void ItaniumMangleContextImpl::mangleItaniumThreadLocalInit(const VarDecl *D, |
4961 | raw_ostream &Out) { |
4962 | |
4963 | CXXNameMangler Mangler(*this, Out); |
4964 | Mangler.getStream() << "_ZTH"; |
4965 | Mangler.mangleName(D); |
4966 | } |
4967 | |
4968 | void |
4969 | ItaniumMangleContextImpl::mangleItaniumThreadLocalWrapper(const VarDecl *D, |
4970 | raw_ostream &Out) { |
4971 | |
4972 | CXXNameMangler Mangler(*this, Out); |
4973 | Mangler.getStream() << "_ZTW"; |
4974 | Mangler.mangleName(D); |
4975 | } |
4976 | |
4977 | void ItaniumMangleContextImpl::mangleReferenceTemporary(const VarDecl *D, |
4978 | unsigned ManglingNumber, |
4979 | raw_ostream &Out) { |
4980 | |
4981 | |
4982 | CXXNameMangler Mangler(*this, Out); |
4983 | Mangler.getStream() << "_ZGR"; |
4984 | Mangler.mangleName(D); |
4985 | (0) . __assert_fail ("ManglingNumber > 0 && \"Reference temporary mangling number is zero!\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 4985, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(ManglingNumber > 0 && "Reference temporary mangling number is zero!"); |
4986 | Mangler.mangleSeqID(ManglingNumber - 1); |
4987 | } |
4988 | |
4989 | void ItaniumMangleContextImpl::mangleCXXVTable(const CXXRecordDecl *RD, |
4990 | raw_ostream &Out) { |
4991 | |
4992 | CXXNameMangler Mangler(*this, Out); |
4993 | Mangler.getStream() << "_ZTV"; |
4994 | Mangler.mangleNameOrStandardSubstitution(RD); |
4995 | } |
4996 | |
4997 | void ItaniumMangleContextImpl::mangleCXXVTT(const CXXRecordDecl *RD, |
4998 | raw_ostream &Out) { |
4999 | |
5000 | CXXNameMangler Mangler(*this, Out); |
5001 | Mangler.getStream() << "_ZTT"; |
5002 | Mangler.mangleNameOrStandardSubstitution(RD); |
5003 | } |
5004 | |
5005 | void ItaniumMangleContextImpl::mangleCXXCtorVTable(const CXXRecordDecl *RD, |
5006 | int64_t Offset, |
5007 | const CXXRecordDecl *Type, |
5008 | raw_ostream &Out) { |
5009 | |
5010 | CXXNameMangler Mangler(*this, Out); |
5011 | Mangler.getStream() << "_ZTC"; |
5012 | Mangler.mangleNameOrStandardSubstitution(RD); |
5013 | Mangler.getStream() << Offset; |
5014 | Mangler.getStream() << '_'; |
5015 | Mangler.mangleNameOrStandardSubstitution(Type); |
5016 | } |
5017 | |
5018 | void ItaniumMangleContextImpl::mangleCXXRTTI(QualType Ty, raw_ostream &Out) { |
5019 | |
5020 | (0) . __assert_fail ("!Ty.hasQualifiers() && \"RTTI info cannot have top-level qualifiers\"", "/home/seafit/code_projects/clang_source/clang/lib/AST/ItaniumMangle.cpp", 5020, __PRETTY_FUNCTION__))" file_link="../../../include/assert.h.html#88" macro="true">assert(!Ty.hasQualifiers() && "RTTI info cannot have top-level qualifiers"); |
5021 | CXXNameMangler Mangler(*this, Out); |
5022 | Mangler.getStream() << "_ZTI"; |
5023 | Mangler.mangleType(Ty); |
5024 | } |
5025 | |
5026 | void ItaniumMangleContextImpl::mangleCXXRTTIName(QualType Ty, |
5027 | raw_ostream &Out) { |
5028 | |
5029 | CXXNameMangler Mangler(*this, Out); |
5030 | Mangler.getStream() << "_ZTS"; |
5031 | Mangler.mangleType(Ty); |
5032 | } |
5033 | |
5034 | void ItaniumMangleContextImpl::mangleTypeName(QualType Ty, raw_ostream &Out) { |
5035 | mangleCXXRTTIName(Ty, Out); |
5036 | } |
5037 | |
5038 | void ItaniumMangleContextImpl::mangleStringLiteral(const StringLiteral *, raw_ostream &) { |
5039 | llvm_unreachable("Can't mangle string literals"); |
5040 | } |
5041 | |
5042 | ItaniumMangleContext * |
5043 | ItaniumMangleContext::create(ASTContext &Context, DiagnosticsEngine &Diags) { |
5044 | return new ItaniumMangleContextImpl(Context, Diags); |
5045 | } |
5046 | |