GCC Code Coverage Report


Directory: ../
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 93.5% 159 / 3 / 173
Functions: 100.0% 13 / 0 / 13
Branches: 59.0% 177 / 8 / 308

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