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 | 21772 | 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 21772 times.
|
21772 | 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 21772 times.
|
21772 | if (!spiceFunc.mangleFunctionName) |
28 | ✗ | return spiceFunc.name; | |
29 | |||
30 |
1/2✓ Branch 0 (9→10) taken 21772 times.
✗ Branch 1 (9→104) not taken.
|
21772 | std::stringstream mangledName; |
31 |
1/2✓ Branch 0 (10→11) taken 21772 times.
✗ Branch 1 (10→102) not taken.
|
21772 | mangledName << "_Z"; |
32 | |||
33 | // This type | ||
34 |
2/2✓ Branch 0 (14→15) taken 14187 times.
✓ Branch 1 (14→17) taken 7585 times.
|
21772 | if (spiceFunc.isMethod()) { |
35 |
1/2✓ Branch 0 (15→16) taken 14187 times.
✗ Branch 1 (15→102) not taken.
|
14187 | mangledName << "N"; |
36 |
1/2✓ Branch 0 (16→17) taken 14187 times.
✗ Branch 1 (16→102) not taken.
|
14187 | mangleType(mangledName, spiceFunc.thisType); |
37 | } | ||
38 | |||
39 | // Function name | ||
40 |
1/2✓ Branch 0 (17→18) taken 21772 times.
✗ Branch 1 (17→102) not taken.
|
21772 | const std::string name = spiceFunc.name + spiceFunc.mangleSuffix; |
41 |
2/4✓ Branch 0 (19→20) taken 21772 times.
✗ Branch 1 (19→100) not taken.
✓ Branch 2 (20→21) taken 21772 times.
✗ Branch 3 (20→100) not taken.
|
21772 | mangledName << name.length() << name; |
42 | |||
43 | // Template types | ||
44 |
1/2✓ Branch 0 (22→23) taken 21772 times.
✗ Branch 1 (22→100) not taken.
|
21772 | bool isSelfGeneric = !spiceFunc.templateTypes.empty(); |
45 |
2/2✓ Branch 0 (25→26) taken 14187 times.
✓ Branch 1 (25→30) taken 7585 times.
|
21772 | if (spiceFunc.isMethod()) |
46 |
1/2✓ Branch 0 (27→28) taken 14187 times.
✗ Branch 1 (27→100) not taken.
|
14187 | isSelfGeneric = spiceFunc.templateTypes.size() > spiceFunc.thisType.getTemplateTypes().size(); |
47 |
2/2✓ Branch 0 (30→31) taken 1216 times.
✓ Branch 1 (30→57) taken 20556 times.
|
21772 | if (isSelfGeneric) { |
48 |
1/2✓ Branch 0 (31→32) taken 1216 times.
✗ Branch 1 (31→100) not taken.
|
1216 | mangledName << "I"; |
49 | // Template types themselves | ||
50 |
2/2✓ Branch 0 (44→34) taken 1313 times.
✓ Branch 1 (44→45) taken 1216 times.
|
2529 | for (const GenericType &genericTemplateType : spiceFunc.templateTypes) { |
51 |
3/6✓ Branch 0 (35→36) taken 1313 times.
✗ Branch 1 (35→93) not taken.
✓ Branch 2 (36→37) taken 1313 times.
✗ Branch 3 (36→93) not taken.
✗ Branch 4 (37→38) not taken.
✓ Branch 5 (37→39) taken 1313 times.
|
1313 | assert(spiceFunc.typeMapping.contains(genericTemplateType.getSubType())); |
52 |
2/4✓ Branch 0 (39→40) taken 1313 times.
✗ Branch 1 (39→93) not taken.
✓ Branch 2 (40→41) taken 1313 times.
✗ Branch 3 (40→93) not taken.
|
1313 | const QualType &actualType = spiceFunc.typeMapping.at(genericTemplateType.getSubType()); |
53 |
1/2✓ Branch 0 (41→42) taken 1313 times.
✗ Branch 1 (41→93) not taken.
|
1313 | mangleType(mangledName, actualType); |
54 | } | ||
55 |
1/2✓ Branch 0 (45→46) taken 1216 times.
✗ Branch 1 (45→100) not taken.
|
1216 | mangledName << "E"; |
56 | |||
57 | // Insert second end marker to end the nested type | ||
58 |
2/2✓ Branch 0 (49→50) taken 388 times.
✓ Branch 1 (49→51) taken 828 times.
|
1216 | if (spiceFunc.isMethod()) |
59 |
1/2✓ Branch 0 (50→51) taken 388 times.
✗ Branch 1 (50→100) not taken.
|
388 | mangledName << "E"; |
60 | |||
61 | // Return type | ||
62 |
2/2✓ Branch 0 (54→55) taken 835 times.
✓ Branch 1 (54→56) taken 381 times.
|
1216 | if (spiceFunc.isFunction()) |
63 |
1/2✓ Branch 0 (55→62) taken 835 times.
✗ Branch 1 (55→100) not taken.
|
835 | mangleType(mangledName, spiceFunc.returnType); |
64 | else | ||
65 |
1/2✓ Branch 0 (56→62) taken 381 times.
✗ Branch 1 (56→100) not taken.
|
381 | mangledName << "v"; |
66 | |||
67 |
2/2✓ Branch 0 (60→61) taken 13799 times.
✓ Branch 1 (60→62) taken 6757 times.
|
20556 | } else if (spiceFunc.isMethod()) { |
68 |
1/2✓ Branch 0 (61→62) taken 13799 times.
✗ Branch 1 (61→100) not taken.
|
13799 | mangledName << "E"; |
69 | } | ||
70 | |||
71 | // Parameter types | ||
72 |
2/2✓ Branch 0 (70→64) taken 21862 times.
✓ Branch 1 (70→71) taken 21772 times.
|
43634 | for (const auto &[qualType, isOptional] : spiceFunc.paramList) { |
73 |
1/2✗ Branch 0 (65→66) not taken.
✓ Branch 1 (65→67) taken 21862 times.
|
21862 | assert(!isOptional); |
74 |
1/2✓ Branch 0 (67→68) taken 21862 times.
✗ Branch 1 (67→94) not taken.
|
21862 | mangleType(mangledName, qualType); |
75 | } | ||
76 |
2/2✓ Branch 0 (72→73) taken 6753 times.
✓ Branch 1 (72→74) taken 15019 times.
|
21772 | if (spiceFunc.paramList.empty()) |
77 |
1/2✓ Branch 0 (73→74) taken 6753 times.
✗ Branch 1 (73→100) not taken.
|
6753 | mangledName << "v"; |
78 | |||
79 | #ifndef NDEBUG | ||
80 | 21772 | const TypeMapping &typeMapping = spiceFunc.typeMapping; | |
81 |
2/4✓ Branch 0 (74→75) taken 21772 times.
✗ Branch 1 (74→96) not taken.
✓ Branch 2 (75→76) taken 21772 times.
✗ Branch 3 (75→95) not taken.
|
21772 | const bool returnTypeIsFctOrProc = spiceFunc.returnType.getBase().isOneOf({TY_FUNCTION, TY_PROCEDURE}); |
82 |
2/4✓ Branch 0 (2→3) taken 21800 times.
✗ Branch 1 (2→8) not taken.
✓ Branch 2 (3→4) taken 21800 times.
✗ Branch 3 (3→7) not taken.
|
21800 | const auto paramPredicate = [](const Param &p) { return p.qualType.getBase().isOneOf({TY_FUNCTION, TY_PROCEDURE}); }; |
83 |
1/2✓ Branch 0 (76→77) taken 21772 times.
✗ Branch 1 (76→100) not taken.
|
21772 | const bool paramTypeIsFctOrProc = std::ranges::any_of(spiceFunc.paramList, paramPredicate); |
84 | 5693 | const auto templateTypePredicate = [&](const GenericType &t) { | |
85 |
4/8✓ Branch 0 (2→3) taken 5693 times.
✗ Branch 1 (2→10) not taken.
✓ Branch 2 (3→4) taken 5693 times.
✗ Branch 3 (3→10) not taken.
✓ Branch 4 (4→5) taken 5693 times.
✗ Branch 5 (4→10) not taken.
✓ Branch 6 (5→6) taken 5693 times.
✗ Branch 7 (5→9) not taken.
|
5693 | return typeMapping.at(t.getSubType()).getBase().isOneOf({TY_FUNCTION, TY_PROCEDURE}); |
86 | 21772 | }; | |
87 |
1/2✓ Branch 0 (77→78) taken 21772 times.
✗ Branch 1 (77→100) not taken.
|
21772 | const bool templateTypeIsFctOrProc = std::ranges::any_of(spiceFunc.templateTypes, templateTypePredicate); |
88 |
6/6✓ Branch 0 (78→79) taken 21770 times.
✓ Branch 1 (78→87) taken 2 times.
✓ Branch 2 (79→80) taken 21676 times.
✓ Branch 3 (79→87) taken 94 times.
✓ Branch 4 (80→81) taken 21658 times.
✓ Branch 5 (80→87) taken 18 times.
|
21772 | if (!returnTypeIsFctOrProc && !paramTypeIsFctOrProc && !templateTypeIsFctOrProc) |
89 |
3/6✓ Branch 0 (81→82) taken 21658 times.
✗ Branch 1 (81→99) not taken.
✓ Branch 2 (82→83) taken 21658 times.
✗ Branch 3 (82→97) not taken.
✗ Branch 4 (83→84) not taken.
✓ Branch 5 (83→85) taken 21658 times.
|
21658 | assert(CommonUtil::isValidMangledName(mangledName.str())); |
90 | #endif | ||
91 | |||
92 |
1/2✓ Branch 0 (87→88) taken 21772 times.
✗ Branch 1 (87→100) not taken.
|
21772 | return mangledName.str(); |
93 | 21772 | } | |
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 | 1386 | 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 | 154 | 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 | 23977 | void NameMangling::mangleName(std::stringstream &out, const std::string &name, bool &nestedType) { | |
122 | 23977 | std::vector<std::string> fragments; | |
123 |
1/2✓ Branch 0 (2→3) taken 23977 times.
✗ Branch 1 (2→51) not taken.
|
23977 | std::istringstream ss(name); |
124 | 23977 | std::string token; | |
125 | |||
126 |
4/6✓ Branch 0 (16→17) taken 47954 times.
✗ Branch 1 (16→47) not taken.
✓ Branch 2 (17→18) taken 47954 times.
✗ Branch 3 (17→47) not taken.
✓ Branch 4 (18→5) taken 23977 times.
✓ Branch 5 (18→19) taken 23977 times.
|
47954 | while (std::getline(ss, token, ':')) { |
127 |
1/2✓ Branch 0 (5→6) taken 23977 times.
✗ Branch 1 (5→42) not taken.
|
23977 | std::istringstream subStream(token); |
128 | 23977 | std::string subToken; | |
129 |
4/6✓ Branch 0 (10→11) taken 47954 times.
✗ Branch 1 (10→38) not taken.
✓ Branch 2 (11→12) taken 47954 times.
✗ Branch 3 (11→38) not taken.
✓ Branch 4 (12→8) taken 23977 times.
✓ Branch 5 (12→13) taken 23977 times.
|
47954 | while (std::getline(subStream, subToken, '/')) { |
130 |
1/2✓ Branch 0 (8→9) taken 23977 times.
✗ Branch 1 (8→38) not taken.
|
23977 | fragments.push_back(subToken); |
131 | } | ||
132 | 23977 | } | |
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 23977 times.
|
23977 | 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 23977 times.
✓ Branch 1 (33→34) taken 23977 times.
|
47954 | for (const std::string &fragment : fragments) { |
142 | 23977 | int fragmentLength = static_cast<int>(fragment.length()); | |
143 |
2/4✓ Branch 0 (28→29) taken 23977 times.
✗ Branch 1 (28→43) not taken.
✓ Branch 2 (29→30) taken 23977 times.
✗ Branch 3 (29→43) not taken.
|
23977 | out << std::to_string(fragmentLength) << fragment; |
144 | } | ||
145 | 23977 | } | |
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 | 48292 | void NameMangling::mangleType(std::stringstream &out, QualType qualType) { // NOLINT(*-no-recursion) | |
156 | 48292 | const Type *type = qualType.getType(); | |
157 |
1/2✗ Branch 0 (4→5) not taken.
✓ Branch 1 (4→6) taken 48292 times.
|
48292 | assert(!qualType.hasAnyGenericParts()); |
158 | |||
159 | // Unwrap qualType chain | ||
160 |
1/2✗ Branch 0 (7→8) not taken.
✓ Branch 1 (7→9) taken 48292 times.
|
48292 | assert(!type->typeChain.empty()); |
161 |
2/2✓ Branch 0 (14→11) taken 6856 times.
✓ Branch 1 (14→15) taken 48292 times.
|
55148 | for (size_t i = type->typeChain.size() - 1; i >= 1; i--) |
162 | 6856 | mangleTypeChainElement(out, type->typeChain.at(i), false); | |
163 | |||
164 | // Qualifiers | ||
165 |
1/2✗ Branch 0 (17→18) not taken.
✓ Branch 1 (17→19) taken 48292 times.
|
48292 | assert(qualType.getQualifiers().isSigned == !qualType.getQualifiers().isUnsigned); |
166 | 48292 | const bool signedness = qualType.getQualifiers().isSigned; | |
167 |
6/6✓ Branch 0 (21→22) taken 5251 times.
✓ Branch 1 (21→25) taken 43041 times.
✓ Branch 2 (23→24) taken 3915 times.
✓ Branch 3 (23→25) taken 1336 times.
✓ Branch 4 (26→27) taken 3915 times.
✓ Branch 5 (26→28) taken 44377 times.
|
48292 | if (qualType.getQualifiers().isConst && type->typeChain.size() > 1) |
168 | 3915 | out << "K"; | |
169 | |||
170 | // Base chain element | ||
171 | 48292 | mangleTypeChainElement(out, type->typeChain.front(), signedness); | |
172 | 48292 | } | |
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 | 55148 | void NameMangling::mangleTypeChainElement(std::stringstream &out, const TypeChainElement &chainElement, bool signedness) { | |
183 |
13/15✓ Branch 0 (2→3) taken 1686 times.
✓ Branch 1 (2→4) taken 5170 times.
✓ Branch 2 (2→6) taken 257 times.
✓ Branch 3 (2→10) taken 4284 times.
✓ Branch 4 (2→15) taken 201 times.
✓ Branch 5 (2→20) taken 3949 times.
✓ Branch 6 (2→25) taken 1382 times.
✓ Branch 7 (2→30) taken 5303 times.
✓ Branch 8 (2→35) taken 8308 times.
✓ Branch 9 (2→37) taken 512 times.
✓ Branch 10 (2→41) taken 23977 times.
✗ Branch 11 (2→57) not taken.
✓ Branch 12 (2→62) taken 10 times.
✓ Branch 13 (2→75) taken 109 times.
✗ Branch 14 (2→87) not taken.
|
55148 | switch (chainElement.superType) { |
184 | 1686 | case TY_PTR: // fall-through | |
185 | case TY_ARRAY: | ||
186 | 1686 | out << "P"; | |
187 | 1686 | break; | |
188 | 5170 | case TY_REF: | |
189 | 5170 | out << "R"; | |
190 | 5170 | break; | |
191 | 257 | case TY_DOUBLE: | |
192 |
1/2✗ Branch 0 (6→7) not taken.
✓ Branch 1 (6→8) taken 257 times.
|
257 | assert(signedness && "Unsigned double types are forbidden"); |
193 | 257 | out << "d"; | |
194 | 257 | break; | |
195 | 4284 | case TY_INT: | |
196 |
2/2✓ Branch 0 (10→11) taken 3839 times.
✓ Branch 1 (10→12) taken 445 times.
|
4284 | out << (signedness ? "i" : "j"); |
197 | 4284 | break; | |
198 | 201 | case TY_SHORT: | |
199 |
2/2✓ Branch 0 (15→16) taken 166 times.
✓ Branch 1 (15→17) taken 35 times.
|
201 | out << (signedness ? "s" : "t"); |
200 | 201 | break; | |
201 | 3949 | case TY_LONG: | |
202 |
2/2✓ Branch 0 (20→21) taken 913 times.
✓ Branch 1 (20→22) taken 3036 times.
|
3949 | out << (signedness ? "l" : "m"); |
203 | 3949 | break; | |
204 | 1382 | case TY_BYTE: | |
205 |
1/2✗ Branch 0 (25→26) not taken.
✓ Branch 1 (25→27) taken 1382 times.
|
1382 | out << (signedness ? "a" : "h"); |
206 | 1382 | break; | |
207 | 5303 | case TY_CHAR: | |
208 |
1/2✗ Branch 0 (30→31) not taken.
✓ Branch 1 (30→32) taken 5303 times.
|
5303 | out << (signedness ? "c" : "h"); |
209 | 5303 | break; | |
210 | 8308 | case TY_STRING: | |
211 | 8308 | out << "PKc"; | |
212 | 8308 | break; | |
213 | 512 | case TY_BOOL: | |
214 |
1/2✗ Branch 0 (37→38) not taken.
✓ Branch 1 (37→39) taken 512 times.
|
512 | assert(!signedness && "Signed bool types are forbidden"); |
215 | 512 | out << "b"; | |
216 | 512 | break; | |
217 | 23977 | case TY_STRUCT: // fall-through | |
218 | case TY_INTERFACE: { | ||
219 | 23977 | bool nestedType = false; | |
220 |
1/2✓ Branch 0 (41→42) taken 23977 times.
✗ Branch 1 (41→99) not taken.
|
23977 | mangleName(out, chainElement.subType, nestedType); |
221 |
2/2✓ Branch 0 (43→44) taken 7236 times.
✓ Branch 1 (43→53) taken 16741 times.
|
23977 | if (!chainElement.templateTypes.empty()) { |
222 |
1/2✓ Branch 0 (44→45) taken 7236 times.
✗ Branch 1 (44→99) not taken.
|
7236 | out << "I"; |
223 |
2/2✓ Branch 0 (51→47) taken 8794 times.
✓ Branch 1 (51→52) taken 7236 times.
|
16030 | for (const QualType &templateType : chainElement.templateTypes) |
224 |
1/2✓ Branch 0 (48→49) taken 8794 times.
✗ Branch 1 (48→98) not taken.
|
8794 | mangleType(out, templateType); |
225 |
1/2✓ Branch 0 (52→53) taken 7236 times.
✗ Branch 1 (52→99) not taken.
|
7236 | out << "E"; |
226 | } | ||
227 |
1/2✗ Branch 0 (53→54) not taken.
✓ Branch 1 (53→55) taken 23977 times.
|
23977 | if (nestedType) |
228 | ✗ | out << "E"; | |
229 | 23977 | 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 (62→63) taken 2 times.
✓ Branch 1 (62→64) taken 8 times.
|
10 | out << (chainElement.data.hasCaptures ? "PFC" : "PF"); |
240 |
2/2✓ Branch 0 (72→68) taken 22 times.
✓ Branch 1 (72→73) taken 10 times.
|
32 | for (const QualType ¶mType : chainElement.paramTypes) |
241 |
1/2✓ Branch 0 (69→70) taken 22 times.
✗ Branch 1 (69→101) not taken.
|
22 | mangleType(out, paramType); |
242 | 10 | out << "E"; | |
243 | 10 | break; | |
244 | } | ||
245 | 109 | case TY_PROCEDURE: { | |
246 |
2/2✓ Branch 0 (75→76) taken 4 times.
✓ Branch 1 (75→77) taken 105 times.
|
109 | out << (chainElement.data.hasCaptures ? "PFCv" : "PFv"); |
247 |
2/2✓ Branch 0 (84→80) taken 62 times.
✓ Branch 1 (84→85) taken 109 times.
|
171 | for (size_t i = 1; i < chainElement.paramTypes.size(); i++) |
248 | 62 | mangleType(out, chainElement.paramTypes.at(i)); | |
249 | 109 | out << "E"; | |
250 | 109 | break; | |
251 | } | ||
252 | − | default: // GCOV_EXCL_LINE | |
253 | − | throw CompilerError(INTERNAL_ERROR, "Type " + chainElement.getName(false) + " cannot be mangled"); // GCOV_EXCL_LINE | |
254 | } | ||
255 | 55148 | } | |
256 | |||
257 | 275 | std::string NameMangling::mangleTypeInfoName(const StructBase *structBase) { | |
258 |
1/2✓ Branch 0 (2→3) taken 275 times.
✗ Branch 1 (2→13) not taken.
|
275 | std::stringstream out; |
259 |
1/2✓ Branch 0 (3→4) taken 275 times.
✗ Branch 1 (3→11) not taken.
|
275 | out << "_ZTS"; |
260 |
2/4✓ Branch 0 (4→5) taken 275 times.
✗ Branch 1 (4→11) not taken.
✓ Branch 2 (5→6) taken 275 times.
✗ Branch 3 (5→11) not taken.
|
275 | mangleType(out, structBase->entry->getQualType()); |
261 |
1/2✓ Branch 0 (6→7) taken 275 times.
✗ Branch 1 (6→11) not taken.
|
550 | return out.str(); |
262 | 275 | } | |
263 | |||
264 |
2/4✓ Branch 0 (3→4) taken 275 times.
✗ Branch 1 (3→11) not taken.
✓ Branch 2 (4→5) taken 275 times.
✗ Branch 3 (4→9) not taken.
|
275 | std::string NameMangling::mangleTypeInfoValue(const std::string &value) { return std::to_string(value.size()) + value; } |
265 | |||
266 | 392 | std::string NameMangling::mangleTypeInfo(const StructBase *structBase) { | |
267 |
1/2✓ Branch 0 (2→3) taken 392 times.
✗ Branch 1 (2→13) not taken.
|
392 | std::stringstream out; |
268 |
1/2✓ Branch 0 (3→4) taken 392 times.
✗ Branch 1 (3→11) not taken.
|
392 | out << "_ZTI"; |
269 |
2/4✓ Branch 0 (4→5) taken 392 times.
✗ Branch 1 (4→11) not taken.
✓ Branch 2 (5→6) taken 392 times.
✗ Branch 3 (5→11) not taken.
|
392 | mangleType(out, structBase->entry->getQualType()); |
270 |
1/2✓ Branch 0 (6→7) taken 392 times.
✗ Branch 1 (6→11) not taken.
|
784 | return out.str(); |
271 | 392 | } | |
272 | |||
273 | 550 | std::string NameMangling::mangleVTable(const StructBase *structBase) { | |
274 |
1/2✓ Branch 0 (2→3) taken 550 times.
✗ Branch 1 (2→13) not taken.
|
550 | std::stringstream out; |
275 |
1/2✓ Branch 0 (3→4) taken 550 times.
✗ Branch 1 (3→11) not taken.
|
550 | out << "_ZTV"; |
276 |
2/4✓ Branch 0 (4→5) taken 550 times.
✗ Branch 1 (4→11) not taken.
✓ Branch 2 (5→6) taken 550 times.
✗ Branch 3 (5→11) not taken.
|
550 | mangleType(out, structBase->entry->getQualType()); |
277 |
1/2✓ Branch 0 (6→7) taken 550 times.
✗ Branch 1 (6→11) not taken.
|
1100 | return out.str(); |
278 | 550 | } | |
279 | |||
280 | 237 | std::string NameMangling::mangleVTable(const std::string &typeName) { | |
281 |
3/6✓ Branch 0 (3→4) taken 237 times.
✗ Branch 1 (3→15) not taken.
✓ Branch 2 (4→5) taken 237 times.
✗ Branch 3 (4→13) not taken.
✓ Branch 4 (5→6) taken 237 times.
✗ Branch 5 (5→11) not taken.
|
237 | return "_ZTV" + std::to_string(typeName.size()) + typeName; |
282 | } | ||
283 | |||
284 | } // namespace spice::compiler | ||
285 |