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