Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright (c) 2021-2025 ChilliBits. All rights reserved. | ||
2 | |||
3 | #include "NameMangling.h" | ||
4 | |||
5 | #include <exception/CompilerError.h> | ||
6 | #include <model/Function.h> | ||
7 | #include <model/Interface.h> | ||
8 | #include <model/Struct.h> | ||
9 | #include <symboltablebuilder/SymbolTableEntry.h> | ||
10 | #include <util/CommonUtil.h> | ||
11 | |||
12 | namespace spice::compiler { | ||
13 | |||
14 | /** | ||
15 | * Mangle a function or procedure. | ||
16 | * This should be mostly compatible with the C++ Itanium ABI name mangling scheme. | ||
17 | * | ||
18 | * @param spiceFunc Input function | ||
19 | * @return Mangled name | ||
20 | */ | ||
21 | 22378 | std::string NameMangling::mangleFunction(const Function &spiceFunc) { | |
22 | // Check if we have a predefined mangled name, specified by e.g. a function attribute | ||
23 |
1/2✗ Branch 0 (3→4) not taken.
✓ Branch 1 (3→6) taken 22378 times.
|
22378 | if (!spiceFunc.predefinedMangledName.empty()) |
24 | ✗ | return spiceFunc.predefinedMangledName; | |
25 | |||
26 | // Check if mangling is required | ||
27 |
1/2✗ Branch 0 (6→7) not taken.
✓ Branch 1 (6→9) taken 22378 times.
|
22378 | if (!spiceFunc.mangleFunctionName) |
28 | ✗ | return spiceFunc.name; | |
29 | |||
30 |
1/2✓ Branch 0 (9→10) taken 22378 times.
✗ Branch 1 (9→104) not taken.
|
22378 | std::stringstream mangledName; |
31 |
1/2✓ Branch 0 (10→11) taken 22378 times.
✗ Branch 1 (10→102) not taken.
|
22378 | mangledName << "_Z"; |
32 | |||
33 | // This type | ||
34 |
2/2✓ Branch 0 (14→15) taken 14344 times.
✓ Branch 1 (14→17) taken 8034 times.
|
22378 | if (spiceFunc.isMethod()) { |
35 |
1/2✓ Branch 0 (15→16) taken 14344 times.
✗ Branch 1 (15→102) not taken.
|
14344 | mangledName << "N"; |
36 |
1/2✓ Branch 0 (16→17) taken 14344 times.
✗ Branch 1 (16→102) not taken.
|
14344 | mangleType(mangledName, spiceFunc.thisType); |
37 | } | ||
38 | |||
39 | // Function name | ||
40 |
1/2✓ Branch 0 (17→18) taken 22378 times.
✗ Branch 1 (17→102) not taken.
|
22378 | const std::string name = spiceFunc.name + spiceFunc.mangleSuffix; |
41 |
2/4✓ Branch 0 (19→20) taken 22378 times.
✗ Branch 1 (19→100) not taken.
✓ Branch 2 (20→21) taken 22378 times.
✗ Branch 3 (20→100) not taken.
|
22378 | mangledName << name.length() << name; |
42 | |||
43 | // Template types | ||
44 |
1/2✓ Branch 0 (22→23) taken 22378 times.
✗ Branch 1 (22→100) not taken.
|
22378 | bool isSelfGeneric = !spiceFunc.templateTypes.empty(); |
45 |
2/2✓ Branch 0 (25→26) taken 14344 times.
✓ Branch 1 (25→30) taken 8034 times.
|
22378 | if (spiceFunc.isMethod()) |
46 |
1/2✓ Branch 0 (27→28) taken 14344 times.
✗ Branch 1 (27→100) not taken.
|
14344 | isSelfGeneric = spiceFunc.templateTypes.size() > spiceFunc.thisType.getTemplateTypes().size(); |
47 |
2/2✓ Branch 0 (30→31) taken 1328 times.
✓ Branch 1 (30→57) taken 21050 times.
|
22378 | if (isSelfGeneric) { |
48 |
1/2✓ Branch 0 (31→32) taken 1328 times.
✗ Branch 1 (31→100) not taken.
|
1328 | mangledName << "I"; |
49 | // Template types themselves | ||
50 |
2/2✓ Branch 0 (44→34) taken 1441 times.
✓ Branch 1 (44→45) taken 1328 times.
|
2769 | for (const GenericType &genericTemplateType : spiceFunc.templateTypes) { |
51 |
3/6✓ Branch 0 (35→36) taken 1441 times.
✗ Branch 1 (35→93) not taken.
✓ Branch 2 (36→37) taken 1441 times.
✗ Branch 3 (36→93) not taken.
✗ Branch 4 (37→38) not taken.
✓ Branch 5 (37→39) taken 1441 times.
|
1441 | assert(spiceFunc.typeMapping.contains(genericTemplateType.getSubType())); |
52 |
2/4✓ Branch 0 (39→40) taken 1441 times.
✗ Branch 1 (39→93) not taken.
✓ Branch 2 (40→41) taken 1441 times.
✗ Branch 3 (40→93) not taken.
|
1441 | const QualType &actualType = spiceFunc.typeMapping.at(genericTemplateType.getSubType()); |
53 |
1/2✓ Branch 0 (41→42) taken 1441 times.
✗ Branch 1 (41→93) not taken.
|
1441 | mangleType(mangledName, actualType); |
54 | } | ||
55 |
1/2✓ Branch 0 (45→46) taken 1328 times.
✗ Branch 1 (45→100) not taken.
|
1328 | mangledName << "E"; |
56 | |||
57 | // Insert second end marker to end the nested type | ||
58 |
2/2✓ Branch 0 (49→50) taken 434 times.
✓ Branch 1 (49→51) taken 894 times.
|
1328 | if (spiceFunc.isMethod()) |
59 |
1/2✓ Branch 0 (50→51) taken 434 times.
✗ Branch 1 (50→100) not taken.
|
434 | mangledName << "E"; |
60 | |||
61 | // Return type | ||
62 |
2/2✓ Branch 0 (54→55) taken 910 times.
✓ Branch 1 (54→56) taken 418 times.
|
1328 | if (spiceFunc.isFunction()) |
63 |
1/2✓ Branch 0 (55→62) taken 910 times.
✗ Branch 1 (55→100) not taken.
|
910 | mangleType(mangledName, spiceFunc.returnType); |
64 | else | ||
65 |
1/2✓ Branch 0 (56→62) taken 418 times.
✗ Branch 1 (56→100) not taken.
|
418 | mangledName << "v"; |
66 | |||
67 |
2/2✓ Branch 0 (60→61) taken 13910 times.
✓ Branch 1 (60→62) taken 7140 times.
|
21050 | } else if (spiceFunc.isMethod()) { |
68 |
1/2✓ Branch 0 (61→62) taken 13910 times.
✗ Branch 1 (61→100) not taken.
|
13910 | mangledName << "E"; |
69 | } | ||
70 | |||
71 | // Parameter types | ||
72 |
2/2✓ Branch 0 (70→64) taken 22446 times.
✓ Branch 1 (70→71) taken 22378 times.
|
44824 | for (const auto &[qualType, isOptional] : spiceFunc.paramList) { |
73 |
1/2✗ Branch 0 (65→66) not taken.
✓ Branch 1 (65→67) taken 22446 times.
|
22446 | assert(!isOptional); |
74 |
1/2✓ Branch 0 (67→68) taken 22446 times.
✗ Branch 1 (67→94) not taken.
|
22446 | mangleType(mangledName, qualType); |
75 | } | ||
76 |
2/2✓ Branch 0 (72→73) taken 6907 times.
✓ Branch 1 (72→74) taken 15471 times.
|
22378 | if (spiceFunc.paramList.empty()) |
77 |
1/2✓ Branch 0 (73→74) taken 6907 times.
✗ Branch 1 (73→100) not taken.
|
6907 | mangledName << "v"; |
78 | |||
79 | #ifndef NDEBUG | ||
80 | 22378 | const TypeMapping &typeMapping = spiceFunc.typeMapping; | |
81 |
2/4✓ Branch 0 (74→75) taken 22378 times.
✗ Branch 1 (74→96) not taken.
✓ Branch 2 (75→76) taken 22378 times.
✗ Branch 3 (75→95) not taken.
|
22378 | const bool returnTypeIsFctOrProc = spiceFunc.returnType.getBase().isOneOf({TY_FUNCTION, TY_PROCEDURE}); |
82 |
2/4✓ Branch 0 (2→3) taken 22437 times.
✗ Branch 1 (2→8) not taken.
✓ Branch 2 (3→4) taken 22437 times.
✗ Branch 3 (3→7) not taken.
|
22437 | const auto paramPredicate = [](const Param &p) { return p.qualType.getBase().isOneOf({TY_FUNCTION, TY_PROCEDURE}); }; |
83 |
1/2✓ Branch 0 (76→77) taken 22378 times.
✗ Branch 1 (76→100) not taken.
|
22378 | const bool paramTypeIsFctOrProc = std::ranges::any_of(spiceFunc.paramList, paramPredicate); |
84 | 5931 | const auto templateTypePredicate = [&](const GenericType &t) { | |
85 |
4/8✓ Branch 0 (2→3) taken 5931 times.
✗ Branch 1 (2→10) not taken.
✓ Branch 2 (3→4) taken 5931 times.
✗ Branch 3 (3→10) not taken.
✓ Branch 4 (4→5) taken 5931 times.
✗ Branch 5 (4→10) not taken.
✓ Branch 6 (5→6) taken 5931 times.
✗ Branch 7 (5→9) not taken.
|
5931 | return typeMapping.at(t.getSubType()).getBase().isOneOf({TY_FUNCTION, TY_PROCEDURE}); |
86 | 22378 | }; | |
87 |
1/2✓ Branch 0 (77→78) taken 22378 times.
✗ Branch 1 (77→100) not taken.
|
22378 | const bool templateTypeIsFctOrProc = std::ranges::any_of(spiceFunc.templateTypes, templateTypePredicate); |
88 |
6/6✓ Branch 0 (78→79) taken 22376 times.
✓ Branch 1 (78→87) taken 2 times.
✓ Branch 2 (79→80) taken 22335 times.
✓ Branch 3 (79→87) taken 41 times.
✓ Branch 4 (80→81) taken 22317 times.
✓ Branch 5 (80→87) taken 18 times.
|
22378 | if (!returnTypeIsFctOrProc && !paramTypeIsFctOrProc && !templateTypeIsFctOrProc) |
89 |
3/6✓ Branch 0 (81→82) taken 22317 times.
✗ Branch 1 (81→99) not taken.
✓ Branch 2 (82→83) taken 22317 times.
✗ Branch 3 (82→97) not taken.
✗ Branch 4 (83→84) not taken.
✓ Branch 5 (83→85) taken 22317 times.
|
22317 | assert(CommonUtil::isValidMangledName(mangledName.str())); |
90 | #endif | ||
91 | |||
92 |
1/2✓ Branch 0 (87→88) taken 22378 times.
✗ Branch 1 (87→100) not taken.
|
22378 | return mangledName.str(); |
93 | 22378 | } | |
94 | |||
95 | /** | ||
96 | * Mangle a struct | ||
97 | * This should be mostly compatible with the C++ Itanium ABI name mangling scheme. | ||
98 | * | ||
99 | * @param spiceStruct Input struct | ||
100 | * @return Mangled name | ||
101 | */ | ||
102 | 1470 | std::string NameMangling::mangleStruct(const Struct &spiceStruct) { return "struct." + spiceStruct.name; } | |
103 | |||
104 | /** | ||
105 | * Mangle an interface | ||
106 | * | ||
107 | * @param spiceInterface Input interface | ||
108 | * @return Mangled name | ||
109 | */ | ||
110 | 178 | std::string NameMangling::mangleInterface(const Interface &spiceInterface) { return "interface." + spiceInterface.name; } | |
111 | |||
112 | /** | ||
113 | * Mangle a fully qualified name like e.g. test::s1::calledMethod to 4test2s112calledMethod | ||
114 | * This should be mostly compatible with the C++ Itanium ABI name mangling scheme. | ||
115 | * | ||
116 | * @param out Output string stream | ||
117 | * @param name Input name | ||
118 | * @param nestedType True if the name is a nested type | ||
119 | * @return Mangled name | ||
120 | */ | ||
121 | 24488 | void NameMangling::mangleName(std::stringstream &out, const std::string &name, bool &nestedType) { | |
122 | 24488 | std::vector<std::string> fragments; | |
123 |
1/2✓ Branch 0 (2→3) taken 24488 times.
✗ Branch 1 (2→51) not taken.
|
24488 | std::istringstream ss(name); |
124 | 24488 | std::string token; | |
125 | |||
126 |
4/6✓ Branch 0 (16→17) taken 48976 times.
✗ Branch 1 (16→47) not taken.
✓ Branch 2 (17→18) taken 48976 times.
✗ Branch 3 (17→47) not taken.
✓ Branch 4 (18→5) taken 24488 times.
✓ Branch 5 (18→19) taken 24488 times.
|
48976 | while (std::getline(ss, token, ':')) { |
127 |
1/2✓ Branch 0 (5→6) taken 24488 times.
✗ Branch 1 (5→42) not taken.
|
24488 | std::istringstream subStream(token); |
128 | 24488 | std::string subToken; | |
129 |
4/6✓ Branch 0 (10→11) taken 48976 times.
✗ Branch 1 (10→38) not taken.
✓ Branch 2 (11→12) taken 48976 times.
✗ Branch 3 (11→38) not taken.
✓ Branch 4 (12→8) taken 24488 times.
✓ Branch 5 (12→13) taken 24488 times.
|
48976 | while (std::getline(subStream, subToken, '/')) { |
130 |
1/2✓ Branch 0 (8→9) taken 24488 times.
✗ Branch 1 (8→38) not taken.
|
24488 | fragments.push_back(subToken); |
131 | } | ||
132 | 24488 | } | |
133 | |||
134 | // Start a nested type if needed. The caller needs to emit the end marker. | ||
135 |
1/2✗ Branch 0 (20→21) not taken.
✓ Branch 1 (20→23) taken 24488 times.
|
24488 | if (fragments.size() > 1) { |
136 | ✗ | out << "N"; | |
137 | ✗ | nestedType = true; | |
138 | } | ||
139 | |||
140 | // Process each fragment and append it to the result | ||
141 |
2/2✓ Branch 0 (33→25) taken 24488 times.
✓ Branch 1 (33→34) taken 24488 times.
|
48976 | for (const std::string &fragment : fragments) { |
142 | 24488 | int fragmentLength = static_cast<int>(fragment.length()); | |
143 |
2/4✓ Branch 0 (28→29) taken 24488 times.
✗ Branch 1 (28→43) not taken.
✓ Branch 2 (29→30) taken 24488 times.
✗ Branch 3 (29→43) not taken.
|
24488 | out << std::to_string(fragmentLength) << fragment; |
144 | } | ||
145 | 24488 | } | |
146 | |||
147 | /** | ||
148 | * Mangle a symbol qualType | ||
149 | * This should be mostly compatible with the C++ Itanium ABI name mangling scheme. | ||
150 | * | ||
151 | * @param out Output string stream | ||
152 | * @param qualType Input symbol qualType | ||
153 | * @return Mangled name | ||
154 | */ | ||
155 | 49778 | void NameMangling::mangleType(std::stringstream &out, QualType qualType) { // NOLINT(*-no-recursion) | |
156 | 49778 | const Type *type = qualType.getType(); | |
157 |
1/2✗ Branch 0 (4→5) not taken.
✓ Branch 1 (4→6) taken 49778 times.
|
49778 | assert(!qualType.hasAnyGenericParts()); |
158 | |||
159 | // Unwrap qualType chain | ||
160 |
1/2✗ Branch 0 (7→8) not taken.
✓ Branch 1 (7→9) taken 49778 times.
|
49778 | assert(!type->typeChain.empty()); |
161 |
2/2✓ Branch 0 (14→11) taken 6878 times.
✓ Branch 1 (14→15) taken 49778 times.
|
56656 | for (size_t i = type->typeChain.size() - 1; i >= 1; i--) |
162 | 6878 | mangleTypeChainElement(out, type->typeChain.at(i), false); | |
163 | |||
164 | // Qualifiers | ||
165 |
1/2✗ Branch 0 (17→18) not taken.
✓ Branch 1 (17→19) taken 49778 times.
|
49778 | assert(qualType.getQualifiers().isSigned == !qualType.getQualifiers().isUnsigned); |
166 | 49778 | const bool signedness = qualType.getQualifiers().isSigned; | |
167 |
6/6✓ Branch 0 (21→22) taken 5122 times.
✓ Branch 1 (21→25) taken 44656 times.
✓ Branch 2 (23→24) taken 3874 times.
✓ Branch 3 (23→25) taken 1248 times.
✓ Branch 4 (26→27) taken 3874 times.
✓ Branch 5 (26→28) taken 45904 times.
|
49778 | if (qualType.getQualifiers().isConst && type->typeChain.size() > 1) |
168 | 3874 | out << "K"; | |
169 | |||
170 | // Base chain element | ||
171 | 49778 | mangleTypeChainElement(out, type->typeChain.front(), signedness); | |
172 | 49778 | } | |
173 | |||
174 | /** | ||
175 | * Mangle a type chain element | ||
176 | * | ||
177 | * @param out Output string stream | ||
178 | * @param chainElement Input type chain element | ||
179 | * @param signedness Signedness of the type | ||
180 | * @return Mangled name | ||
181 | */ | ||
182 | 56656 | void NameMangling::mangleTypeChainElement(std::stringstream &out, const TypeChainElement &chainElement, bool signedness) { | |
183 |
13/15✓ Branch 0 (2→3) taken 1715 times.
✓ Branch 1 (2→4) taken 5163 times.
✓ Branch 2 (2→6) taken 358 times.
✓ Branch 3 (2→10) taken 4706 times.
✓ Branch 4 (2→15) taken 225 times.
✓ Branch 5 (2→20) taken 4114 times.
✓ Branch 6 (2→25) taken 1417 times.
✓ Branch 7 (2→30) taken 5487 times.
✓ Branch 8 (2→32) taken 8406 times.
✓ Branch 9 (2→34) taken 509 times.
✓ Branch 10 (2→38) taken 24488 times.
✗ Branch 11 (2→54) not taken.
✓ Branch 12 (2→59) taken 10 times.
✓ Branch 13 (2→72) taken 58 times.
✗ Branch 14 (2→84) not taken.
|
56656 | switch (chainElement.superType) { |
184 | 1715 | case TY_PTR: // fall-through | |
185 | case TY_ARRAY: | ||
186 | 1715 | out << "P"; | |
187 | 1715 | break; | |
188 | 5163 | case TY_REF: | |
189 | 5163 | out << "R"; | |
190 | 5163 | break; | |
191 | 358 | case TY_DOUBLE: | |
192 |
1/2✗ Branch 0 (6→7) not taken.
✓ Branch 1 (6→8) taken 358 times.
|
358 | assert(signedness && "Unsigned double types are forbidden"); |
193 | 358 | out << "d"; | |
194 | 358 | break; | |
195 | 4706 | case TY_INT: | |
196 |
2/2✓ Branch 0 (10→11) taken 4228 times.
✓ Branch 1 (10→12) taken 478 times.
|
4706 | out << (signedness ? "i" : "j"); |
197 | 4706 | break; | |
198 | 225 | case TY_SHORT: | |
199 |
2/2✓ Branch 0 (15→16) taken 190 times.
✓ Branch 1 (15→17) taken 35 times.
|
225 | out << (signedness ? "s" : "t"); |
200 | 225 | break; | |
201 | 4114 | case TY_LONG: | |
202 |
2/2✓ Branch 0 (20→21) taken 958 times.
✓ Branch 1 (20→22) taken 3156 times.
|
4114 | out << (signedness ? "l" : "m"); |
203 | 4114 | break; | |
204 | 1417 | case TY_BYTE: | |
205 |
1/2✗ Branch 0 (25→26) not taken.
✓ Branch 1 (25→27) taken 1417 times.
|
1417 | out << (signedness ? "a" : "h"); |
206 | 1417 | break; | |
207 | 5487 | case TY_CHAR: | |
208 | 5487 | out << "c"; | |
209 | 5487 | break; | |
210 | 8406 | case TY_STRING: | |
211 | 8406 | out << "PKc"; | |
212 | 8406 | break; | |
213 | 509 | case TY_BOOL: | |
214 |
1/2✗ Branch 0 (34→35) not taken.
✓ Branch 1 (34→36) taken 509 times.
|
509 | assert(!signedness && "Signed bool types are forbidden"); |
215 | 509 | out << "b"; | |
216 | 509 | break; | |
217 | 24488 | case TY_STRUCT: // fall-through | |
218 | case TY_INTERFACE: { | ||
219 | 24488 | bool nestedType = false; | |
220 |
1/2✓ Branch 0 (38→39) taken 24488 times.
✗ Branch 1 (38→96) not taken.
|
24488 | mangleName(out, chainElement.subType, nestedType); |
221 |
2/2✓ Branch 0 (40→41) taken 7425 times.
✓ Branch 1 (40→50) taken 17063 times.
|
24488 | if (!chainElement.templateTypes.empty()) { |
222 |
1/2✓ Branch 0 (41→42) taken 7425 times.
✗ Branch 1 (41→96) not taken.
|
7425 | out << "I"; |
223 |
2/2✓ Branch 0 (48→44) taken 9306 times.
✓ Branch 1 (48→49) taken 7425 times.
|
16731 | for (const QualType &templateType : chainElement.templateTypes) |
224 |
1/2✓ Branch 0 (45→46) taken 9306 times.
✗ Branch 1 (45→95) not taken.
|
9306 | mangleType(out, templateType); |
225 |
1/2✓ Branch 0 (49→50) taken 7425 times.
✗ Branch 1 (49→96) not taken.
|
7425 | out << "E"; |
226 | } | ||
227 |
1/2✗ Branch 0 (50→51) not taken.
✓ Branch 1 (50→52) taken 24488 times.
|
24488 | if (nestedType) |
228 | ✗ | out << "E"; | |
229 | 24488 | break; | |
230 | } | ||
231 | ✗ | case TY_ENUM: { | |
232 | ✗ | bool nestedType = false; | |
233 | ✗ | mangleName(out, chainElement.subType, nestedType); | |
234 | ✗ | if (nestedType) | |
235 | ✗ | out << "E"; | |
236 | ✗ | break; | |
237 | } | ||
238 | 10 | case TY_FUNCTION: { | |
239 |
2/2✓ Branch 0 (59→60) taken 2 times.
✓ Branch 1 (59→61) taken 8 times.
|
10 | out << (chainElement.data.hasCaptures ? "PFC" : "PF"); |
240 |
2/2✓ Branch 0 (69→65) taken 22 times.
✓ Branch 1 (69→70) taken 10 times.
|
32 | for (const QualType ¶mType : chainElement.paramTypes) |
241 |
1/2✓ Branch 0 (66→67) taken 22 times.
✗ Branch 1 (66→98) not taken.
|
22 | mangleType(out, paramType); |
242 | 10 | out << "E"; | |
243 | 10 | break; | |
244 | } | ||
245 | 58 | case TY_PROCEDURE: { | |
246 |
2/2✓ Branch 0 (72→73) taken 4 times.
✓ Branch 1 (72→74) taken 54 times.
|
58 | out << (chainElement.data.hasCaptures ? "PFCv" : "PFv"); |
247 |
2/2✓ Branch 0 (81→77) taken 11 times.
✓ Branch 1 (81→82) taken 58 times.
|
69 | for (size_t i = 1; i < chainElement.paramTypes.size(); i++) |
248 | 11 | mangleType(out, chainElement.paramTypes.at(i)); | |
249 | 58 | out << "E"; | |
250 | 58 | break; | |
251 | } | ||
252 | − | default: // GCOV_EXCL_LINE | |
253 | − | throw CompilerError(INTERNAL_ERROR, "Type " + chainElement.getName(false) + " cannot be mangled"); // GCOV_EXCL_LINE | |
254 | } | ||
255 | 56656 | } | |
256 | |||
257 | 293 | std::string NameMangling::mangleTypeInfoName(const StructBase *structBase) { | |
258 |
1/2✓ Branch 0 (2→3) taken 293 times.
✗ Branch 1 (2→13) not taken.
|
293 | std::stringstream out; |
259 |
1/2✓ Branch 0 (3→4) taken 293 times.
✗ Branch 1 (3→11) not taken.
|
293 | out << "_ZTS"; |
260 |
2/4✓ Branch 0 (4→5) taken 293 times.
✗ Branch 1 (4→11) not taken.
✓ Branch 2 (5→6) taken 293 times.
✗ Branch 3 (5→11) not taken.
|
293 | mangleType(out, structBase->entry->getQualType()); |
261 |
1/2✓ Branch 0 (6→7) taken 293 times.
✗ Branch 1 (6→11) not taken.
|
586 | return out.str(); |
262 | 293 | } | |
263 | |||
264 |
2/4✓ Branch 0 (3→4) taken 293 times.
✗ Branch 1 (3→11) not taken.
✓ Branch 2 (4→5) taken 293 times.
✗ Branch 3 (4→9) not taken.
|
293 | std::string NameMangling::mangleTypeInfoValue(const std::string &value) { return std::to_string(value.size()) + value; } |
265 | |||
266 | 419 | std::string NameMangling::mangleTypeInfo(const StructBase *structBase) { | |
267 |
1/2✓ Branch 0 (2→3) taken 419 times.
✗ Branch 1 (2→13) not taken.
|
419 | std::stringstream out; |
268 |
1/2✓ Branch 0 (3→4) taken 419 times.
✗ Branch 1 (3→11) not taken.
|
419 | out << "_ZTI"; |
269 |
2/4✓ Branch 0 (4→5) taken 419 times.
✗ Branch 1 (4→11) not taken.
✓ Branch 2 (5→6) taken 419 times.
✗ Branch 3 (5→11) not taken.
|
419 | mangleType(out, structBase->entry->getQualType()); |
270 |
1/2✓ Branch 0 (6→7) taken 419 times.
✗ Branch 1 (6→11) not taken.
|
838 | return out.str(); |
271 | 419 | } | |
272 | |||
273 | 586 | std::string NameMangling::mangleVTable(const StructBase *structBase) { | |
274 |
1/2✓ Branch 0 (2→3) taken 586 times.
✗ Branch 1 (2→13) not taken.
|
586 | std::stringstream out; |
275 |
1/2✓ Branch 0 (3→4) taken 586 times.
✗ Branch 1 (3→11) not taken.
|
586 | out << "_ZTV"; |
276 |
2/4✓ Branch 0 (4→5) taken 586 times.
✗ Branch 1 (4→11) not taken.
✓ Branch 2 (5→6) taken 586 times.
✗ Branch 3 (5→11) not taken.
|
586 | mangleType(out, structBase->entry->getQualType()); |
277 |
1/2✓ Branch 0 (6→7) taken 586 times.
✗ Branch 1 (6→11) not taken.
|
1172 | return out.str(); |
278 | 586 | } | |
279 | |||
280 | 254 | std::string NameMangling::mangleVTable(const std::string &typeName) { | |
281 |
3/6✓ Branch 0 (3→4) taken 254 times.
✗ Branch 1 (3→15) not taken.
✓ Branch 2 (4→5) taken 254 times.
✗ Branch 3 (4→13) not taken.
✓ Branch 4 (5→6) taken 254 times.
✗ Branch 5 (5→11) not taken.
|
254 | return "_ZTV" + std::to_string(typeName.size()) + typeName; |
282 | } | ||
283 | |||
284 | } // namespace spice::compiler | ||
285 |