Home | History | Annotate | Line # | Download | only in CodeGen
      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