summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
diff options
context:
space:
mode:
authorHsiangkai Wang <hsiangkai@gmail.com>2018-08-14 13:50:59 +0000
committerHsiangkai Wang <hsiangkai@gmail.com>2018-08-14 13:50:59 +0000
commitccae278938ac2925aea9892d43ee83415c44598f (patch)
treef2e1ca91500f85e7035579ca0a973d42a27a1337 /llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
parent5bd88cf7ddc3342c1a17578aa550e21383b4d079 (diff)
downloadbcm5719-llvm-ccae278938ac2925aea9892d43ee83415c44598f.tar.gz
bcm5719-llvm-ccae278938ac2925aea9892d43ee83415c44598f.zip
[DebugInfo] Generate DWARF debug information for labels. (Fix leak problems)
There are two forms for label debug information in DWARF format. 1. Labels in a non-inlined function: DW_TAG_label DW_AT_name DW_AT_decl_file DW_AT_decl_line DW_AT_low_pc 2. Labels in an inlined function: DW_TAG_label DW_AT_abstract_origin DW_AT_low_pc We will collect label information from DBG_LABEL. Before every DBG_LABEL, we will generate a temporary symbol to denote the location of the label. The symbol could be used to get DW_AT_low_pc afterwards. So, we create a mapping between 'inlined label' and DBG_LABEL MachineInstr in DebugHandlerBase. The DBG_LABEL in the mapping is used to query the symbol before it. The AbstractLabels in DwarfCompileUnit is used to process labels in inlined functions. We also keep a mapping between scope and labels in DwarfFile to help to generate correct tree structure of DIEs. It also generates label debug information under global isel. Differential Revision: https://reviews.llvm.org/D45556 llvm-svn: 339676
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp b/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
index 82e14dc13cb..580f682b9a6 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
@@ -190,8 +190,9 @@ void DebugHandlerBase::beginFunction(const MachineFunction *MF) {
// Calculate history for local variables.
assert(DbgValues.empty() && "DbgValues map wasn't cleaned!");
- calculateDbgValueHistory(MF, Asm->MF->getSubtarget().getRegisterInfo(),
- DbgValues);
+ assert(DbgLabels.empty() && "DbgLabels map wasn't cleaned!");
+ calculateDbgEntityHistory(MF, Asm->MF->getSubtarget().getRegisterInfo(),
+ DbgValues, DbgLabels);
LLVM_DEBUG(DbgValues.dump());
// Request labels for the full history.
@@ -229,6 +230,12 @@ void DebugHandlerBase::beginFunction(const MachineFunction *MF) {
}
}
+ // Ensure there is a symbol before DBG_LABEL.
+ for (const auto &I : DbgLabels) {
+ const MachineInstr *MI = I.second;
+ requestLabelBeforeInsn(MI);
+ }
+
PrevInstLoc = DebugLoc();
PrevLabel = Asm->getFunctionBegin();
beginFunctionImpl(MF);
@@ -296,6 +303,7 @@ void DebugHandlerBase::endFunction(const MachineFunction *MF) {
if (hasDebugInfo(MMI, MF))
endFunctionImpl(MF);
DbgValues.clear();
+ DbgLabels.clear();
LabelsBeforeInsn.clear();
LabelsAfterInsn.clear();
}
OpenPOWER on IntegriCloud