summaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2023-02-11 12:38:04 +0000
committerDimitry Andric <dim@FreeBSD.org>2023-02-11 12:38:11 +0000
commite3b557809604d036af6e00c60f012c2025b59a5e (patch)
tree8a11ba2269a3b669601e2fd41145b174008f4da8 /llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
parent08e8dd7b9db7bb4a9de26d44c1cbfd24e869c014 (diff)
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp52
1 files changed, 29 insertions, 23 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index b26960cdebb8..6dde50375a60 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -13,7 +13,6 @@
#include "DwarfCompileUnit.h"
#include "AddressPool.h"
#include "DwarfExpression.h"
-#include "llvm/ADT/None.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/BinaryFormat/Dwarf.h"
@@ -36,6 +35,7 @@
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
#include <iterator>
+#include <optional>
#include <string>
#include <utility>
@@ -121,8 +121,8 @@ unsigned DwarfCompileUnit::getOrCreateSourceID(const DIFile *File) {
// extend .file to support this.
unsigned CUID = Asm->OutStreamer->hasRawTextSupport() ? 0 : getUniqueID();
if (!File)
- return Asm->OutStreamer->emitDwarfFileDirective(0, "", "", None, None,
- CUID);
+ return Asm->OutStreamer->emitDwarfFileDirective(0, "", "", std::nullopt,
+ std::nullopt, CUID);
if (LastFile != File) {
LastFile = File;
@@ -203,7 +203,7 @@ void DwarfCompileUnit::addLocationAttribute(
DIE *VariableDIE, const DIGlobalVariable *GV, ArrayRef<GlobalExpr> GlobalExprs) {
bool addToAccelTable = false;
DIELoc *Loc = nullptr;
- Optional<unsigned> NVPTXAddressSpace;
+ std::optional<unsigned> NVPTXAddressSpace;
std::unique_ptr<DIEDwarfExpression> DwarfExpr;
for (const auto &GE : GlobalExprs) {
const GlobalVariable *Global = GE.Var;
@@ -340,7 +340,7 @@ void DwarfCompileUnit::addLocationAttribute(
// correctly interpret address space of the variable address.
const unsigned NVPTX_ADDR_global_space = 5;
addUInt(*VariableDIE, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
- NVPTXAddressSpace ? *NVPTXAddressSpace : NVPTX_ADDR_global_space);
+ NVPTXAddressSpace.value_or(NVPTX_ADDR_global_space));
}
if (Loc)
addBlock(*VariableDIE, dwarf::DW_AT_location, DwarfExpr->finalize());
@@ -445,7 +445,12 @@ void DwarfCompileUnit::attachLowHighPC(DIE &D, const MCSymbol *Begin,
// scope then create and insert DIEs for these variables.
DIE &DwarfCompileUnit::updateSubprogramScopeDIE(const DISubprogram *SP) {
DIE *SPDie = getOrCreateSubprogramDIE(SP, includeMinimalInlineScopes());
+ auto *ContextCU = static_cast<DwarfCompileUnit *>(SPDie->getUnit());
+ return ContextCU->updateSubprogramScopeDIEImpl(SP, SPDie);
+}
+DIE &DwarfCompileUnit::updateSubprogramScopeDIEImpl(const DISubprogram *SP,
+ DIE *SPDie) {
SmallVector<RangeSpan, 2> BB_List;
// If basic block sections are on, ranges for each basic block section has
// to be emitted separately.
@@ -547,11 +552,8 @@ void DwarfCompileUnit::constructScopeDIE(LexicalScope *Scope,
// Emit inlined subprograms.
if (Scope->getParent() && isa<DISubprogram>(DS)) {
- DIE *ScopeDIE = constructInlinedScopeDIE(Scope);
- if (!ScopeDIE)
- return;
-
- ParentScopeDIE.addChild(ScopeDIE);
+ DIE *ScopeDIE = constructInlinedScopeDIE(Scope, ParentScopeDIE);
+ assert(ScopeDIE && "Scope DIE should not be null.");
createAndAddScopeChildren(Scope, *ScopeDIE);
return;
}
@@ -650,9 +652,8 @@ void DwarfCompileUnit::attachRangesOrLowHighPC(
attachRangesOrLowHighPC(Die, std::move(List));
}
-// This scope represents inlined body of a function. Construct DIE to
-// represent this concrete inlined copy of the function.
-DIE *DwarfCompileUnit::constructInlinedScopeDIE(LexicalScope *Scope) {
+DIE *DwarfCompileUnit::constructInlinedScopeDIE(LexicalScope *Scope,
+ DIE &ParentScopeDIE) {
assert(Scope->getScopeNode());
auto *DS = Scope->getScopeNode();
auto *InlinedSP = getDISubprogram(DS);
@@ -662,19 +663,20 @@ DIE *DwarfCompileUnit::constructInlinedScopeDIE(LexicalScope *Scope) {
assert(OriginDIE && "Unable to find original DIE for an inlined subprogram.");
auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_inlined_subroutine);
+ ParentScopeDIE.addChild(ScopeDIE);
addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges());
// Add the call site information to the DIE.
const DILocation *IA = Scope->getInlinedAt();
- addUInt(*ScopeDIE, dwarf::DW_AT_call_file, None,
+ addUInt(*ScopeDIE, dwarf::DW_AT_call_file, std::nullopt,
getOrCreateSourceID(IA->getFile()));
- addUInt(*ScopeDIE, dwarf::DW_AT_call_line, None, IA->getLine());
+ addUInt(*ScopeDIE, dwarf::DW_AT_call_line, std::nullopt, IA->getLine());
if (IA->getColumn())
- addUInt(*ScopeDIE, dwarf::DW_AT_call_column, None, IA->getColumn());
+ addUInt(*ScopeDIE, dwarf::DW_AT_call_column, std::nullopt, IA->getColumn());
if (IA->getDiscriminator() && DD->getDwarfVersion() >= 4)
- addUInt(*ScopeDIE, dwarf::DW_AT_GNU_discriminator, None,
+ addUInt(*ScopeDIE, dwarf::DW_AT_GNU_discriminator, std::nullopt,
IA->getDiscriminator());
// Add name to the name table, we do this here because we're guaranteed
@@ -845,7 +847,7 @@ DIE *DwarfCompileUnit::constructVariableDIEImpl(const DbgVariable &DV,
if (!DV.hasFrameIndexExprs())
return VariableDie;
- Optional<unsigned> NVPTXAddressSpace;
+ std::optional<unsigned> NVPTXAddressSpace;
DIELoc *Loc = new (DIEValueAllocator) DIELoc;
DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
for (const auto &Fragment : DV.getFrameIndexExprs()) {
@@ -893,7 +895,7 @@ DIE *DwarfCompileUnit::constructVariableDIEImpl(const DbgVariable &DV,
// correctly interpret address space of the variable address.
const unsigned NVPTX_ADDR_local_space = 6;
addUInt(*VariableDie, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1,
- NVPTXAddressSpace ? *NVPTXAddressSpace : NVPTX_ADDR_local_space);
+ NVPTXAddressSpace.value_or(NVPTX_ADDR_local_space));
}
addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
if (DwarfExpr.TagOffset)
@@ -1018,6 +1020,7 @@ sortLocalVars(SmallVectorImpl<DbgVariable *> &Input) {
DIE &DwarfCompileUnit::constructSubprogramScopeDIE(const DISubprogram *Sub,
LexicalScope *Scope) {
DIE &ScopeDIE = updateSubprogramScopeDIE(Sub);
+ auto *ContextCU = static_cast<DwarfCompileUnit *>(ScopeDIE.getUnit());
if (Scope) {
assert(!Scope->getInlinedAt());
@@ -1025,8 +1028,10 @@ DIE &DwarfCompileUnit::constructSubprogramScopeDIE(const DISubprogram *Sub,
// Collect lexical scope children first.
// ObjectPointer might be a local (non-argument) local variable if it's a
// block's synthetic this pointer.
- if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, ScopeDIE))
- addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer);
+ if (DIE *ObjectPointer =
+ ContextCU->createAndAddScopeChildren(Scope, ScopeDIE))
+ ContextCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer,
+ *ObjectPointer);
}
// If this is a variadic function, add an unspecified parameter.
@@ -1124,7 +1129,7 @@ void DwarfCompileUnit::constructAbstractSubprogramScopeDIE(
AbsDef = &ContextCU->createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, nullptr);
ContextCU->applySubprogramAttributesToDefinition(SP, *AbsDef);
ContextCU->addSInt(*AbsDef, dwarf::DW_AT_inline,
- DD->getDwarfVersion() <= 4 ? Optional<dwarf::Form>()
+ DD->getDwarfVersion() <= 4 ? std::optional<dwarf::Form>()
: dwarf::DW_FORM_implicit_const,
dwarf::DW_INL_inlined);
if (DIE *ObjectPointer = ContextCU->createAndAddScopeChildren(Scope, *AbsDef))
@@ -1588,7 +1593,8 @@ void DwarfCompileUnit::createBaseTypeDIEs() {
"_" + Twine(Btr.BitSize)).toStringRef(Str));
addUInt(Die, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Btr.Encoding);
// Round up to smallest number of bytes that contains this number of bits.
- addUInt(Die, dwarf::DW_AT_byte_size, None, divideCeil(Btr.BitSize, 8));
+ addUInt(Die, dwarf::DW_AT_byte_size, std::nullopt,
+ divideCeil(Btr.BitSize, 8));
Btr.Die = &Die;
}