From 706b4fc47bbc608932d3b491ae19a3b9cde9497b Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Fri, 17 Jan 2020 20:45:01 +0000 Subject: Vendor import of llvm-project master e26a78e70, the last commit before the llvmorg-11-init tag, from which release/10.x was branched. --- llvm/lib/CodeGen/NonRelocatableStringpool.cpp | 54 +++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 llvm/lib/CodeGen/NonRelocatableStringpool.cpp (limited to 'llvm/lib/CodeGen/NonRelocatableStringpool.cpp') diff --git a/llvm/lib/CodeGen/NonRelocatableStringpool.cpp b/llvm/lib/CodeGen/NonRelocatableStringpool.cpp new file mode 100644 index 000000000000..9ed3471c0fc9 --- /dev/null +++ b/llvm/lib/CodeGen/NonRelocatableStringpool.cpp @@ -0,0 +1,54 @@ +//===-- NonRelocatableStringpool.cpp --------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/CodeGen/NonRelocatableStringpool.h" + +namespace llvm { + +DwarfStringPoolEntryRef NonRelocatableStringpool::getEntry(StringRef S) { + if (S.empty() && !Strings.empty()) + return EmptyString; + + if (Translator) + S = Translator(S); + auto I = Strings.insert({S, DwarfStringPoolEntry()}); + auto &Entry = I.first->second; + if (I.second || !Entry.isIndexed()) { + Entry.Index = NumEntries++; + Entry.Offset = CurrentEndOffset; + Entry.Symbol = nullptr; + CurrentEndOffset += S.size() + 1; + } + return DwarfStringPoolEntryRef(*I.first, true); +} + +StringRef NonRelocatableStringpool::internString(StringRef S) { + DwarfStringPoolEntry Entry{nullptr, 0, DwarfStringPoolEntry::NotIndexed}; + + if (Translator) + S = Translator(S); + + auto InsertResult = Strings.insert({S, Entry}); + return InsertResult.first->getKey(); +} + +std::vector +NonRelocatableStringpool::getEntriesForEmission() const { + std::vector Result; + Result.reserve(Strings.size()); + for (const auto &E : Strings) + if (E.getValue().isIndexed()) + Result.emplace_back(E, true); + llvm::sort(Result, [](const DwarfStringPoolEntryRef A, + const DwarfStringPoolEntryRef B) { + return A.getIndex() < B.getIndex(); + }); + return Result; +} + +} // namespace llvm -- cgit v1.2.3