NonRelocatableStringpool.cpp revision 360784
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
11namespace llvm {
12
13DwarfStringPoolEntryRef 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
30StringRef 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
40std::vector<DwarfStringPoolEntryRef>
41NonRelocatableStringpool::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