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