147
|
1 //===- NonRelocatableStringpool.cpp - A simple stringpool ----------------===//
|
|
2 //
|
|
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
|
|
6 //
|
|
7 //===----------------------------------------------------------------------===//
|
|
8
|
|
9 #include "NonRelocatableStringpool.h"
|
|
10
|
|
11 namespace llvm {
|
|
12 namespace dsymutil {
|
|
13
|
|
14 DwarfStringPoolEntryRef NonRelocatableStringpool::getEntry(StringRef S) {
|
|
15 if (S.empty() && !Strings.empty())
|
|
16 return EmptyString;
|
|
17
|
|
18 if (Translator)
|
|
19 S = Translator(S);
|
|
20 auto I = Strings.insert({S, DwarfStringPoolEntry()});
|
|
21 auto &Entry = I.first->second;
|
|
22 if (I.second || !Entry.isIndexed()) {
|
|
23 Entry.Index = NumEntries++;
|
|
24 Entry.Offset = CurrentEndOffset;
|
|
25 Entry.Symbol = nullptr;
|
|
26 CurrentEndOffset += S.size() + 1;
|
|
27 }
|
|
28 return DwarfStringPoolEntryRef(*I.first, true);
|
|
29 }
|
|
30
|
|
31 StringRef NonRelocatableStringpool::internString(StringRef S) {
|
|
32 DwarfStringPoolEntry Entry{nullptr, 0, DwarfStringPoolEntry::NotIndexed};
|
|
33
|
|
34 if (Translator)
|
|
35 S = Translator(S);
|
|
36
|
|
37 auto InsertResult = Strings.insert({S, Entry});
|
|
38 return InsertResult.first->getKey();
|
|
39 }
|
|
40
|
|
41 std::vector<DwarfStringPoolEntryRef>
|
|
42 NonRelocatableStringpool::getEntriesForEmission() const {
|
|
43 std::vector<DwarfStringPoolEntryRef> Result;
|
|
44 Result.reserve(Strings.size());
|
|
45 for (const auto &E : Strings)
|
|
46 if (E.getValue().isIndexed())
|
|
47 Result.emplace_back(E, true);
|
|
48 llvm::sort(Result, [](const DwarfStringPoolEntryRef A,
|
|
49 const DwarfStringPoolEntryRef B) {
|
|
50 return A.getIndex() < B.getIndex();
|
|
51 });
|
|
52 return Result;
|
|
53 }
|
|
54
|
|
55 } // namespace dsymutil
|
|
56 } // namespace llvm
|