1*cdc20ff6SDimitry Andric //===- StringEntryToDwarfStringPoolEntryMap.h -------------------*- C++ -*-===//
2*cdc20ff6SDimitry Andric //
3*cdc20ff6SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*cdc20ff6SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*cdc20ff6SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*cdc20ff6SDimitry Andric //
7*cdc20ff6SDimitry Andric //===----------------------------------------------------------------------===//
8*cdc20ff6SDimitry Andric 
9*cdc20ff6SDimitry Andric #ifndef LLVM_LIB_DWARFLINKER_PARALLEL_STRINGENTRYTODWARFSTRINGPOOLENTRYMAP_H
10*cdc20ff6SDimitry Andric #define LLVM_LIB_DWARFLINKER_PARALLEL_STRINGENTRYTODWARFSTRINGPOOLENTRYMAP_H
11*cdc20ff6SDimitry Andric 
12*cdc20ff6SDimitry Andric #include "DWARFLinkerGlobalData.h"
13*cdc20ff6SDimitry Andric #include "llvm/ADT/SmallVector.h"
14*cdc20ff6SDimitry Andric #include "llvm/DWARFLinker/StringPool.h"
15*cdc20ff6SDimitry Andric 
16*cdc20ff6SDimitry Andric namespace llvm {
17*cdc20ff6SDimitry Andric namespace dwarf_linker {
18*cdc20ff6SDimitry Andric namespace parallel {
19*cdc20ff6SDimitry Andric 
20*cdc20ff6SDimitry Andric /// This class creates a DwarfStringPoolEntry for the corresponding StringEntry.
21*cdc20ff6SDimitry Andric class StringEntryToDwarfStringPoolEntryMap {
22*cdc20ff6SDimitry Andric public:
StringEntryToDwarfStringPoolEntryMap(LinkingGlobalData & GlobalData)23*cdc20ff6SDimitry Andric   StringEntryToDwarfStringPoolEntryMap(LinkingGlobalData &GlobalData)
24*cdc20ff6SDimitry Andric       : GlobalData(GlobalData) {}
~StringEntryToDwarfStringPoolEntryMap()25*cdc20ff6SDimitry Andric   ~StringEntryToDwarfStringPoolEntryMap() {}
26*cdc20ff6SDimitry Andric 
27*cdc20ff6SDimitry Andric   /// Create DwarfStringPoolEntry for specified StringEntry if necessary.
28*cdc20ff6SDimitry Andric   /// Initialize DwarfStringPoolEntry with initial values.
add(const StringEntry * String)29*cdc20ff6SDimitry Andric   DwarfStringPoolEntryWithExtString *add(const StringEntry *String) {
30*cdc20ff6SDimitry Andric     DwarfStringPoolEntriesTy::iterator it = DwarfStringPoolEntries.find(String);
31*cdc20ff6SDimitry Andric 
32*cdc20ff6SDimitry Andric     if (it == DwarfStringPoolEntries.end()) {
33*cdc20ff6SDimitry Andric       DwarfStringPoolEntryWithExtString *DataPtr =
34*cdc20ff6SDimitry Andric           GlobalData.getAllocator()
35*cdc20ff6SDimitry Andric               .Allocate<DwarfStringPoolEntryWithExtString>();
36*cdc20ff6SDimitry Andric       DataPtr->String = GlobalData.translateString(String->getKey());
37*cdc20ff6SDimitry Andric       DataPtr->Index = DwarfStringPoolEntry::NotIndexed;
38*cdc20ff6SDimitry Andric       DataPtr->Offset = 0;
39*cdc20ff6SDimitry Andric       DataPtr->Symbol = nullptr;
40*cdc20ff6SDimitry Andric       it = DwarfStringPoolEntries.insert(std::make_pair(String, DataPtr)).first;
41*cdc20ff6SDimitry Andric     }
42*cdc20ff6SDimitry Andric 
43*cdc20ff6SDimitry Andric     assert(it->second != nullptr);
44*cdc20ff6SDimitry Andric     return it->second;
45*cdc20ff6SDimitry Andric   }
46*cdc20ff6SDimitry Andric 
47*cdc20ff6SDimitry Andric   /// Returns already existed DwarfStringPoolEntry for the specified
48*cdc20ff6SDimitry Andric   /// StringEntry.
49*cdc20ff6SDimitry Andric   DwarfStringPoolEntryWithExtString *
getExistingEntry(const StringEntry * String)50*cdc20ff6SDimitry Andric   getExistingEntry(const StringEntry *String) const {
51*cdc20ff6SDimitry Andric     DwarfStringPoolEntriesTy::const_iterator it =
52*cdc20ff6SDimitry Andric         DwarfStringPoolEntries.find(String);
53*cdc20ff6SDimitry Andric 
54*cdc20ff6SDimitry Andric     assert(it != DwarfStringPoolEntries.end());
55*cdc20ff6SDimitry Andric     assert(it->second != nullptr);
56*cdc20ff6SDimitry Andric     return it->second;
57*cdc20ff6SDimitry Andric   }
58*cdc20ff6SDimitry Andric 
59*cdc20ff6SDimitry Andric   /// Erase contents of StringsForEmission.
clear()60*cdc20ff6SDimitry Andric   void clear() { DwarfStringPoolEntries.clear(); }
61*cdc20ff6SDimitry Andric 
62*cdc20ff6SDimitry Andric protected:
63*cdc20ff6SDimitry Andric   using DwarfStringPoolEntriesTy =
64*cdc20ff6SDimitry Andric       DenseMap<const StringEntry *, DwarfStringPoolEntryWithExtString *>;
65*cdc20ff6SDimitry Andric   DwarfStringPoolEntriesTy DwarfStringPoolEntries;
66*cdc20ff6SDimitry Andric 
67*cdc20ff6SDimitry Andric   LinkingGlobalData &GlobalData;
68*cdc20ff6SDimitry Andric };
69*cdc20ff6SDimitry Andric 
70*cdc20ff6SDimitry Andric } // end of namespace parallel
71*cdc20ff6SDimitry Andric } // end of namespace dwarf_linker
72*cdc20ff6SDimitry Andric } // end of namespace llvm
73*cdc20ff6SDimitry Andric 
74*cdc20ff6SDimitry Andric #endif // LLVM_LIB_DWARFLINKER_PARALLEL_STRINGENTRYTODWARFSTRINGPOOLENTRYMAP_H
75