GCC Code Coverage Report


Directory: ../
File: src/irgenerator/NameMangling.cpp
Date: 2026-01-03 22:25:30
Coverage Exec Excl Total
Lines: 93.5% 159 3 173
Functions: 100.0% 13 0 13
Branches: 59.7% 179 8 308

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/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 31219 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 3 → 4 not taken.
✓ Branch 3 → 6 taken 31219 times.
31219 if (!spiceFunc.predefinedMangledName.empty())
24 return spiceFunc.predefinedMangledName;
25
26 // Check if mangling is required
27
1/2
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 9 taken 31219 times.
31219 if (!spiceFunc.mangleFunctionName)
28 return spiceFunc.name;
29
30
1/2
✓ Branch 9 → 10 taken 31219 times.
✗ Branch 9 → 104 not taken.
31219 std::stringstream mangledName;
31
1/2
✓ Branch 10 → 11 taken 31219 times.
✗ Branch 10 → 102 not taken.
31219 mangledName << "_Z";
32
33 // This type
34
2/2
✓ Branch 14 → 15 taken 18837 times.
✓ Branch 14 → 17 taken 12382 times.
31219 if (spiceFunc.isMethod()) {
35
1/2
✓ Branch 15 → 16 taken 18837 times.
✗ Branch 15 → 102 not taken.
18837 mangledName << "N";
36
1/2
✓ Branch 16 → 17 taken 18837 times.
✗ Branch 16 → 102 not taken.
18837 mangleType(mangledName, spiceFunc.thisType);
37 }
38
39 // Function name
40
1/2
✓ Branch 17 → 18 taken 31219 times.
✗ Branch 17 → 102 not taken.
31219 const std::string name = spiceFunc.name + spiceFunc.mangleSuffix;
41
2/4
✓ Branch 19 → 20 taken 31219 times.
✗ Branch 19 → 100 not taken.
✓ Branch 20 → 21 taken 31219 times.
✗ Branch 20 → 100 not taken.
31219 mangledName << name.length() << name;
42
43 // Template types
44
1/2
✓ Branch 22 → 23 taken 31219 times.
✗ Branch 22 → 100 not taken.
31219 bool isSelfGeneric = !spiceFunc.templateTypes.empty();
45
2/2
✓ Branch 25 → 26 taken 18837 times.
✓ Branch 25 → 30 taken 12382 times.
31219 if (spiceFunc.isMethod())
46
1/2
✓ Branch 27 → 28 taken 18837 times.
✗ Branch 27 → 100 not taken.
18837 isSelfGeneric = spiceFunc.templateTypes.size() > spiceFunc.thisType.getTemplateTypes().size();
47
2/2
✓ Branch 30 → 31 taken 3778 times.
✓ Branch 30 → 57 taken 27441 times.
31219 if (isSelfGeneric) {
48
1/2
✓ Branch 31 → 32 taken 3778 times.
✗ Branch 31 → 100 not taken.
3778 mangledName << "I";
49 // Template types themselves
50
2/2
✓ Branch 44 → 34 taken 6442 times.
✓ Branch 44 → 45 taken 3778 times.
10220 for (const GenericType &genericTemplateType : spiceFunc.templateTypes) {
51
3/6
✓ Branch 35 → 36 taken 6442 times.
✗ Branch 35 → 93 not taken.
✓ Branch 36 → 37 taken 6442 times.
✗ Branch 36 → 93 not taken.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 39 taken 6442 times.
6442 assert(spiceFunc.typeMapping.contains(genericTemplateType.getSubType()));
52
2/4
✓ Branch 39 → 40 taken 6442 times.
✗ Branch 39 → 93 not taken.
✓ Branch 40 → 41 taken 6442 times.
✗ Branch 40 → 93 not taken.
6442 const QualType &actualType = spiceFunc.typeMapping.at(genericTemplateType.getSubType());
53
1/2
✓ Branch 41 → 42 taken 6442 times.
✗ Branch 41 → 93 not taken.
6442 mangleType(mangledName, actualType);
54 }
55
1/2
✓ Branch 45 → 46 taken 3778 times.
✗ Branch 45 → 100 not taken.
3778 mangledName << "E";
56
57 // Insert second end marker to end the nested type
58
2/2
✓ Branch 49 → 50 taken 561 times.
✓ Branch 49 → 51 taken 3217 times.
3778 if (spiceFunc.isMethod())
59
1/2
✓ Branch 50 → 51 taken 561 times.
✗ Branch 50 → 100 not taken.
561 mangledName << "E";
60
61 // Return type
62
2/2
✓ Branch 54 → 55 taken 1137 times.
✓ Branch 54 → 56 taken 2641 times.
3778 if (spiceFunc.isFunction())
63
1/2
✓ Branch 55 → 62 taken 1137 times.
✗ Branch 55 → 100 not taken.
1137 mangleType(mangledName, spiceFunc.returnType);
64 else
65
1/2
✓ Branch 56 → 62 taken 2641 times.
✗ Branch 56 → 100 not taken.
2641 mangledName << "v";
66
2/2
✓ Branch 60 → 61 taken 18276 times.
✓ Branch 60 → 62 taken 9165 times.
27441 } else if (spiceFunc.isMethod()) {
67
1/2
✓ Branch 61 → 62 taken 18276 times.
✗ Branch 61 → 100 not taken.
18276 mangledName << "E";
68 }
69
70 // Parameter types
71
2/2
✓ Branch 70 → 64 taken 34771 times.
✓ Branch 70 → 71 taken 31219 times.
65990 for (const auto &[qualType, isOptional] : spiceFunc.paramList) {
72
1/2
✗ Branch 65 → 66 not taken.
✓ Branch 65 → 67 taken 34771 times.
34771 assert(!isOptional);
73
1/2
✓ Branch 67 → 68 taken 34771 times.
✗ Branch 67 → 94 not taken.
34771 mangleType(mangledName, qualType);
74 }
75
2/2
✓ Branch 72 → 73 taken 10009 times.
✓ Branch 72 → 74 taken 21210 times.
31219 if (spiceFunc.paramList.empty())
76
1/2
✓ Branch 73 → 74 taken 10009 times.
✗ Branch 73 → 100 not taken.
10009 mangledName << "v";
77
78 #ifndef NDEBUG
79 31219 const TypeMapping &typeMapping = spiceFunc.typeMapping;
80
2/4
✓ Branch 74 → 75 taken 31219 times.
✗ Branch 74 → 96 not taken.
✓ Branch 75 → 76 taken 31219 times.
✗ Branch 75 → 95 not taken.
31219 const bool returnTypeIsFctOrProc = spiceFunc.returnType.getBase().isOneOf({TY_FUNCTION, TY_PROCEDURE});
81
2/4
✓ Branch 2 → 3 taken 34738 times.
✗ Branch 2 → 8 not taken.
✓ Branch 3 → 4 taken 34738 times.
✗ Branch 3 → 7 not taken.
34738 const auto paramPredicate = [](const Param &p) { return p.qualType.getBase().isOneOf({TY_FUNCTION, TY_PROCEDURE}); };
82
1/2
✓ Branch 76 → 77 taken 31219 times.
✗ Branch 76 → 100 not taken.
31219 const bool paramTypeIsFctOrProc = std::ranges::any_of(spiceFunc.paramList, paramPredicate);
83 12424 const auto templateTypePredicate = [&](const GenericType &t) {
84
2/2
✓ Branch 3 → 4 taken 12422 times.
✓ Branch 3 → 14 taken 2 times.
12424 if (t.is(TY_GENERIC)) {
85
1/2
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 12422 times.
12422 assert(typeMapping.contains(t.getSubType()));
86
4/8
✓ Branch 8 → 9 taken 12422 times.
✗ Branch 8 → 20 not taken.
✓ Branch 9 → 10 taken 12422 times.
✗ Branch 9 → 20 not taken.
✓ Branch 10 → 11 taken 12422 times.
✗ Branch 10 → 20 not taken.
✓ Branch 11 → 12 taken 12422 times.
✗ Branch 11 → 19 not taken.
12422 return typeMapping.at(t.getSubType()).getBase().isOneOf({TY_FUNCTION, TY_PROCEDURE});
87 }
88
2/4
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 22 not taken.
✓ Branch 15 → 16 taken 2 times.
✗ Branch 15 → 21 not taken.
2 return t.getBase().isOneOf({TY_FUNCTION, TY_PROCEDURE});
89 31219 };
90
1/2
✓ Branch 77 → 78 taken 31219 times.
✗ Branch 77 → 100 not taken.
31219 const bool templateTypeIsFctOrProc = std::ranges::any_of(spiceFunc.templateTypes, templateTypePredicate);
91
6/6
✓ Branch 78 → 79 taken 31217 times.
✓ Branch 78 → 87 taken 2 times.
✓ Branch 79 → 80 taken 31157 times.
✓ Branch 79 → 87 taken 60 times.
✓ Branch 80 → 81 taken 31136 times.
✓ Branch 80 → 87 taken 21 times.
31219 if (!returnTypeIsFctOrProc && !paramTypeIsFctOrProc && !templateTypeIsFctOrProc)
92
3/6
✓ Branch 81 → 82 taken 31136 times.
✗ Branch 81 → 99 not taken.
✓ Branch 82 → 83 taken 31136 times.
✗ Branch 82 → 97 not taken.
✗ Branch 83 → 84 not taken.
✓ Branch 83 → 85 taken 31136 times.
31136 assert(CommonUtil::isValidMangledName(mangledName.str()));
93 #endif
94
95
1/2
✓ Branch 87 → 88 taken 31219 times.
✗ Branch 87 → 100 not taken.
31219 return mangledName.str();
96 31219 }
97
98 /**
99 * Mangle a struct
100 * This should be mostly compatible with the C++ Itanium ABI name mangling scheme.
101 *
102 * @param spiceStruct Input struct
103 * @return Mangled name
104 */
105 1837 std::string NameMangling::mangleStruct(const Struct &spiceStruct) { return "struct." + spiceStruct.name; }
106
107 /**
108 * Mangle an interface
109 *
110 * @param spiceInterface Input interface
111 * @return Mangled name
112 */
113 259 std::string NameMangling::mangleInterface(const Interface &spiceInterface) { return "interface." + spiceInterface.name; }
114
115 /**
116 * Mangle a fully qualified name like e.g. test::s1::calledMethod to 4test2s112calledMethod
117 * This should be mostly compatible with the C++ Itanium ABI name mangling scheme.
118 *
119 * @param out Output string stream
120 * @param name Input name
121 * @param nestedType True if the name is a nested type
122 * @return Mangled name
123 */
124 31709 void NameMangling::mangleName(std::stringstream &out, const std::string &name, bool &nestedType) {
125 31709 std::vector<std::string> fragments;
126
1/2
✓ Branch 2 → 3 taken 31709 times.
✗ Branch 2 → 51 not taken.
31709 std::istringstream ss(name);
127 31709 std::string token;
128
129
4/6
✓ Branch 16 → 17 taken 63418 times.
✗ Branch 16 → 47 not taken.
✓ Branch 17 → 18 taken 63418 times.
✗ Branch 17 → 47 not taken.
✓ Branch 18 → 5 taken 31709 times.
✓ Branch 18 → 19 taken 31709 times.
63418 while (std::getline(ss, token, ':')) {
130
1/2
✓ Branch 5 → 6 taken 31709 times.
✗ Branch 5 → 42 not taken.
31709 std::istringstream subStream(token);
131 31709 std::string subToken;
132
4/6
✓ Branch 10 → 11 taken 63418 times.
✗ Branch 10 → 38 not taken.
✓ Branch 11 → 12 taken 63418 times.
✗ Branch 11 → 38 not taken.
✓ Branch 12 → 8 taken 31709 times.
✓ Branch 12 → 13 taken 31709 times.
63418 while (std::getline(subStream, subToken, '/')) {
133
1/2
✓ Branch 8 → 9 taken 31709 times.
✗ Branch 8 → 38 not taken.
31709 fragments.push_back(subToken);
134 }
135 31709 }
136
137 // Start a nested type if needed. The caller needs to emit the end marker.
138
1/2
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 23 taken 31709 times.
31709 if (fragments.size() > 1) {
139 out << "N";
140 nestedType = true;
141 }
142
143 // Process each fragment and append it to the result
144
2/2
✓ Branch 33 → 25 taken 31709 times.
✓ Branch 33 → 34 taken 31709 times.
63418 for (const std::string &fragment : fragments) {
145 31709 int fragmentLength = static_cast<int>(fragment.length());
146
2/4
✓ Branch 28 → 29 taken 31709 times.
✗ Branch 28 → 43 not taken.
✓ Branch 29 → 30 taken 31709 times.
✗ Branch 29 → 43 not taken.
31709 out << std::to_string(fragmentLength) << fragment;
147 }
148 31709 }
149
150 /**
151 * Mangle a symbol qualType
152 * This should be mostly compatible with the C++ Itanium ABI name mangling scheme.
153 *
154 * @param out Output string stream
155 * @param qualType Input symbol qualType
156 * @return Mangled name
157 */
158 75972 void NameMangling::mangleType(std::stringstream &out, QualType qualType) { // NOLINT(*-no-recursion)
159 75972 const Type *type = qualType.getType();
160
1/2
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 75972 times.
75972 assert(!qualType.hasAnyGenericParts());
161
162 // Unwrap qualType chain
163
1/2
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 75972 times.
75972 assert(!type->typeChain.empty());
164
2/2
✓ Branch 14 → 11 taken 9011 times.
✓ Branch 14 → 15 taken 75972 times.
84983 for (size_t i = type->typeChain.size() - 1; i >= 1; i--)
165 9011 mangleTypeChainElement(out, type->typeChain.at(i), false);
166
167 // Qualifiers
168
1/2
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 75972 times.
75972 assert(qualType.getQualifiers().isSigned == !qualType.getQualifiers().isUnsigned);
169 75972 const bool signedness = qualType.getQualifiers().isSigned;
170
6/6
✓ Branch 21 → 22 taken 13044 times.
✓ Branch 21 → 25 taken 62928 times.
✓ Branch 23 → 24 taken 4920 times.
✓ Branch 23 → 25 taken 8124 times.
✓ Branch 26 → 27 taken 4920 times.
✓ Branch 26 → 28 taken 71052 times.
75972 if (qualType.getQualifiers().isConst && type->typeChain.size() > 1)
171 4920 out << "K";
172
173 // Base chain element
174 75972 mangleTypeChainElement(out, type->typeChain.front(), signedness);
175 75972 }
176
177 /**
178 * Mangle a type chain element
179 *
180 * @param out Output string stream
181 * @param chainElement Input type chain element
182 * @param signedness Signedness of the type
183 * @return Mangled name
184 */
185 84983 void NameMangling::mangleTypeChainElement(std::stringstream &out, const TypeChainElement &chainElement, bool signedness) {
186
14/16
✓ Branch 2 → 3 taken 2438 times.
✓ Branch 2 → 5 taken 120 times.
✓ Branch 2 → 11 taken 6453 times.
✓ Branch 2 → 13 taken 2427 times.
✓ Branch 2 → 17 taken 9219 times.
✓ Branch 2 → 22 taken 2737 times.
✓ Branch 2 → 27 taken 7775 times.
✓ Branch 2 → 32 taken 2343 times.
✓ Branch 2 → 37 taken 6625 times.
✓ Branch 2 → 39 taken 10006 times.
✓ Branch 2 → 41 taken 3005 times.
✓ Branch 2 → 45 taken 31709 times.
✗ Branch 2 → 61 not taken.
✓ Branch 2 → 66 taken 34 times.
✓ Branch 2 → 79 taken 92 times.
✗ Branch 2 → 91 not taken.
84983 switch (chainElement.superType) {
187 2438 case TY_PTR:
188
1/2
✓ Branch 3 → 4 taken 2438 times.
✗ Branch 3 → 115 not taken.
2438 out << "P";
189 2438 break;
190 120 case TY_ARRAY:
191
2/2
✓ Branch 5 → 6 taken 72 times.
✓ Branch 5 → 7 taken 48 times.
120 if (chainElement.data.arraySize == ARRAY_SIZE_UNKNOWN)
192
1/2
✓ Branch 6 → 10 taken 72 times.
✗ Branch 6 → 115 not taken.
72 out << "P";
193 else
194
3/6
✓ Branch 7 → 8 taken 48 times.
✗ Branch 7 → 115 not taken.
✓ Branch 8 → 9 taken 48 times.
✗ Branch 8 → 115 not taken.
✓ Branch 9 → 10 taken 48 times.
✗ Branch 9 → 115 not taken.
48 out << "A" << chainElement.data.arraySize << "_";
195 120 break;
196 6453 case TY_REF:
197
1/2
✓ Branch 11 → 12 taken 6453 times.
✗ Branch 11 → 115 not taken.
6453 out << "R";
198 6453 break;
199 2427 case TY_DOUBLE:
200
1/2
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 2427 times.
2427 assert(signedness && "Unsigned double types are forbidden");
201
1/2
✓ Branch 15 → 16 taken 2427 times.
✗ Branch 15 → 115 not taken.
2427 out << "d";
202 2427 break;
203 9219 case TY_INT:
204
3/4
✓ Branch 17 → 18 taken 8657 times.
✓ Branch 17 → 19 taken 562 times.
✓ Branch 20 → 21 taken 9219 times.
✗ Branch 20 → 115 not taken.
9219 out << (signedness ? "i" : "j");
205 9219 break;
206 2737 case TY_SHORT:
207
3/4
✓ Branch 22 → 23 taken 2700 times.
✓ Branch 22 → 24 taken 37 times.
✓ Branch 25 → 26 taken 2737 times.
✗ Branch 25 → 115 not taken.
2737 out << (signedness ? "s" : "t");
208 2737 break;
209 7775 case TY_LONG:
210
3/4
✓ Branch 27 → 28 taken 3978 times.
✓ Branch 27 → 29 taken 3797 times.
✓ Branch 30 → 31 taken 7775 times.
✗ Branch 30 → 115 not taken.
7775 out << (signedness ? "l" : "m");
211 7775 break;
212 2343 case TY_BYTE:
213
2/4
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 34 taken 2343 times.
✓ Branch 35 → 36 taken 2343 times.
✗ Branch 35 → 115 not taken.
2343 out << (signedness ? "a" : "h");
214 2343 break;
215 6625 case TY_CHAR:
216
1/2
✓ Branch 37 → 38 taken 6625 times.
✗ Branch 37 → 115 not taken.
6625 out << "c";
217 6625 break;
218 10006 case TY_STRING:
219
1/2
✓ Branch 39 → 40 taken 10006 times.
✗ Branch 39 → 115 not taken.
10006 out << "PKc";
220 10006 break;
221 3005 case TY_BOOL:
222
1/2
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 43 taken 3005 times.
3005 assert(!signedness && "Signed bool types are forbidden");
223
1/2
✓ Branch 43 → 44 taken 3005 times.
✗ Branch 43 → 115 not taken.
3005 out << "b";
224 3005 break;
225 31709 case TY_STRUCT: // fall-through
226 case TY_INTERFACE: {
227 31709 bool nestedType = false;
228
1/2
✓ Branch 45 → 46 taken 31709 times.
✗ Branch 45 → 101 not taken.
31709 mangleName(out, chainElement.subType, nestedType);
229
2/2
✓ Branch 47 → 48 taken 10063 times.
✓ Branch 47 → 57 taken 21646 times.
31709 if (!chainElement.templateTypes.empty()) {
230
1/2
✓ Branch 48 → 49 taken 10063 times.
✗ Branch 48 → 101 not taken.
10063 out << "I";
231
2/2
✓ Branch 55 → 51 taken 12903 times.
✓ Branch 55 → 56 taken 10063 times.
22966 for (const QualType &templateType : chainElement.templateTypes)
232
1/2
✓ Branch 52 → 53 taken 12903 times.
✗ Branch 52 → 100 not taken.
12903 mangleType(out, templateType);
233
1/2
✓ Branch 56 → 57 taken 10063 times.
✗ Branch 56 → 101 not taken.
10063 out << "E";
234 }
235
1/2
✗ Branch 57 → 58 not taken.
✓ Branch 57 → 59 taken 31709 times.
31709 if (nestedType)
236 out << "E";
237 31709 break;
238 }
239 case TY_ENUM: {
240 bool nestedType = false;
241 mangleName(out, chainElement.subType, nestedType);
242 if (nestedType)
243 out << "E";
244 break;
245 }
246 34 case TY_FUNCTION: {
247
3/4
✓ Branch 66 → 67 taken 2 times.
✓ Branch 66 → 68 taken 32 times.
✓ Branch 69 → 70 taken 34 times.
✗ Branch 69 → 115 not taken.
34 out << (chainElement.data.hasCaptures ? "PFC" : "PF");
248
2/2
✓ Branch 76 → 72 taken 94 times.
✓ Branch 76 → 77 taken 34 times.
128 for (const QualType &paramType : chainElement.paramTypes)
249
1/2
✓ Branch 73 → 74 taken 94 times.
✗ Branch 73 → 103 not taken.
94 mangleType(out, paramType);
250
1/2
✓ Branch 77 → 78 taken 34 times.
✗ Branch 77 → 115 not taken.
34 out << "E";
251 34 break;
252 }
253 92 case TY_PROCEDURE: {
254
3/4
✓ Branch 79 → 80 taken 4 times.
✓ Branch 79 → 81 taken 88 times.
✓ Branch 82 → 83 taken 92 times.
✗ Branch 82 → 115 not taken.
92 out << (chainElement.data.hasCaptures ? "PFCv" : "PFv");
255
2/2
✓ Branch 88 → 84 taken 59 times.
✓ Branch 88 → 89 taken 92 times.
151 for (size_t i = 1; i < chainElement.paramTypes.size(); i++)
256
2/4
✓ Branch 84 → 85 taken 59 times.
✗ Branch 84 → 115 not taken.
✓ Branch 85 → 86 taken 59 times.
✗ Branch 85 → 115 not taken.
59 mangleType(out, chainElement.paramTypes.at(i));
257
1/2
✓ Branch 89 → 90 taken 92 times.
✗ Branch 89 → 115 not taken.
92 out << "E";
258 92 break;
259 }
260 default: // GCOV_EXCL_LINE
261 const std::string message = "Type " + chainElement.getName(false, true, true) + " cannot be mangled"; // GCOV_EXCL_LINE
262 throw CompilerError(INTERNAL_ERROR, message); // GCOV_EXCL_LINE
263 }
264 84983 }
265
266 391 std::string NameMangling::mangleTypeInfoName(const StructBase *structBase) {
267
1/2
✓ Branch 2 → 3 taken 391 times.
✗ Branch 2 → 13 not taken.
391 std::stringstream out;
268
1/2
✓ Branch 3 → 4 taken 391 times.
✗ Branch 3 → 11 not taken.
391 out << "_ZTS";
269
2/4
✓ Branch 4 → 5 taken 391 times.
✗ Branch 4 → 11 not taken.
✓ Branch 5 → 6 taken 391 times.
✗ Branch 5 → 11 not taken.
391 mangleType(out, structBase->entry->getQualType());
270
1/2
✓ Branch 6 → 7 taken 391 times.
✗ Branch 6 → 11 not taken.
782 return out.str();
271 391 }
272
273
2/4
✓ Branch 3 → 4 taken 391 times.
✗ Branch 3 → 11 not taken.
✓ Branch 4 → 5 taken 391 times.
✗ Branch 4 → 9 not taken.
391 std::string NameMangling::mangleTypeInfoValue(const std::string &value) { return std::to_string(value.size()) + value; }
274
275 556 std::string NameMangling::mangleTypeInfo(const StructBase *structBase) {
276
1/2
✓ Branch 2 → 3 taken 556 times.
✗ Branch 2 → 13 not taken.
556 std::stringstream out;
277
1/2
✓ Branch 3 → 4 taken 556 times.
✗ Branch 3 → 11 not taken.
556 out << "_ZTI";
278
2/4
✓ Branch 4 → 5 taken 556 times.
✗ Branch 4 → 11 not taken.
✓ Branch 5 → 6 taken 556 times.
✗ Branch 5 → 11 not taken.
556 mangleType(out, structBase->entry->getQualType());
279
1/2
✓ Branch 6 → 7 taken 556 times.
✗ Branch 6 → 11 not taken.
1112 return out.str();
280 556 }
281
282 782 std::string NameMangling::mangleVTable(const StructBase *structBase) {
283
1/2
✓ Branch 2 → 3 taken 782 times.
✗ Branch 2 → 13 not taken.
782 std::stringstream out;
284
1/2
✓ Branch 3 → 4 taken 782 times.
✗ Branch 3 → 11 not taken.
782 out << "_ZTV";
285
2/4
✓ Branch 4 → 5 taken 782 times.
✗ Branch 4 → 11 not taken.
✓ Branch 5 → 6 taken 782 times.
✗ Branch 5 → 11 not taken.
782 mangleType(out, structBase->entry->getQualType());
286
1/2
✓ Branch 6 → 7 taken 782 times.
✗ Branch 6 → 11 not taken.
1564 return out.str();
287 782 }
288
289 342 std::string NameMangling::mangleVTable(const std::string &typeName) {
290
3/6
✓ Branch 3 → 4 taken 342 times.
✗ Branch 3 → 15 not taken.
✓ Branch 4 → 5 taken 342 times.
✗ Branch 4 → 13 not taken.
✓ Branch 5 → 6 taken 342 times.
✗ Branch 5 → 11 not taken.
342 return "_ZTV" + std::to_string(typeName.size()) + typeName;
291 }
292
293 } // namespace spice::compiler
294