mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-02 21:17:17 +00:00
[DebugInfo] Allow getDebugThreadLocalSymbol to return MCExpr
This allows getDebugThreadLocalSymbol to return a generic MCExpr instead of just a MCSymbolRefExpr. This is in preparation for supporting debug info for TLS variables on PowerPC, where we need to describe the variable location using a more complex expression than just MCSymbolRefExpr. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185460 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -140,7 +140,7 @@ public:
|
|||||||
|
|
||||||
/// \brief Create a symbol reference to describe the given TLS variable when
|
/// \brief Create a symbol reference to describe the given TLS variable when
|
||||||
/// emitting the address in debug info.
|
/// emitting the address in debug info.
|
||||||
virtual const MCSymbolRefExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const;
|
virtual const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual const MCSection *
|
virtual const MCSection *
|
||||||
|
@@ -1358,7 +1358,7 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
|
|||||||
unsigned PointerSize = Asm->getDataLayout().getPointerSize();
|
unsigned PointerSize = Asm->getDataLayout().getPointerSize();
|
||||||
assert((PointerSize == 4 || PointerSize == 8) &&
|
assert((PointerSize == 4 || PointerSize == 8) &&
|
||||||
"Add support for other sizes if necessary");
|
"Add support for other sizes if necessary");
|
||||||
const MCSymbolRefExpr *Ref =
|
const MCExpr *Expr =
|
||||||
Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
|
Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym);
|
||||||
// Based on GCC's support for TLS:
|
// Based on GCC's support for TLS:
|
||||||
if (!DD->useSplitDwarf()) {
|
if (!DD->useSplitDwarf()) {
|
||||||
@@ -1366,10 +1366,10 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) {
|
|||||||
addUInt(Block, 0, dwarf::DW_FORM_data1,
|
addUInt(Block, 0, dwarf::DW_FORM_data1,
|
||||||
PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
|
PointerSize == 4 ? dwarf::DW_OP_const4u : dwarf::DW_OP_const8u);
|
||||||
// 2) containing the (relocated) address of the TLS variable
|
// 2) containing the (relocated) address of the TLS variable
|
||||||
addExpr(Block, 0, dwarf::DW_FORM_udata, Ref);
|
addExpr(Block, 0, dwarf::DW_FORM_udata, Expr);
|
||||||
} else {
|
} else {
|
||||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
|
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index);
|
||||||
addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Ref));
|
addUInt(Block, 0, dwarf::DW_FORM_udata, DU->getAddrPoolIndex(Expr));
|
||||||
}
|
}
|
||||||
// 3) followed by a custom OP to tell the debugger about TLS (presumably)
|
// 3) followed by a custom OP to tell the debugger about TLS (presumably)
|
||||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
|
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_lo_user);
|
||||||
|
@@ -318,7 +318,7 @@ getTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const MCSymbolRefExpr *TargetLoweringObjectFile::getDebugThreadLocalSymbol(const MCSymbol *Sym) const {
|
const MCExpr *TargetLoweringObjectFile::getDebugThreadLocalSymbol(const MCSymbol *Sym) const {
|
||||||
// FIXME: It's not clear what, if any, default this should have - perhaps a
|
// FIXME: It's not clear what, if any, default this should have - perhaps a
|
||||||
// null return could mean 'no location' & we should just do that here.
|
// null return could mean 'no location' & we should just do that here.
|
||||||
return MCSymbolRefExpr::Create(Sym, *Ctx);
|
return MCSymbolRefExpr::Create(Sym, *Ctx);
|
||||||
|
@@ -48,7 +48,7 @@ X86LinuxTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM) {
|
|||||||
InitializeELF(TM.Options.UseInitArray);
|
InitializeELF(TM.Options.UseInitArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
const MCSymbolRefExpr *
|
const MCExpr *
|
||||||
X86LinuxTargetObjectFile::getDebugThreadLocalSymbol(
|
X86LinuxTargetObjectFile::getDebugThreadLocalSymbol(
|
||||||
const MCSymbol *Sym) const {
|
const MCSymbol *Sym) const {
|
||||||
return MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_DTPOFF, getContext());
|
return MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_DTPOFF, getContext());
|
||||||
|
@@ -38,7 +38,7 @@ namespace llvm {
|
|||||||
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
|
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
|
||||||
|
|
||||||
/// \brief Describe a TLS variable address within debug info.
|
/// \brief Describe a TLS variable address within debug info.
|
||||||
virtual const MCSymbolRefExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const;
|
virtual const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
Reference in New Issue
Block a user