11
11
#include " perfetto/perfetto.h"
12
12
13
13
#include " llvm/Support/Path.h"
14
+ #include " llvm/Support/StringSaver.h"
14
15
15
16
#include " scip/scip.pb.h"
16
17
@@ -97,9 +98,15 @@ void SymbolInformationBuilder::finish(bool deterministic,
97
98
}));
98
99
}
99
100
100
- DocumentBuilder::DocumentBuilder (scip::Document &&first)
101
- : soFar(), _bomb(BOMB_INIT(fmt::format(" DocumentBuilder for '{}" ,
102
- first.relative_path()))) {
101
+ SymbolNameRef SymbolNameInterner::intern (std::string &&s) {
102
+ return SymbolNameRef{std::string_view (this ->impl .save (s))};
103
+ }
104
+
105
+ DocumentBuilder::DocumentBuilder (scip::Document &&first,
106
+ SymbolNameInterner interner)
107
+ : soFar(), interner(interner),
108
+ _bomb (BOMB_INIT(
109
+ fmt::format (" DocumentBuilder for '{}" , first.relative_path()))) {
103
110
auto &language = *first.mutable_language ();
104
111
this ->soFar .set_language (std::move (language));
105
112
auto &relativePath = *first.mutable_relative_path ();
@@ -112,17 +119,17 @@ void DocumentBuilder::merge(scip::Document &&doc) {
112
119
this ->occurrences .insert ({std::move (occ)});
113
120
}
114
121
for (auto &symbolInfo : *doc.mutable_symbols ()) {
115
- SymbolName name{ std::move (*symbolInfo.mutable_symbol ())} ;
122
+ auto name = this -> interner . intern ( std::move (*symbolInfo.mutable_symbol ())) ;
116
123
auto it = this ->symbolInfos .find (name);
117
124
if (it == this ->symbolInfos .end ()) {
118
125
// SAFETY: Don't inline this initializer call since lack of
119
126
// guarantees around subexpression evaluation order mean that
120
127
// the std::move(name) may happen before passing name to
121
128
// the initializer.
122
129
SymbolInformationBuilder builder{
123
- name. asStringRef () , std::move (*symbolInfo.mutable_documentation ()),
130
+ name, std::move (*symbolInfo.mutable_documentation ()),
124
131
std::move (*symbolInfo.mutable_relationships ())};
125
- this ->symbolInfos .emplace (std::move ( name) , std::move (builder));
132
+ this ->symbolInfos .emplace (name, std::move (builder));
126
133
continue ;
127
134
}
128
135
auto &symbolInfoBuilder = it->second ;
@@ -138,7 +145,7 @@ void DocumentBuilder::merge(scip::Document &&doc) {
138
145
void DocumentBuilder::populateSymbolToInfoMap (
139
146
SymbolToInfoMap &symbolToInfoMap) {
140
147
for (auto &[symbolName, symbolInfoBuilder] : this ->symbolInfos ) {
141
- symbolToInfoMap.emplace (std::string_view ( symbolName. asStringRef ()) ,
148
+ symbolToInfoMap.emplace (symbolName,
142
149
SymbolToInfoMap::mapped_type (&symbolInfoBuilder));
143
150
}
144
151
}
@@ -157,10 +164,10 @@ void DocumentBuilder::finish(bool deterministic, scip::Document &out) {
157
164
158
165
scip_clang::extractTransform (
159
166
std::move (this ->symbolInfos ), deterministic,
160
- absl::FunctionRef<void (SymbolName &&, SymbolInformationBuilder &&)>(
167
+ absl::FunctionRef<void (SymbolNameRef &&, SymbolInformationBuilder &&)>(
161
168
[&](auto &&name, auto &&builder) {
162
169
scip::SymbolInformation symbolInfo{};
163
- symbolInfo.set_symbol (std::move ( name.asStringRefMut () ));
170
+ symbolInfo.set_symbol (name.value . data (), name. value . size ( ));
164
171
builder.finish (deterministic, symbolInfo);
165
172
*this ->soFar .add_symbols () = std::move (symbolInfo);
166
173
}));
@@ -173,8 +180,9 @@ RootRelativePath::RootRelativePath(std::string &&value)
173
180
ENFORCE (llvm::sys::path::is_relative (this ->value ));
174
181
}
175
182
176
- IndexBuilder::IndexBuilder ()
177
- : multiplyIndexed(), externalSymbols(), _bomb(BOMB_INIT(" IndexBuilder" )) {}
183
+ IndexBuilder::IndexBuilder (SymbolNameInterner interner)
184
+ : multiplyIndexed(), externalSymbols(), interner(interner),
185
+ _bomb(BOMB_INIT(" IndexBuilder" )) {}
178
186
179
187
void IndexBuilder::addDocument (scip::Document &&doc, bool isMultiplyIndexed) {
180
188
ENFORCE (!doc.relative_path ().empty ());
@@ -184,7 +192,7 @@ void IndexBuilder::addDocument(scip::Document &&doc, bool isMultiplyIndexed) {
184
192
if (it == this ->multiplyIndexed .end ()) {
185
193
this ->multiplyIndexed .insert (
186
194
{std::move (docPath),
187
- std::make_unique<DocumentBuilder>(std::move (doc))});
195
+ std::make_unique<DocumentBuilder>(std::move (doc), this -> interner )});
188
196
} else {
189
197
auto &docBuilder = it->second ;
190
198
docBuilder->merge (std::move (doc));
@@ -200,7 +208,7 @@ void IndexBuilder::addDocument(scip::Document &&doc, bool isMultiplyIndexed) {
200
208
}
201
209
202
210
void IndexBuilder::addExternalSymbolUnchecked (
203
- SymbolName && name, scip::SymbolInformation &&extSym) {
211
+ SymbolNameRef name, scip::SymbolInformation &&extSym) {
204
212
std::vector<std::string> docs{};
205
213
absl::c_move (*extSym.mutable_documentation (), std::back_inserter (docs));
206
214
absl::flat_hash_set<RelationshipExt> rels{};
@@ -211,16 +219,16 @@ void IndexBuilder::addExternalSymbolUnchecked(
211
219
// guarantees around subexpression evaluation order mean that
212
220
// the std::move(name) may happen before name.asStringRef() is called.
213
221
auto builder = std::make_unique<SymbolInformationBuilder>(
214
- name. asStringRef () , std::move (docs), std::move (rels));
215
- this ->externalSymbols .emplace (std::move ( name) , std::move (builder));
222
+ name, std::move (docs), std::move (rels));
223
+ this ->externalSymbols .emplace (name, std::move (builder));
216
224
return ;
217
225
}
218
226
219
227
void IndexBuilder::addExternalSymbol (scip::SymbolInformation &&extSym) {
220
- SymbolName name{ std::move (*extSym.mutable_symbol ())} ;
228
+ auto name = this -> interner . intern ( std::move (*extSym.mutable_symbol ())) ;
221
229
auto it = this ->externalSymbols .find (name);
222
230
if (it == this ->externalSymbols .end ()) {
223
- this ->addExternalSymbolUnchecked (std::move ( name) , std::move (extSym));
231
+ this ->addExternalSymbolUnchecked (name, std::move (extSym));
224
232
return ;
225
233
}
226
234
// NOTE(def: precondition-deterministic-ext-symbol-docs)
@@ -241,8 +249,7 @@ std::unique_ptr<SymbolToInfoMap> IndexBuilder::populateSymbolToInfoMap() {
241
249
SymbolToInfoMap symbolToInfoMap;
242
250
for (auto &document : this ->documents ) {
243
251
for (auto &symbolInfo : *document.mutable_symbols ()) {
244
- auto symbolName = std::string_view (symbolInfo.symbol ());
245
- symbolToInfoMap.emplace (symbolName,
252
+ symbolToInfoMap.emplace (SymbolNameRef{symbolInfo.symbol ()},
246
253
SymbolToInfoMap::mapped_type (&symbolInfo));
247
254
}
248
255
}
@@ -255,8 +262,9 @@ std::unique_ptr<SymbolToInfoMap> IndexBuilder::populateSymbolToInfoMap() {
255
262
void IndexBuilder::addForwardDeclaration (
256
263
const SymbolToInfoMap &symbolToInfoMap,
257
264
scip::SymbolInformation &&forwardDeclSym) {
258
- SymbolName name{std::move (*forwardDeclSym.mutable_symbol ())};
259
- auto it = symbolToInfoMap.find (name.asStringRef ());
265
+ auto name =
266
+ this ->interner .intern (std::move (*forwardDeclSym.mutable_symbol ()));
267
+ auto it = symbolToInfoMap.find (name);
260
268
if (it == symbolToInfoMap.end ()) {
261
269
if (!this ->externalSymbols .contains (name)) {
262
270
this ->addExternalSymbolUnchecked (std::move (name),
@@ -353,11 +361,11 @@ void IndexBuilder::finish(bool deterministic, std::ostream &outputStream) {
353
361
}));
354
362
scip_clang::extractTransform (
355
363
std::move (this ->externalSymbols ), deterministic,
356
- absl::FunctionRef<void (SymbolName &&,
364
+ absl::FunctionRef<void (SymbolNameRef &&,
357
365
std::unique_ptr<SymbolInformationBuilder> &&)>(
358
366
[&](auto &&name, auto &&builder) -> void {
359
367
scip::SymbolInformation extSym{};
360
- extSym.set_symbol (std::move ( name.asStringRefMut () ));
368
+ extSym.set_symbol (name.value . data (), name. value . size ( ));
361
369
builder->finish (deterministic, extSym);
362
370
writer.writeExternalSymbol (std::move (extSym));
363
371
}));
0 commit comments