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