diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/AddressPool.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/AddressPool.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/AddressPool.cpp b/contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/AddressPool.cpp new file mode 100644 index 000000000000..00ee4e1b47a8 --- /dev/null +++ b/contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/AddressPool.cpp @@ -0,0 +1,73 @@ +//===- llvm/CodeGen/AddressPool.cpp - Dwarf Debug Framework ---------------===// +// +// 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 "AddressPool.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/CodeGen/AsmPrinter.h" +#include "llvm/IR/DataLayout.h" +#include "llvm/MC/MCAsmInfo.h" +#include "llvm/MC/MCStreamer.h" +#include "llvm/Target/TargetLoweringObjectFile.h" +#include <utility> + +using namespace llvm; + +unsigned AddressPool::getIndex(const MCSymbol *Sym, bool TLS) { + resetUsedFlag(true); + auto IterBool = + Pool.insert(std::make_pair(Sym, AddressPoolEntry(Pool.size(), TLS))); + return IterBool.first->second.Number; +} + +MCSymbol *AddressPool::emitHeader(AsmPrinter &Asm, MCSection *Section) { + static const uint8_t AddrSize = Asm.MAI->getCodePointerSize(); + + MCSymbol *EndLabel = + Asm.emitDwarfUnitLength("debug_addr", "Length of contribution"); + Asm.OutStreamer->AddComment("DWARF version number"); + Asm.emitInt16(Asm.getDwarfVersion()); + Asm.OutStreamer->AddComment("Address size"); + Asm.emitInt8(AddrSize); + Asm.OutStreamer->AddComment("Segment selector size"); + Asm.emitInt8(0); // TODO: Support non-zero segment_selector_size. + + return EndLabel; +} + +// Emit addresses into the section given. +void AddressPool::emit(AsmPrinter &Asm, MCSection *AddrSection) { + if (isEmpty()) + return; + + // Start the dwarf addr section. + Asm.OutStreamer->switchSection(AddrSection); + + MCSymbol *EndLabel = nullptr; + + if (Asm.getDwarfVersion() >= 5) + EndLabel = emitHeader(Asm, AddrSection); + + // Define the symbol that marks the start of the contribution. + // It is referenced via DW_AT_addr_base. + Asm.OutStreamer->emitLabel(AddressTableBaseSym); + + // Order the address pool entries by ID + SmallVector<const MCExpr *, 64> Entries(Pool.size()); + + for (const auto &I : Pool) + Entries[I.second.Number] = + I.second.TLS + ? Asm.getObjFileLowering().getDebugThreadLocalSymbol(I.first) + : MCSymbolRefExpr::create(I.first, Asm.OutContext); + + for (const MCExpr *Entry : Entries) + Asm.OutStreamer->emitValue(Entry, Asm.MAI->getCodePointerSize()); + + if (EndLabel) + Asm.OutStreamer->emitLabel(EndLabel); +} |
