1 //===--- Symbol.cpp ----------------------------------------------*- C++-*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
16 llvm::raw_ostream
&operator<<(llvm::raw_ostream
&OS
, Symbol::SymbolFlag F
) {
17 if (F
== Symbol::None
)
20 if (F
& Symbol::Deprecated
)
22 if (F
& Symbol::IndexedForCodeCompletion
)
24 return OS
<< llvm::StringRef(S
).rtrim('|');
27 llvm::raw_ostream
&operator<<(llvm::raw_ostream
&OS
, const Symbol
&S
) {
28 return OS
<< S
.Scope
<< S
.Name
;
31 float quality(const Symbol
&S
) {
32 // This avoids a sharp gradient for tail symbols, and also neatly avoids the
33 // question of whether 0 references means a bad symbol or missing data.
36 return std::log(S
.References
);
39 SymbolSlab::const_iterator
SymbolSlab::find(const SymbolID
&ID
) const {
40 auto It
= llvm::partition_point(Symbols
,
41 [&](const Symbol
&S
) { return S
.ID
< ID
; });
42 if (It
!= Symbols
.end() && It
->ID
== ID
)
47 // Copy the underlying data of the symbol into the owned arena.
48 static void own(Symbol
&S
, llvm::UniqueStringSaver
&Strings
) {
49 visitStrings(S
, [&](llvm::StringRef
&V
) { V
= Strings
.save(V
); });
52 void SymbolSlab::Builder::insert(const Symbol
&S
) {
53 own(Symbols
[S
.ID
] = S
, UniqueStrings
);
56 SymbolSlab
SymbolSlab::Builder::build() && {
57 // Sort symbols into vector so the slab can binary search over them.
58 std::vector
<Symbol
> SortedSymbols
;
59 SortedSymbols
.reserve(Symbols
.size());
60 for (auto &Entry
: Symbols
)
61 SortedSymbols
.push_back(std::move(Entry
.second
));
62 llvm::sort(SortedSymbols
,
63 [](const Symbol
&L
, const Symbol
&R
) { return L
.ID
< R
.ID
; });
64 // We may have unused strings from overwritten symbols.
65 // In practice, these are extremely small, it's not worth compacting.
66 return SymbolSlab(std::move(Arena
), std::move(SortedSymbols
));
69 llvm::raw_ostream
&operator<<(llvm::raw_ostream
&OS
, const SymbolSlab
&Slab
) {
71 llvm::StringRef Sep
= "";
72 for (const auto &S
: Slab
) {