mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 07:11:49 +00:00
Separate out the DWARF address pool into its own type/files.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207022 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b5a391a685
commit
e384ec7853
36
lib/CodeGen/AsmPrinter/AddressPool.cpp
Normal file
36
lib/CodeGen/AsmPrinter/AddressPool.cpp
Normal file
@ -0,0 +1,36 @@
|
||||
|
||||
#include "AddressPool.h"
|
||||
#include "llvm/CodeGen/AsmPrinter.h"
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
#include "llvm/Target/TargetLoweringObjectFile.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
class MCExpr;
|
||||
|
||||
unsigned AddressPool::getIndex(const MCSymbol *Sym, bool TLS) {
|
||||
auto IterBool =
|
||||
Pool.insert(std::make_pair(Sym, AddressPoolEntry(Pool.size(), TLS)));
|
||||
return IterBool.first->second.Number;
|
||||
}
|
||||
|
||||
// Emit addresses into the section given.
|
||||
void AddressPool::emit(AsmPrinter &Asm, const MCSection *AddrSection) {
|
||||
if (Pool.empty())
|
||||
return;
|
||||
|
||||
// Start the dwarf addr section.
|
||||
Asm.OutStreamer.SwitchSection(AddrSection);
|
||||
|
||||
// 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.getDataLayout().getPointerSize());
|
||||
}
|
39
lib/CodeGen/AsmPrinter/AddressPool.h
Normal file
39
lib/CodeGen/AsmPrinter/AddressPool.h
Normal file
@ -0,0 +1,39 @@
|
||||
//===-- llvm/CodeGen/AddressPool.h - Dwarf Debug Framework -----*- C++ -*--===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef CODEGEN_ASMPRINTER_ADDRESSPOOL_H__
|
||||
#define CODEGEN_ASMPRINTER_ADDRESSPOOL_H__
|
||||
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
|
||||
namespace llvm {
|
||||
class MCSection;
|
||||
class MCSymbol;
|
||||
class AsmPrinter;
|
||||
// Collection of addresses for this unit and assorted labels.
|
||||
// A Symbol->unsigned mapping of addresses used by indirect
|
||||
// references.
|
||||
class AddressPool {
|
||||
struct AddressPoolEntry {
|
||||
unsigned Number;
|
||||
bool TLS;
|
||||
AddressPoolEntry(unsigned Number, bool TLS) : Number(Number), TLS(TLS) {}
|
||||
};
|
||||
DenseMap<const MCSymbol *, AddressPoolEntry> Pool;
|
||||
public:
|
||||
/// \brief Returns the index into the address pool with the given
|
||||
/// label/symbol.
|
||||
unsigned getIndex(const MCSymbol *Sym, bool TLS = false);
|
||||
|
||||
void emit(AsmPrinter &Asm, const MCSection *AddrSection);
|
||||
|
||||
bool isEmpty() { return Pool.empty(); }
|
||||
};
|
||||
}
|
||||
#endif
|
@ -1,4 +1,5 @@
|
||||
add_llvm_library(LLVMAsmPrinter
|
||||
AddressPool.cpp
|
||||
ARMException.cpp
|
||||
AsmPrinter.cpp
|
||||
AsmPrinterDwarf.cpp
|
||||
|
@ -888,7 +888,7 @@ void DwarfDebug::finalizeModuleInfo() {
|
||||
|
||||
// We don't keep track of which addresses are used in which CU so this
|
||||
// is a bit pessimistic under LTO.
|
||||
if (!InfoHolder.getAddrPool()->empty())
|
||||
if (!InfoHolder.getAddressPool().isEmpty())
|
||||
addSectionLabel(*Asm, *SkCU, SkCU->getUnitDie(),
|
||||
dwarf::DW_AT_GNU_addr_base, DwarfAddrSectionSym,
|
||||
DwarfAddrSectionSym);
|
||||
@ -1019,7 +1019,8 @@ void DwarfDebug::endModule() {
|
||||
emitDebugAbbrevDWO();
|
||||
emitDebugLineDWO();
|
||||
// Emit DWO addresses.
|
||||
InfoHolder.emitAddresses(Asm->getObjFileLowering().getDwarfAddrSection());
|
||||
InfoHolder.getAddressPool().emit(
|
||||
*Asm, Asm->getObjFileLowering().getDwarfAddrSection());
|
||||
emitDebugLocDWO();
|
||||
} else
|
||||
// Emit info into a debug loc section.
|
||||
@ -2204,7 +2205,7 @@ void DwarfDebug::emitDebugLocDWO() {
|
||||
// address we know we've emitted elsewhere (the start of the function?
|
||||
// The start of the CU or CU subrange that encloses this range?)
|
||||
Asm->EmitInt8(dwarf::DW_LLE_start_length_entry);
|
||||
unsigned idx = InfoHolder.getAddrPoolIndex(Entry.getBeginSym());
|
||||
unsigned idx = InfoHolder.getAddressPool().getIndex(Entry.getBeginSym());
|
||||
Asm->EmitULEB128(idx);
|
||||
Asm->EmitLabelDifference(Entry.getEndSym(), Entry.getBeginSym(), 4);
|
||||
|
||||
|
@ -48,12 +48,6 @@ unsigned DwarfFile::getStringPoolIndex(StringRef Str) {
|
||||
return Entry.second;
|
||||
}
|
||||
|
||||
unsigned DwarfFile::getAddrPoolIndex(const MCSymbol *Sym, bool TLS) {
|
||||
std::pair<AddrPool::iterator, bool> P = AddressPool.insert(
|
||||
std::make_pair(Sym, AddressPoolEntry(AddressPool.size(), TLS)));
|
||||
return P.first->second.Number;
|
||||
}
|
||||
|
||||
// Define a unique number for the abbreviation.
|
||||
//
|
||||
void DwarfFile::assignAbbrevNumber(DIEAbbrev &Abbrev) {
|
||||
@ -218,26 +212,4 @@ void DwarfFile::emitStrings(const MCSection *StrSection,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Emit addresses into the section given.
|
||||
void DwarfFile::emitAddresses(const MCSection *AddrSection) {
|
||||
|
||||
if (AddressPool.empty())
|
||||
return;
|
||||
|
||||
// Start the dwarf addr section.
|
||||
Asm->OutStreamer.SwitchSection(AddrSection);
|
||||
|
||||
// Order the address pool entries by ID
|
||||
SmallVector<const MCExpr *, 64> Entries(AddressPool.size());
|
||||
|
||||
for (const auto &I : AddressPool)
|
||||
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->getDataLayout().getPointerSize());
|
||||
}
|
||||
}
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "llvm/Support/Allocator.h"
|
||||
#include "AddressPool.h"
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
@ -51,17 +52,7 @@ class DwarfFile {
|
||||
unsigned NextStringPoolNumber;
|
||||
std::string StringPref;
|
||||
|
||||
struct AddressPoolEntry {
|
||||
unsigned Number;
|
||||
bool TLS;
|
||||
AddressPoolEntry(unsigned Number, bool TLS) : Number(Number), TLS(TLS) {}
|
||||
};
|
||||
// Collection of addresses for this unit and assorted labels.
|
||||
// A Symbol->unsigned mapping of addresses used by indirect
|
||||
// references.
|
||||
typedef DenseMap<const MCSymbol *, AddressPoolEntry> AddrPool;
|
||||
AddrPool AddressPool;
|
||||
|
||||
AddressPool AddrPool;
|
||||
public:
|
||||
DwarfFile(AsmPrinter *AP, const char *Pref, BumpPtrAllocator &DA);
|
||||
|
||||
@ -93,9 +84,6 @@ public:
|
||||
const MCSection *OffsetSection = nullptr,
|
||||
const MCSymbol *StrSecSym = nullptr);
|
||||
|
||||
/// \brief Emit all of the addresses to the section given.
|
||||
void emitAddresses(const MCSection *AddrSection);
|
||||
|
||||
/// \brief Returns the entry into the start of the pool.
|
||||
MCSymbol *getStringPoolSym();
|
||||
|
||||
@ -110,12 +98,7 @@ public:
|
||||
/// \brief Returns the string pool.
|
||||
StrPool *getStringPool() { return &StringPool; }
|
||||
|
||||
/// \brief Returns the index into the address pool with the given
|
||||
/// label/symbol.
|
||||
unsigned getAddrPoolIndex(const MCSymbol *Sym, bool TLS = false);
|
||||
|
||||
/// \brief Returns the address pool.
|
||||
AddrPool *getAddrPool() { return &AddressPool; }
|
||||
AddressPool &getAddressPool() { return AddrPool; }
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
@ -290,7 +290,7 @@ void DwarfCompileUnit::addLabelAddress(DIE *Die, dwarf::Attribute Attribute,
|
||||
if (Label)
|
||||
DD->addArangeLabel(SymbolCU(this, Label));
|
||||
|
||||
unsigned idx = DU->getAddrPoolIndex(Label);
|
||||
unsigned idx = DU->getAddressPool().getIndex(Label);
|
||||
DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx);
|
||||
Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value);
|
||||
}
|
||||
@ -335,7 +335,8 @@ void DwarfUnit::addOpAddress(DIELoc *Die, const MCSymbol *Sym) {
|
||||
addLabel(Die, dwarf::DW_FORM_udata, Sym);
|
||||
} else {
|
||||
addUInt(Die, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index);
|
||||
addUInt(Die, dwarf::DW_FORM_GNU_addr_index, DU->getAddrPoolIndex(Sym));
|
||||
addUInt(Die, dwarf::DW_FORM_GNU_addr_index,
|
||||
DU->getAddressPool().getIndex(Sym));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1668,7 +1669,7 @@ void DwarfCompileUnit::createGlobalVariableDIE(DIGlobalVariable GV) {
|
||||
} else {
|
||||
addUInt(Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
|
||||
addUInt(Loc, dwarf::DW_FORM_udata,
|
||||
DU->getAddrPoolIndex(Sym, /* TLS */ true));
|
||||
DU->getAddressPool().getIndex(Sym, /* TLS */ true));
|
||||
}
|
||||
// 3) followed by a custom OP to make the debugger do a TLS lookup.
|
||||
addUInt(Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_push_tls_address);
|
||||
|
Loading…
Reference in New Issue
Block a user