Fwd: [llvm] r337812 - Revert "[DebugInfo] Generate DWARF debug information for labels."
Shiva Chen via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 30 19:49:13 PDT 2018
Kai didn't subscribe llvm-commit list yet, so I forward the email for him.
---------- Forwarded message ----------
From: <kai at andestech.com>
Date: 2018-07-31 10:36 GMT+08:00
Subject: RE: [llvm] r337812 - Revert "[DebugInfo] Generate DWARF debug
information for labels."
To: shiva0217 at gmail.com
Hi David,
I reverted it because the commit will cause
test/DebugInfo/Generic/debug-label.ll fail in some targets.
When the targets use global isel by default, this patch will not
generate correct MI for Intrinsic::dbg_label.
http://lab.llvm.org:8011/builders/clang-cmake-armv8-full/builds/4792
http://lab.llvm.org:8011/builders/clang-cmake-aarch64-global-isel/builds/6777
I will add explanation in the revert commits next time. Thanks for
your kind reminder.
Kai
-----Original Message-----
From: Shiva Chen [mailto:shiva0217 at gmail.com]
Sent: Tuesday, July 31, 2018 8:58 AM
To: Kai Hsiang-Kai Wang(王相凱)
Subject: Fwd: [llvm] r337812 - Revert "[DebugInfo] Generate DWARF
debug information for labels."
Hi Kai,
Could you obtain the context that David suggest?
Thanks,
Shiva
---------- Forwarded message ----------
From: David Blaikie <dblaikie at gmail.com>
Date: 2018-07-31 6:48 GMT+08:00
Subject: Re: [llvm] r337812 - Revert "[DebugInfo] Generate DWARF debug
information for labels."
To: Shiva Chen <shiva0217 at gmail.com>
副本: llvm-commits at lists.llvm.org
When reverting a patch, it helps to include an explanation for why the
patch was reverted (as well as a link to any buildbot results, etc).
That way those following along or looking back on the patch sequence
can have that context.
On Mon, Jul 23, 2018 at 11:17 PM Shiva Chen via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
> Author: shiva
> Date: Mon Jul 23 23:17:45 2018
> New Revision: 337812
>
> URL: http://llvm.org/viewvc/llvm-project?rev=337812&view=rev
> Log:
> Revert "[DebugInfo] Generate DWARF debug information for labels."
>
> This reverts commit b454fa1b4079b6c0a5b1565982d16516385838d7.
>
> Added:
> llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp
> - copied, changed from r337806, llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h
> - copied, changed from r337806, llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h
> Removed:
> llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h
> llvm/trunk/test/DebugInfo/Generic/debug-label-inline.ll
> llvm/trunk/test/DebugInfo/Generic/debug-label.ll
> Modified:
> llvm/trunk/include/llvm/IR/InstVisitor.h
> llvm/trunk/include/llvm/IR/IntrinsicInst.h
> llvm/trunk/lib/CodeGen/AsmPrinter/CMakeLists.txt
> llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h
> llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.h
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.h
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
>
> Modified: llvm/trunk/include/llvm/IR/InstVisitor.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/InstVisitor.h?rev=337812&r1=337811&r2=337812&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/InstVisitor.h (original)
> +++ llvm/trunk/include/llvm/IR/InstVisitor.h Mon Jul 23 23:17:45 2018
> @@ -213,7 +213,7 @@ public:
> // Handle the special instrinsic instruction classes.
> RetTy visitDbgDeclareInst(DbgDeclareInst &I) { DELEGATE(DbgInfoIntrinsic);}
> RetTy visitDbgValueInst(DbgValueInst &I) { DELEGATE(DbgInfoIntrinsic);}
> - RetTy visitDbgLabelInst(DbgLabelInst &I) { DELEGATE(IntrinsicInst);}
> + RetTy visitDbgLabelInst(DbgLabelInst &I) { DELEGATE(DbgInfoIntrinsic);}
> RetTy visitDbgInfoIntrinsic(DbgInfoIntrinsic &I) { DELEGATE(IntrinsicInst); }
> RetTy visitMemSetInst(MemSetInst &I) { DELEGATE(MemIntrinsic); }
> RetTy visitMemCpyInst(MemCpyInst &I) { DELEGATE(MemTransferInst); }
>
> Modified: llvm/trunk/include/llvm/IR/IntrinsicInst.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/IntrinsicInst.h?rev=337812&r1=337811&r2=337812&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/IntrinsicInst.h (original)
> +++ llvm/trunk/include/llvm/IR/IntrinsicInst.h Mon Jul 23 23:17:45 2018
> @@ -104,6 +104,7 @@ namespace llvm {
> case Intrinsic::dbg_declare:
> case Intrinsic::dbg_value:
> case Intrinsic::dbg_addr:
> + case Intrinsic::dbg_label:
> return true;
> default: return false;
> }
> @@ -164,7 +165,7 @@ namespace llvm {
> };
>
> /// This represents the llvm.dbg.label instruction.
> - class DbgLabelInst : public IntrinsicInst {
> + class DbgLabelInst : public DbgInfoIntrinsic {
> public:
> DILabel *getLabel() const {
> return cast<DILabel>(getRawVariable());
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CMakeLists.txt?rev=337812&r1=337811&r2=337812&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/CMakeLists.txt (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/CMakeLists.txt Mon Jul 23 23:17:45 2018
> @@ -5,7 +5,7 @@ add_llvm_library(LLVMAsmPrinter
> AsmPrinter.cpp
> AsmPrinterDwarf.cpp
> AsmPrinterInlineAsm.cpp
> - DbgEntityHistoryCalculator.cpp
> + DbgValueHistoryCalculator.cpp
> DebugHandlerBase.cpp
> DebugLocStream.cpp
> DIE.cpp
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h?rev=337812&r1=337811&r2=337812&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h Mon Jul 23 23:17:45 2018
> @@ -14,7 +14,7 @@
> #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_CODEVIEWDEBUG_H
> #define LLVM_LIB_CODEGEN_ASMPRINTER_CODEVIEWDEBUG_H
>
> -#include "DbgEntityHistoryCalculator.h"
> +#include "DbgValueHistoryCalculator.h"
> #include "DebugHandlerBase.h"
> #include "llvm/ADT/ArrayRef.h"
> #include "llvm/ADT/DenseMap.h"
>
> Removed: llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp?rev=337811&view=auto
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp (removed)
> @@ -1,316 +0,0 @@
> -//===- llvm/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp -------------===//
> -//
> -// The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#include "DbgEntityHistoryCalculator.h"
> -#include "llvm/ADT/BitVector.h"
> -#include "llvm/ADT/STLExtras.h"
> -#include "llvm/ADT/SmallVector.h"
> -#include "llvm/CodeGen/MachineBasicBlock.h"
> -#include "llvm/CodeGen/MachineFunction.h"
> -#include "llvm/CodeGen/MachineInstr.h"
> -#include "llvm/CodeGen/MachineOperand.h"
> -#include "llvm/CodeGen/TargetLowering.h"
> -#include "llvm/CodeGen/TargetRegisterInfo.h"
> -#include "llvm/CodeGen/TargetSubtargetInfo.h"
> -#include "llvm/IR/DebugInfoMetadata.h"
> -#include "llvm/IR/DebugLoc.h"
> -#include "llvm/MC/MCRegisterInfo.h"
> -#include "llvm/Support/Debug.h"
> -#include "llvm/Support/raw_ostream.h"
> -#include <cassert>
> -#include <map>
> -#include <utility>
> -
> -using namespace llvm;
> -
> -#define DEBUG_TYPE "dwarfdebug"
> -
> -// If @MI is a DBG_VALUE with debug value described by a
> -// defined register, returns the number of this register.
> -// In the other case, returns 0.
> -static unsigned isDescribedByReg(const MachineInstr &MI) {
> - assert(MI.isDebugValue());
> - assert(MI.getNumOperands() == 4);
> - // If location of variable is described using a register (directly or
> - // indirectly), this register is always a first operand.
> - return MI.getOperand(0).isReg() ? MI.getOperand(0).getReg() : 0;
> -}
> -
> -void DbgValueHistoryMap::startInstrRange(InlinedVariable Var,
> - const MachineInstr &MI) {
> - // Instruction range should start with a DBG_VALUE instruction for the
> - // variable.
> - assert(MI.isDebugValue() && "not a DBG_VALUE");
> - auto &Ranges = VarInstrRanges[Var];
> - if (!Ranges.empty() && Ranges.back().second == nullptr &&
> - Ranges.back().first->isIdenticalTo(MI)) {
> - LLVM_DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
> - << "\t" << Ranges.back().first << "\t" << MI << "\n");
> - return;
> - }
> - Ranges.push_back(std::make_pair(&MI, nullptr));
> -}
> -
> -void DbgValueHistoryMap::endInstrRange(InlinedVariable Var,
> - const MachineInstr &MI) {
> - auto &Ranges = VarInstrRanges[Var];
> - // Verify that the current instruction range is not yet closed.
> - assert(!Ranges.empty() && Ranges.back().second == nullptr);
> - // For now, instruction ranges are not allowed to cross basic block
> - // boundaries.
> - assert(Ranges.back().first->getParent() == MI.getParent());
> - Ranges.back().second = &MI;
> -}
> -
> -unsigned DbgValueHistoryMap::getRegisterForVar(InlinedVariable Var) const {
> - const auto &I = VarInstrRanges.find(Var);
> - if (I == VarInstrRanges.end())
> - return 0;
> - const auto &Ranges = I->second;
> - if (Ranges.empty() || Ranges.back().second != nullptr)
> - return 0;
> - return isDescribedByReg(*Ranges.back().first);
> -}
> -
> -void DbgLabelInstrMap::addInstr(InlinedLabel Label, const MachineInstr &MI) {
> - assert(MI.isDebugLabel() && "not a DBG_LABEL");
> - LabelInstr[Label] = &MI;
> -}
> -
> -namespace {
> -
> -// Maps physreg numbers to the variables they describe.
> -using InlinedVariable = DbgValueHistoryMap::InlinedVariable;
> -using RegDescribedVarsMap = std::map<unsigned, SmallVector<InlinedVariable, 1>>;
> -using InlinedLabel = DbgLabelInstrMap::InlinedLabel;
> -
> -} // end anonymous namespace
> -
> -// Claim that @Var is not described by @RegNo anymore.
> -static void dropRegDescribedVar(RegDescribedVarsMap &RegVars, unsigned RegNo,
> - InlinedVariable Var) {
> - const auto &I = RegVars.find(RegNo);
> - assert(RegNo != 0U && I != RegVars.end());
> - auto &VarSet = I->second;
> - const auto &VarPos = llvm::find(VarSet, Var);
> - assert(VarPos != VarSet.end());
> - VarSet.erase(VarPos);
> - // Don't keep empty sets in a map to keep it as small as possible.
> - if (VarSet.empty())
> - RegVars.erase(I);
> -}
> -
> -// Claim that @Var is now described by @RegNo.
> -static void addRegDescribedVar(RegDescribedVarsMap &RegVars, unsigned RegNo,
> - InlinedVariable Var) {
> - assert(RegNo != 0U);
> - auto &VarSet = RegVars[RegNo];
> - assert(!is_contained(VarSet, Var));
> - VarSet.push_back(Var);
> -}
> -
> -// Terminate the location range for variables described by register at
> -// @I by inserting @ClobberingInstr to their history.
> -static void clobberRegisterUses(RegDescribedVarsMap &RegVars,
> - RegDescribedVarsMap::iterator I,
> - DbgValueHistoryMap &HistMap,
> - const MachineInstr &ClobberingInstr) {
> - // Iterate over all variables described by this register and add this
> - // instruction to their history, clobbering it.
> - for (const auto &Var : I->second)
> - HistMap.endInstrRange(Var, ClobberingInstr);
> - RegVars.erase(I);
> -}
> -
> -// Terminate the location range for variables described by register
> -// @RegNo by inserting @ClobberingInstr to their history.
> -static void clobberRegisterUses(RegDescribedVarsMap &RegVars, unsigned RegNo,
> - DbgValueHistoryMap &HistMap,
> - const MachineInstr &ClobberingInstr) {
> - const auto &I = RegVars.find(RegNo);
> - if (I == RegVars.end())
> - return;
> - clobberRegisterUses(RegVars, I, HistMap, ClobberingInstr);
> -}
> -
> -// Returns the first instruction in @MBB which corresponds to
> -// the function epilogue, or nullptr if @MBB doesn't contain an epilogue.
> -static const MachineInstr *getFirstEpilogueInst(const MachineBasicBlock &MBB) {
> - auto LastMI = MBB.getLastNonDebugInstr();
> - if (LastMI == MBB.end() || !LastMI->isReturn())
> - return nullptr;
> - // Assume that epilogue starts with instruction having the same debug location
> - // as the return instruction.
> - DebugLoc LastLoc = LastMI->getDebugLoc();
> - auto Res = LastMI;
> - for (MachineBasicBlock::const_reverse_iterator I = LastMI.getReverse(),
> - E = MBB.rend();
> - I != E; ++I) {
> - if (I->getDebugLoc() != LastLoc)
> - return &*Res;
> - Res = &*I;
> - }
> - // If all instructions have the same debug location, assume whole MBB is
> - // an epilogue.
> - return &*MBB.begin();
> -}
> -
> -// Collect registers that are modified in the function body (their
> -// contents is changed outside of the prologue and epilogue).
> -static void collectChangingRegs(const MachineFunction *MF,
> - const TargetRegisterInfo *TRI,
> - BitVector &Regs) {
> - for (const auto &MBB : *MF) {
> - auto FirstEpilogueInst = getFirstEpilogueInst(MBB);
> -
> - for (const auto &MI : MBB) {
> - // Avoid looking at prologue or epilogue instructions.
> - if (&MI == FirstEpilogueInst)
> - break;
> - if (MI.getFlag(MachineInstr::FrameSetup))
> - continue;
> -
> - // Look for register defs and register masks. Register masks are
> - // typically on calls and they clobber everything not in the mask.
> - for (const MachineOperand &MO : MI.operands()) {
> - // Skip virtual registers since they are handled by the parent.
> - if (MO.isReg() && MO.isDef() && MO.getReg() &&
> - !TRI->isVirtualRegister(MO.getReg())) {
> - for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid();
> - ++AI)
> - Regs.set(*AI);
> - } else if (MO.isRegMask()) {
> - Regs.setBitsNotInMask(MO.getRegMask());
> - }
> - }
> - }
> - }
> -}
> -
> -void llvm::calculateDbgEntityHistory(const MachineFunction *MF,
> - const TargetRegisterInfo *TRI,
> - DbgValueHistoryMap &DbgValues,
> - DbgLabelInstrMap &DbgLabels) {
> - BitVector ChangingRegs(TRI->getNumRegs());
> - collectChangingRegs(MF, TRI, ChangingRegs);
> -
> - const TargetLowering *TLI = MF->getSubtarget().getTargetLowering();
> - unsigned SP = TLI->getStackPointerRegisterToSaveRestore();
> - RegDescribedVarsMap RegVars;
> - for (const auto &MBB : *MF) {
> - for (const auto &MI : MBB) {
> - if (!MI.isDebugInstr()) {
> - // Not a DBG_VALUE instruction. It may clobber registers which describe
> - // some variables.
> - for (const MachineOperand &MO : MI.operands()) {
> - if (MO.isReg() && MO.isDef() && MO.getReg()) {
> - // Ignore call instructions that claim to clobber SP. The AArch64
> - // backend does this for aggregate function arguments.
> - if (MI.isCall() && MO.getReg() == SP)
> - continue;
> - // If this is a virtual register, only clobber it since it doesn't
> - // have aliases.
> - if (TRI->isVirtualRegister(MO.getReg()))
> - clobberRegisterUses(RegVars, MO.getReg(), DbgValues, MI);
> - // If this is a register def operand, it may end a debug value
> - // range.
> - else {
> - for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid();
> - ++AI)
> - if (ChangingRegs.test(*AI))
> - clobberRegisterUses(RegVars, *AI, DbgValues, MI);
> - }
> - } else if (MO.isRegMask()) {
> - // If this is a register mask operand, clobber all debug values in
> - // non-CSRs.
> - for (unsigned I : ChangingRegs.set_bits()) {
> - // Don't consider SP to be clobbered by register masks.
> - if (unsigned(I) != SP && TRI->isPhysicalRegister(I) &&
> - MO.clobbersPhysReg(I)) {
> - clobberRegisterUses(RegVars, I, DbgValues, MI);
> - }
> - }
> - }
> - }
> - continue;
> - }
> -
> - if (MI.isDebugValue()) {
> - assert(MI.getNumOperands() > 1 && "Invalid DBG_VALUE instruction!");
> - // Use the base variable (without any DW_OP_piece expressions)
> - // as index into History. The full variables including the
> - // piece expressions are attached to the MI.
> - const DILocalVariable *RawVar = MI.getDebugVariable();
> - assert(RawVar->isValidLocationForIntrinsic(MI.getDebugLoc()) &&
> - "Expected inlined-at fields to agree");
> - InlinedVariable Var(RawVar, MI.getDebugLoc()->getInlinedAt());
> -
> - if (unsigned PrevReg = DbgValues.getRegisterForVar(Var))
> - dropRegDescribedVar(RegVars, PrevReg, Var);
> -
> - DbgValues.startInstrRange(Var, MI);
> -
> - if (unsigned NewReg = isDescribedByReg(MI))
> - addRegDescribedVar(RegVars, NewReg, Var);
> - } else if (MI.isDebugLabel()) {
> - assert(MI.getNumOperands() == 1 && "Invalid DBG_LABEL instruction!");
> - const DILabel *RawLabel = MI.getDebugLabel();
> - assert(RawLabel->isValidLocationForIntrinsic(MI.getDebugLoc()) &&
> - "Expected inlined-at fields to agree");
> - // When collecting debug information for labels, there is no MCSymbol
> - // generated for it. So, we keep MachineInstr in DbgLabels in order
> - // to query MCSymbol afterward.
> - InlinedLabel L(RawLabel, MI.getDebugLoc()->getInlinedAt());
> - DbgLabels.addInstr(L, MI);
> - }
> - }
> -
> - // Make sure locations for register-described variables are valid only
> - // until the end of the basic block (unless it's the last basic block, in
> - // which case let their liveness run off to the end of the function).
> - if (!MBB.empty() && &MBB != &MF->back()) {
> - for (auto I = RegVars.begin(), E = RegVars.end(); I != E;) {
> - auto CurElem = I++; // CurElem can be erased below.
> - if (TRI->isVirtualRegister(CurElem->first) ||
> - ChangingRegs.test(CurElem->first))
> - clobberRegisterUses(RegVars, CurElem, DbgValues, MBB.back());
> - }
> - }
> - }
> -}
> -
> -#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
> -LLVM_DUMP_METHOD void DbgValueHistoryMap::dump() const {
> - dbgs() << "DbgValueHistoryMap:\n";
> - for (const auto &VarRangePair : *this) {
> - const InlinedVariable &Var = VarRangePair.first;
> - const InstrRanges &Ranges = VarRangePair.second;
> -
> - const DILocalVariable *LocalVar = Var.first;
> - const DILocation *Location = Var.second;
> -
> - dbgs() << " - " << LocalVar->getName() << " at ";
> -
> - if (Location)
> - dbgs() << Location->getFilename() << ":" << Location->getLine() << ":"
> - << Location->getColumn();
> - else
> - dbgs() << "<unknown location>";
> -
> - dbgs() << " --\n";
> -
> - for (const InstrRange &Range : Ranges) {
> - dbgs() << " Begin: " << *Range.first;
> - if (Range.second)
> - dbgs() << " End : " << *Range.second;
> - dbgs() << "\n";
> - }
> - }
> -}
> -#endif
>
> Removed: llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h?rev=337811&view=auto
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h (removed)
> @@ -1,88 +0,0 @@
> -//===- llvm/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h -----*- C++ -*-===//
> -//
> -// The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DBGVALUEHISTORYCALCULATOR_H
> -#define LLVM_LIB_CODEGEN_ASMPRINTER_DBGVALUEHISTORYCALCULATOR_H
> -
> -#include "llvm/ADT/MapVector.h"
> -#include "llvm/ADT/SmallVector.h"
> -#include "llvm/IR/DebugInfoMetadata.h"
> -#include <utility>
> -
> -namespace llvm {
> -
> -class DILocalVariable;
> -class MachineFunction;
> -class MachineInstr;
> -class TargetRegisterInfo;
> -
> -// For each user variable, keep a list of instruction ranges where this variable
> -// is accessible. The variables are listed in order of appearance.
> -class DbgValueHistoryMap {
> - // Each instruction range starts with a DBG_VALUE instruction, specifying the
> - // location of a variable, which is assumed to be valid until the end of the
> - // range. If end is not specified, location is valid until the start
> - // instruction of the next instruction range, or until the end of the
> - // function.
> -public:
> - using InstrRange = std::pair<const MachineInstr *, const MachineInstr *>;
> - using InstrRanges = SmallVector<InstrRange, 4>;
> - using InlinedVariable =
> - std::pair<const DILocalVariable *, const DILocation *>;
> - using InstrRangesMap = MapVector<InlinedVariable, InstrRanges>;
> -
> -private:
> - InstrRangesMap VarInstrRanges;
> -
> -public:
> - void startInstrRange(InlinedVariable Var, const MachineInstr &MI);
> - void endInstrRange(InlinedVariable Var, const MachineInstr &MI);
> -
> - // Returns register currently describing @Var. If @Var is currently
> - // unaccessible or is not described by a register, returns 0.
> - unsigned getRegisterForVar(InlinedVariable Var) const;
> -
> - bool empty() const { return VarInstrRanges.empty(); }
> - void clear() { VarInstrRanges.clear(); }
> - InstrRangesMap::const_iterator begin() const { return VarInstrRanges.begin(); }
> - InstrRangesMap::const_iterator end() const { return VarInstrRanges.end(); }
> -
> -#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
> - LLVM_DUMP_METHOD void dump() const;
> -#endif
> -};
> -
> -/// For each inlined instance of a source-level label, keep the corresponding
> -/// DBG_LABEL instruction. The DBG_LABEL instruction could be used to generate
> -/// a temporary (assembler) label before it.
> -class DbgLabelInstrMap {
> -public:
> - using InlinedLabel = std::pair<const DILabel *, const DILocation *>;
> - using InstrMap = MapVector<InlinedLabel, const MachineInstr *>;
> -
> -private:
> - InstrMap LabelInstr;
> -
> -public:
> - void addInstr(InlinedLabel Label, const MachineInstr &MI);
> -
> - bool empty() const { return LabelInstr.empty(); }
> - void clear() { LabelInstr.clear(); }
> - InstrMap::const_iterator begin() const { return LabelInstr.begin(); }
> - InstrMap::const_iterator end() const { return LabelInstr.end(); }
> -};
> -
> -void calculateDbgEntityHistory(const MachineFunction *MF,
> - const TargetRegisterInfo *TRI,
> - DbgValueHistoryMap &DbgValues,
> - DbgLabelInstrMap &DbgLabels);
> -
> -} // end namespace llvm
> -
> -#endif // LLVM_LIB_CODEGEN_ASMPRINTER_DBGVALUEHISTORYCALCULATOR_H
>
> Copied: llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp (from r337806, llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp)
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp?p2=llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp&p1=llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp&r1=337806&r2=337812&rev=337812&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp Mon Jul 23 23:17:45 2018
> @@ -1,4 +1,4 @@
> -//===- llvm/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp -------------===//
> +//===- llvm/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp --------------===//
> //
> // The LLVM Compiler Infrastructure
> //
> @@ -7,7 +7,7 @@
> //
> //===----------------------------------------------------------------------===//
>
> -#include "DbgEntityHistoryCalculator.h"
> +#include "DbgValueHistoryCalculator.h"
> #include "llvm/ADT/BitVector.h"
> #include "llvm/ADT/STLExtras.h"
> #include "llvm/ADT/SmallVector.h"
> @@ -78,17 +78,11 @@ unsigned DbgValueHistoryMap::getRegister
> return isDescribedByReg(*Ranges.back().first);
> }
>
> -void DbgLabelInstrMap::addInstr(InlinedLabel Label, const MachineInstr &MI) {
> - assert(MI.isDebugLabel() && "not a DBG_LABEL");
> - LabelInstr[Label] = &MI;
> -}
> -
> namespace {
>
> // Maps physreg numbers to the variables they describe.
> using InlinedVariable = DbgValueHistoryMap::InlinedVariable;
> using RegDescribedVarsMap = std::map<unsigned, SmallVector<InlinedVariable, 1>>;
> -using InlinedLabel = DbgLabelInstrMap::InlinedLabel;
>
> } // end anonymous namespace
>
> @@ -193,10 +187,9 @@ static void collectChangingRegs(const Ma
> }
> }
>
> -void llvm::calculateDbgEntityHistory(const MachineFunction *MF,
> - const TargetRegisterInfo *TRI,
> - DbgValueHistoryMap &DbgValues,
> - DbgLabelInstrMap &DbgLabels) {
> +void llvm::calculateDbgValueHistory(const MachineFunction *MF,
> + const TargetRegisterInfo *TRI,
> + DbgValueHistoryMap &Result) {
> BitVector ChangingRegs(TRI->getNumRegs());
> collectChangingRegs(MF, TRI, ChangingRegs);
>
> @@ -217,14 +210,14 @@ void llvm::calculateDbgEntityHistory(con
> // If this is a virtual register, only clobber it since it doesn't
> // have aliases.
> if (TRI->isVirtualRegister(MO.getReg()))
> - clobberRegisterUses(RegVars, MO.getReg(), DbgValues, MI);
> + clobberRegisterUses(RegVars, MO.getReg(), Result, MI);
> // If this is a register def operand, it may end a debug value
> // range.
> else {
> for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid();
> ++AI)
> if (ChangingRegs.test(*AI))
> - clobberRegisterUses(RegVars, *AI, DbgValues, MI);
> + clobberRegisterUses(RegVars, *AI, Result, MI);
> }
> } else if (MO.isRegMask()) {
> // If this is a register mask operand, clobber all debug values in
> @@ -233,7 +226,7 @@ void llvm::calculateDbgEntityHistory(con
> // Don't consider SP to be clobbered by register masks.
> if (unsigned(I) != SP && TRI->isPhysicalRegister(I) &&
> MO.clobbersPhysReg(I)) {
> - clobberRegisterUses(RegVars, I, DbgValues, MI);
> + clobberRegisterUses(RegVars, I, Result, MI);
> }
> }
> }
> @@ -241,34 +234,26 @@ void llvm::calculateDbgEntityHistory(con
> continue;
> }
>
> - if (MI.isDebugValue()) {
> - assert(MI.getNumOperands() > 1 && "Invalid DBG_VALUE instruction!");
> - // Use the base variable (without any DW_OP_piece expressions)
> - // as index into History. The full variables including the
> - // piece expressions are attached to the MI.
> - const DILocalVariable *RawVar = MI.getDebugVariable();
> - assert(RawVar->isValidLocationForIntrinsic(MI.getDebugLoc()) &&
> - "Expected inlined-at fields to agree");
> - InlinedVariable Var(RawVar, MI.getDebugLoc()->getInlinedAt());
> -
> - if (unsigned PrevReg = DbgValues.getRegisterForVar(Var))
> - dropRegDescribedVar(RegVars, PrevReg, Var);
> -
> - DbgValues.startInstrRange(Var, MI);
> -
> - if (unsigned NewReg = isDescribedByReg(MI))
> - addRegDescribedVar(RegVars, NewReg, Var);
> - } else if (MI.isDebugLabel()) {
> - assert(MI.getNumOperands() == 1 && "Invalid DBG_LABEL instruction!");
> - const DILabel *RawLabel = MI.getDebugLabel();
> - assert(RawLabel->isValidLocationForIntrinsic(MI.getDebugLoc()) &&
> - "Expected inlined-at fields to agree");
> - // When collecting debug information for labels, there is no MCSymbol
> - // generated for it. So, we keep MachineInstr in DbgLabels in order
> - // to query MCSymbol afterward.
> - InlinedLabel L(RawLabel, MI.getDebugLoc()->getInlinedAt());
> - DbgLabels.addInstr(L, MI);
> - }
> + // Skip DBG_LABEL instructions.
> + if (MI.isDebugLabel())
> + continue;
> +
> + assert(MI.getNumOperands() > 1 && "Invalid DBG_VALUE instruction!");
> + // Use the base variable (without any DW_OP_piece expressions)
> + // as index into History. The full variables including the
> + // piece expressions are attached to the MI.
> + const DILocalVariable *RawVar = MI.getDebugVariable();
> + assert(RawVar->isValidLocationForIntrinsic(MI.getDebugLoc()) &&
> + "Expected inlined-at fields to agree");
> + InlinedVariable Var(RawVar, MI.getDebugLoc()->getInlinedAt());
> +
> + if (unsigned PrevReg = Result.getRegisterForVar(Var))
> + dropRegDescribedVar(RegVars, PrevReg, Var);
> +
> + Result.startInstrRange(Var, MI);
> +
> + if (unsigned NewReg = isDescribedByReg(MI))
> + addRegDescribedVar(RegVars, NewReg, Var);
> }
>
> // Make sure locations for register-described variables are valid only
> @@ -279,7 +264,7 @@ void llvm::calculateDbgEntityHistory(con
> auto CurElem = I++; // CurElem can be erased below.
> if (TRI->isVirtualRegister(CurElem->first) ||
> ChangingRegs.test(CurElem->first))
> - clobberRegisterUses(RegVars, CurElem, DbgValues, MBB.back());
> + clobberRegisterUses(RegVars, CurElem, Result, MBB.back());
> }
> }
> }
>
> Copied: llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h (from r337806, llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h)
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h?p2=llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h&p1=llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h&r1=337806&r2=337812&rev=337812&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h Mon Jul 23 23:17:45 2018
> @@ -1,4 +1,4 @@
> -//===- llvm/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.h -----*- C++ -*-===//
> +//===- llvm/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h ------*- C++ -*-===//
> //
> // The LLVM Compiler Infrastructure
> //
> @@ -58,30 +58,9 @@ public:
> #endif
> };
>
> -/// For each inlined instance of a source-level label, keep the corresponding
> -/// DBG_LABEL instruction. The DBG_LABEL instruction could be used to generate
> -/// a temporary (assembler) label before it.
> -class DbgLabelInstrMap {
> -public:
> - using InlinedLabel = std::pair<const DILabel *, const DILocation *>;
> - using InstrMap = MapVector<InlinedLabel, const MachineInstr *>;
> -
> -private:
> - InstrMap LabelInstr;
> -
> -public:
> - void addInstr(InlinedLabel Label, const MachineInstr &MI);
> -
> - bool empty() const { return LabelInstr.empty(); }
> - void clear() { LabelInstr.clear(); }
> - InstrMap::const_iterator begin() const { return LabelInstr.begin(); }
> - InstrMap::const_iterator end() const { return LabelInstr.end(); }
> -};
> -
> -void calculateDbgEntityHistory(const MachineFunction *MF,
> - const TargetRegisterInfo *TRI,
> - DbgValueHistoryMap &DbgValues,
> - DbgLabelInstrMap &DbgLabels);
> +void calculateDbgValueHistory(const MachineFunction *MF,
> + const TargetRegisterInfo *TRI,
> + DbgValueHistoryMap &Result);
>
> } // end namespace llvm
>
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp?rev=337812&r1=337811&r2=337812&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp Mon Jul 23 23:17:45 2018
> @@ -190,9 +190,8 @@ void DebugHandlerBase::beginFunction(con
>
> // Calculate history for local variables.
> assert(DbgValues.empty() && "DbgValues map wasn't cleaned!");
> - assert(DbgLabels.empty() && "DbgLabels map wasn't cleaned!");
> - calculateDbgEntityHistory(MF, Asm->MF->getSubtarget().getRegisterInfo(),
> - DbgValues, DbgLabels);
> + calculateDbgValueHistory(MF, Asm->MF->getSubtarget().getRegisterInfo(),
> + DbgValues);
> LLVM_DEBUG(DbgValues.dump());
>
> // Request labels for the full history.
> @@ -230,12 +229,6 @@ void DebugHandlerBase::beginFunction(con
> }
> }
>
> - // 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);
> @@ -303,7 +296,6 @@ void DebugHandlerBase::endFunction(const
> if (hasDebugInfo(MMI, MF))
> endFunctionImpl(MF);
> DbgValues.clear();
> - DbgLabels.clear();
> LabelsBeforeInsn.clear();
> LabelsAfterInsn.clear();
> }
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.h?rev=337812&r1=337811&r2=337812&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DebugHandlerBase.h Mon Jul 23 23:17:45 2018
> @@ -16,7 +16,7 @@
> #define LLVM_LIB_CODEGEN_ASMPRINTER_DEBUGHANDLERBASE_H
>
> #include "AsmPrinterHandler.h"
> -#include "DbgEntityHistoryCalculator.h"
> +#include "DbgValueHistoryCalculator.h"
> #include "llvm/ADT/Optional.h"
> #include "llvm/CodeGen/LexicalScopes.h"
> #include "llvm/CodeGen/MachineInstr.h"
> @@ -82,9 +82,6 @@ protected:
> /// variable. Variables are listed in order of appearance.
> DbgValueHistoryMap DbgValues;
>
> - /// Mapping of inlined labels and DBG_LABEL machine instruction.
> - DbgLabelInstrMap DbgLabels;
> -
> /// Maps instruction with label emitted before instruction.
> /// FIXME: Make this private from DwarfDebug, we have the necessary accessors
> /// for it.
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=337812&r1=337811&r2=337812&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Mon Jul 23 23:17:45 2018
> @@ -502,18 +502,6 @@ DIE *DwarfCompileUnit::constructVariable
> return D;
> }
>
> -DIE *DwarfCompileUnit::constructLabelDIE(DbgLabel &DL,
> - const LexicalScope &Scope) {
> - auto LabelDie = DIE::get(DIEValueAllocator, DL.getTag());
> - insertDIE(DL.getLabel(), LabelDie);
> - DL.setDIE(*LabelDie);
> -
> - if (Scope.isAbstractScope())
> - applyLabelAttributes(DL, *LabelDie);
> -
> - return LabelDie;
> -}
> -
> DIE *DwarfCompileUnit::constructVariableDIEImpl(const DbgVariable &DV,
> bool Abstract) {
> // Define variable debug information entry.
> @@ -704,9 +692,6 @@ DIE *DwarfCompileUnit::createScopeChildr
> if (HasNonScopeChildren)
> *HasNonScopeChildren = !Children.empty();
>
> - for (DbgLabel *DL : DU->getScopeLabels().lookup(Scope))
> - Children.push_back(constructLabelDIE(*DL, *Scope));
> -
> for (LexicalScope *LS : Scope->getChildren())
> constructScopeDIE(LS, Children);
>
> @@ -832,52 +817,40 @@ void DwarfCompileUnit::finishSubprogramD
> }
> }
>
> -void DwarfCompileUnit::finishEntityDefinition(const DbgEntity *Entity) {
> - DbgEntity *AbsEntity = getExistingAbstractEntity(Entity->getEntity());
> -
> - auto *Die = Entity->getDIE();
> - /// Label may be used to generate DW_AT_low_pc, so put it outside
> - /// if/else block.
> - const DbgLabel *Label = nullptr;
> - if (AbsEntity && AbsEntity->getDIE()) {
> - addDIEEntry(*Die, dwarf::DW_AT_abstract_origin, *AbsEntity->getDIE());
> - Label = dyn_cast<const DbgLabel>(Entity);
> - } else {
> - if (const DbgVariable *Var = dyn_cast<const DbgVariable>(Entity))
> - applyVariableAttributes(*Var, *Die);
> - else if ((Label = dyn_cast<const DbgLabel>(Entity)))
> - applyLabelAttributes(*Label, *Die);
> - else
> - llvm_unreachable("DbgEntity must be DbgVariable or DbgLabel.");
> - }
> -
> - if (Label) {
> - const MCSymbol *Sym = Label->getSymbol();
> - addLabelAddress(*Die, dwarf::DW_AT_low_pc, Sym);
> - }
> -}
> -
> -DbgEntity *DwarfCompileUnit::getExistingAbstractEntity(const DINode *Node) {
> - auto &AbstractEntities = getAbstractEntities();
> - auto I = AbstractEntities.find(Node);
> - if (I != AbstractEntities.end())
> +void DwarfCompileUnit::finishVariableDefinition(const DbgVariable &Var) {
> + DbgVariable *AbsVar = getExistingAbstractVariable(
> + InlinedVariable(Var.getVariable(), Var.getInlinedAt()));
> + auto *VariableDie = Var.getDIE();
> + if (AbsVar && AbsVar->getDIE()) {
> + addDIEEntry(*VariableDie, dwarf::DW_AT_abstract_origin,
> + *AbsVar->getDIE());
> + } else
> + applyVariableAttributes(Var, *VariableDie);
> +}
> +
> +DbgVariable *DwarfCompileUnit::getExistingAbstractVariable(InlinedVariable IV) {
> + const DILocalVariable *Cleansed;
> + return getExistingAbstractVariable(IV, Cleansed);
> +}
> +
> +// Find abstract variable, if any, associated with Var.
> +DbgVariable *DwarfCompileUnit::getExistingAbstractVariable(
> + InlinedVariable IV, const DILocalVariable *&Cleansed) {
> + // More then one inlined variable corresponds to one abstract variable.
> + Cleansed = IV.first;
> + auto &AbstractVariables = getAbstractVariables();
> + auto I = AbstractVariables.find(Cleansed);
> + if (I != AbstractVariables.end())
> return I->second.get();
> return nullptr;
> }
>
> -void DwarfCompileUnit::createAbstractEntity(const DINode *Node,
> - LexicalScope *Scope) {
> +void DwarfCompileUnit::createAbstractVariable(const DILocalVariable *Var,
> + LexicalScope *Scope) {
> assert(Scope && Scope->isAbstractScope());
> - auto &Entity = getAbstractEntities()[Node];
> - if (isa<const DILocalVariable>(Node)) {
> - Entity = llvm::make_unique<DbgVariable>(
> - cast<const DILocalVariable>(Node), nullptr /* IA */);;
> - DU->addScopeVariable(Scope, cast<DbgVariable>(Entity.get()));
> - } else if (isa<const DILabel>(Node)) {
> - Entity = llvm::make_unique<DbgLabel>(
> - cast<const DILabel>(Node), nullptr /* IA */);
> - DU->addScopeLabel(Scope, cast<DbgLabel>(Entity.get()));
> - }
> + auto AbsDbgVariable = llvm::make_unique<DbgVariable>(Var, /* IA */ nullptr);
> + DU->addScopeVariable(Scope, AbsDbgVariable.get());
> + getAbstractVariables()[Var] = std::move(AbsDbgVariable);
> }
>
> void DwarfCompileUnit::emitHeader(bool UseOffsets) {
> @@ -1032,15 +1005,6 @@ void DwarfCompileUnit::applyVariableAttr
> addFlag(VariableDie, dwarf::DW_AT_artificial);
> }
>
> -void DwarfCompileUnit::applyLabelAttributes(const DbgLabel &Label,
> - DIE &LabelDie) {
> - StringRef Name = Label.getName();
> - if (!Name.empty())
> - addString(LabelDie, dwarf::DW_AT_name, Name);
> - const auto *DILabel = Label.getLabel();
> - addSourceLine(LabelDie, DILabel);
> -}
> -
> /// Add a Dwarf expression attribute data and value.
> void DwarfCompileUnit::addExpr(DIELoc &Die, dwarf::Form Form,
> const MCExpr *Expr) {
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h?rev=337812&r1=337811&r2=337812&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h Mon Jul 23 23:17:45 2018
> @@ -14,7 +14,7 @@
> #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H
> #define LLVM_LIB_CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H
>
> -#include "DbgEntityHistoryCalculator.h"
> +#include "DbgValueHistoryCalculator.h"
> #include "DwarfDebug.h"
> #include "DwarfUnit.h"
> #include "llvm/ADT/ArrayRef.h"
> @@ -81,7 +81,7 @@ class DwarfCompileUnit final : public Dw
> const MCSymbol *BaseAddress = nullptr;
>
> DenseMap<const MDNode *, DIE *> AbstractSPDies;
> - DenseMap<const DINode *, std::unique_ptr<DbgEntity>> AbstractEntities;
> + DenseMap<const MDNode *, std::unique_ptr<DbgVariable>> AbstractVariables;
>
> /// DWO ID for correlating skeleton and split units.
> uint64_t DWOId = 0;
> @@ -98,10 +98,10 @@ class DwarfCompileUnit final : public Dw
> return DU->getAbstractSPDies();
> }
>
> - DenseMap<const DINode *, std::unique_ptr<DbgEntity>> &getAbstractEntities() {
> + DenseMap<const MDNode *, std::unique_ptr<DbgVariable>> &getAbstractVariables() {
> if (isDwoUnit() && !DD->shareAcrossDWOCUs())
> - return AbstractEntities;
> - return DU->getAbstractEntities();
> + return AbstractVariables;
> + return DU->getAbstractVariables();
> }
>
> public:
> @@ -194,9 +194,6 @@ public:
> DIE *constructVariableDIE(DbgVariable &DV, const LexicalScope &Scope,
> DIE *&ObjectPointer);
>
> - /// Construct a DIE for the given DbgLabel.
> - DIE *constructLabelDIE(DbgLabel &DL, const LexicalScope &Scope);
> -
> /// A helper function to create children of a Scope DIE.
> DIE *createScopeChildrenDIE(LexicalScope *Scope,
> SmallVectorImpl<DIE *> &Children,
> @@ -213,12 +210,14 @@ public:
> DIE *constructImportedEntityDIE(const DIImportedEntity *Module);
>
> void finishSubprogramDefinition(const DISubprogram *SP);
> - void finishEntityDefinition(const DbgEntity *Entity);
> + void finishVariableDefinition(const DbgVariable &Var);
>
> /// Find abstract variable associated with Var.
> using InlinedVariable = DbgValueHistoryMap::InlinedVariable;
> - DbgEntity *getExistingAbstractEntity(const DINode *Node);
> - void createAbstractEntity(const DINode *Node, LexicalScope *Scope);
> + DbgVariable *getExistingAbstractVariable(InlinedVariable IV,
> + const DILocalVariable *&Cleansed);
> + DbgVariable *getExistingAbstractVariable(InlinedVariable IV);
> + void createAbstractVariable(const DILocalVariable *Var, LexicalScope *Scope);
>
> /// Set the skeleton unit associated with this unit.
> void setSkeleton(DwarfCompileUnit &Skel) { Skeleton = &Skel; }
> @@ -289,8 +288,6 @@ public:
> void applySubprogramAttributesToDefinition(const DISubprogram *SP,
> DIE &SPDie);
>
> - void applyLabelAttributes(const DbgLabel &Label, DIE &LabelDie);
> -
> /// getRangeLists - Get the vector of range lists.
> const SmallVectorImpl<RangeSpanList> &getRangeLists() const {
> return (Skeleton ? Skeleton : this)->CURangeLists;
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=337812&r1=337811&r2=337812&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Jul 23 23:17:45 2018
> @@ -188,12 +188,12 @@ bool DebugLocDwarfExpression::isFrameReg
> }
>
> bool DbgVariable::isBlockByrefVariable() const {
> - assert(getVariable() && "Invalid complex DbgVariable!");
> - return getVariable()->getType().resolve()->isBlockByrefStruct();
> + assert(Var && "Invalid complex DbgVariable!");
> + return Var->getType().resolve()->isBlockByrefStruct();
> }
>
> const DIType *DbgVariable::getType() const {
> - DIType *Ty = getVariable()->getType().resolve();
> + DIType *Ty = Var->getType().resolve();
> // FIXME: isBlockByrefVariable should be reformulated in terms of complex
> // addresses instead.
> if (Ty->isBlockByrefStruct()) {
> @@ -258,8 +258,8 @@ ArrayRef<DbgVariable::FrameIndexExpr> Db
> void DbgVariable::addMMIEntry(const DbgVariable &V) {
> assert(DebugLocListIndex == ~0U && !MInsn && "not an MMI entry");
> assert(V.DebugLocListIndex == ~0U && !V.MInsn && "not an MMI entry");
> - assert(V.getVariable() == getVariable() && "conflicting variable");
> - assert(V.getInlinedAt() == getInlinedAt() && "conflicting inlined-at location");
> + assert(V.Var == Var && "conflicting variable");
> + assert(V.IA == IA && "conflicting inlined-at location");
>
> assert(!FrameIndexExprs.empty() && "Expected an MMI entry");
> assert(!V.FrameIndexExprs.empty() && "Expected an MMI entry");
> @@ -726,16 +726,16 @@ void DwarfDebug::beginModule() {
> }
> }
>
> -void DwarfDebug::finishEntityDefinitions() {
> - for (const auto &Entity : ConcreteEntities) {
> - DIE *Die = Entity->getDIE();
> - assert(Die);
> +void DwarfDebug::finishVariableDefinitions() {
> + for (const auto &Var : ConcreteVariables) {
> + DIE *VariableDie = Var->getDIE();
> + assert(VariableDie);
> // FIXME: Consider the time-space tradeoff of just storing the unit pointer
> - // in the ConcreteEntities list, rather than looking it up again here.
> + // in the ConcreteVariables list, rather than looking it up again here.
> // DIE::getUnit isn't simple - it walks parent pointers, etc.
> - DwarfCompileUnit *Unit = CUDieMap.lookup(Die->getUnitDie());
> + DwarfCompileUnit *Unit = CUDieMap.lookup(VariableDie->getUnitDie());
> assert(Unit);
> - Unit->finishEntityDefinition(Entity.get());
> + Unit->finishVariableDefinition(*Var);
> }
> }
>
> @@ -753,7 +753,7 @@ void DwarfDebug::finalizeModuleInfo() {
>
> finishSubprogramDefinitions();
>
> - finishEntityDefinitions();
> + finishVariableDefinitions();
>
> // Include the DWO file name in the hash if there's more than one CU.
> // This handles ThinLTO's situation where imported CUs may very easily be
> @@ -910,24 +910,25 @@ void DwarfDebug::endModule() {
> // FIXME: AbstractVariables.clear();
> }
>
> -void DwarfDebug::ensureAbstractEntityIsCreated(DwarfCompileUnit &CU,
> - const DINode *Node,
> - const MDNode *ScopeNode) {
> - if (CU.getExistingAbstractEntity(Node))
> +void DwarfDebug::ensureAbstractVariableIsCreated(DwarfCompileUnit &CU, InlinedVariable IV,
> + const MDNode *ScopeNode) {
> + const DILocalVariable *Cleansed = nullptr;
> + if (CU.getExistingAbstractVariable(IV, Cleansed))
> return;
>
> - CU.createAbstractEntity(Node, LScopes.getOrCreateAbstractScope(
> + CU.createAbstractVariable(Cleansed, LScopes.getOrCreateAbstractScope(
> cast<DILocalScope>(ScopeNode)));
> }
>
> -void DwarfDebug::ensureAbstractEntityIsCreatedIfScoped(DwarfCompileUnit &CU,
> - const DINode *Node, const MDNode *ScopeNode) {
> - if (CU.getExistingAbstractEntity(Node))
> +void DwarfDebug::ensureAbstractVariableIsCreatedIfScoped(DwarfCompileUnit &CU,
> + InlinedVariable IV, const MDNode *ScopeNode) {
> + const DILocalVariable *Cleansed = nullptr;
> + if (CU.getExistingAbstractVariable(IV, Cleansed))
> return;
>
> if (LexicalScope *Scope =
> LScopes.findAbstractScope(cast_or_null<DILocalScope>(ScopeNode)))
> - CU.createAbstractEntity(Node, Scope);
> + CU.createAbstractVariable(Cleansed, Scope);
> }
>
> // Collect variable information from side table maintained by MF.
> @@ -948,14 +949,14 @@ void DwarfDebug::collectVariableInfoFrom
> if (!Scope)
> continue;
>
> - ensureAbstractEntityIsCreatedIfScoped(TheCU, Var.first, Scope->getScopeNode());
> + ensureAbstractVariableIsCreatedIfScoped(TheCU, Var, Scope->getScopeNode());
> auto RegVar = llvm::make_unique<DbgVariable>(Var.first, Var.second);
> RegVar->initializeMMI(VI.Expr, VI.Slot);
> if (DbgVariable *DbgVar = MFVars.lookup(Var))
> DbgVar->addMMIEntry(*RegVar);
> else if (InfoHolder.addScopeVariable(Scope, RegVar.get())) {
> MFVars.insert({Var, RegVar.get()});
> - ConcreteEntities.push_back(std::move(RegVar));
> + ConcreteVariables.push_back(std::move(RegVar));
> }
> }
> }
> @@ -1120,26 +1121,14 @@ DwarfDebug::buildLocationList(SmallVecto
> }
> }
>
> -DbgEntity *DwarfDebug::createConcreteEntity(DwarfCompileUnit &TheCU,
> - LexicalScope &Scope,
> - const DINode *Node,
> - const DILocation *Location,
> - const MCSymbol *Sym) {
> - ensureAbstractEntityIsCreatedIfScoped(TheCU, Node, Scope.getScopeNode());
> - if (isa<const DILocalVariable>(Node)) {
> - ConcreteEntities.push_back(
> - llvm::make_unique<DbgVariable>(cast<const DILocalVariable>(Node),
> - Location));
> - InfoHolder.addScopeVariable(&Scope,
> - cast<DbgVariable>(ConcreteEntities.back().get()));
> - } else if (isa<const DILabel>(Node)) {
> - ConcreteEntities.push_back(
> - llvm::make_unique<DbgLabel>(cast<const DILabel>(Node),
> - Location, Sym));
> - InfoHolder.addScopeLabel(&Scope,
> - cast<DbgLabel>(ConcreteEntities.back().get()));
> - }
> - return ConcreteEntities.back().get();
> +DbgVariable *DwarfDebug::createConcreteVariable(DwarfCompileUnit &TheCU,
> + LexicalScope &Scope,
> + InlinedVariable IV) {
> + ensureAbstractVariableIsCreatedIfScoped(TheCU, IV, Scope.getScopeNode());
> + ConcreteVariables.push_back(
> + llvm::make_unique<DbgVariable>(IV.first, IV.second));
> + InfoHolder.addScopeVariable(&Scope, ConcreteVariables.back().get());
> + return ConcreteVariables.back().get();
> }
>
> /// Determine whether a *singular* DBG_VALUE is valid for the entirety of its
> @@ -1201,9 +1190,9 @@ static bool validThroughout(LexicalScope
> }
>
> // Find variables for each lexical scope.
> -void DwarfDebug::collectEntityInfo(DwarfCompileUnit &TheCU,
> - const DISubprogram *SP,
> - DenseSet<InlinedVariable> &Processed) {
> +void DwarfDebug::collectVariableInfo(DwarfCompileUnit &TheCU,
> + const DISubprogram *SP,
> + DenseSet<InlinedVariable> &Processed) {
> // Grab the variable info that was squirreled away in the MMI side-table.
> collectVariableInfoFromMFTable(TheCU, Processed);
>
> @@ -1227,8 +1216,7 @@ void DwarfDebug::collectEntityInfo(Dwarf
> continue;
>
> Processed.insert(IV);
> - DbgVariable *RegVar = cast<DbgVariable>(createConcreteEntity(TheCU,
> - *Scope, IV.first, IV.second));
> + DbgVariable *RegVar = createConcreteVariable(TheCU, *Scope, IV);
>
> const MachineInstr *MInsn = Ranges.front().first;
> assert(MInsn->isDebugValue() && "History must begin with debug value");
> @@ -1261,44 +1249,13 @@ void DwarfDebug::collectEntityInfo(Dwarf
> Entry.finalize(*Asm, List, BT);
> }
>
> - // For each InlinedLabel collected from DBG_LABEL instructions, convert to
> - // DWARF-related DbgLabel.
> - for (const auto &I : DbgLabels) {
> - InlinedLabel IL = I.first;
> - const MachineInstr *MI = I.second;
> - if (MI == nullptr)
> - continue;
> -
> - LexicalScope *Scope = nullptr;
> - // Get inlined DILocation if it is inlined label.
> - if (const DILocation *IA = IL.second)
> - Scope = LScopes.findInlinedScope(IL.first->getScope(), IA);
> - else
> - Scope = LScopes.findLexicalScope(IL.first->getScope());
> - // If label scope is not found then skip this label.
> - if (!Scope)
> - continue;
> -
> - /// At this point, the temporary label is created.
> - /// Save the temporary label to DbgLabel entity to get the
> - /// actually address when generating Dwarf DIE.
> - MCSymbol *Sym = getLabelBeforeInsn(MI);
> - createConcreteEntity(TheCU, *Scope, IL.first, IL.second, Sym);
> - }
> -
> - // Collect info for variables/labels that were optimized out.
> + // Collect info for variables that were optimized out.
> for (const DINode *DN : SP->getRetainedNodes()) {
> - LexicalScope *Scope = nullptr;
> if (auto *DV = dyn_cast<DILocalVariable>(DN)) {
> - if (!Processed.insert(InlinedVariable(DV, nullptr)).second)
> - continue;
> - Scope = LScopes.findLexicalScope(DV->getScope());
> - } else if (auto *DL = dyn_cast<DILabel>(DN)) {
> - Scope = LScopes.findLexicalScope(DL->getScope());
> + if (Processed.insert(InlinedVariable(DV, nullptr)).second)
> + if (LexicalScope *Scope = LScopes.findLexicalScope(DV->getScope()))
> + createConcreteVariable(TheCU, *Scope, InlinedVariable(DV, nullptr));
> }
> -
> - if (Scope)
> - createConcreteEntity(TheCU, *Scope, DN, nullptr);
> }
> }
>
> @@ -1456,7 +1413,7 @@ void DwarfDebug::endFunctionImpl(const M
> DwarfCompileUnit &TheCU = *CUMap.lookup(SP->getUnit());
>
> DenseSet<InlinedVariable> ProcessedVars;
> - collectEntityInfo(TheCU, SP, ProcessedVars);
> + collectVariableInfo(TheCU, SP, ProcessedVars);
>
> // Add the range of this function to the list of ranges for the CU.
> TheCU.addRange(RangeSpan(Asm->getFunctionBegin(), Asm->getFunctionEnd()));
> @@ -1484,11 +1441,10 @@ void DwarfDebug::endFunctionImpl(const M
> // Collect info for variables that were optimized out.
> if (!ProcessedVars.insert(InlinedVariable(DV, nullptr)).second)
> continue;
> - ensureAbstractEntityIsCreated(TheCU, DV, DV->getScope());
> + ensureAbstractVariableIsCreated(TheCU, InlinedVariable(DV, nullptr),
> + DV->getScope());
> assert(LScopes.getAbstractScopesList().size() == NumAbstractScopes
> - && "ensureAbstractEntityIsCreated inserted abstract scopes");
> - } else if (auto *DL = dyn_cast<DILabel>(DN)) {
> - ensureAbstractEntityIsCreated(TheCU, DL, DL->getScope());
> + && "ensureAbstractVariableIsCreated inserted abstract scopes");
> }
> }
> constructAbstractSubprogramScopeDIE(TheCU, AScope);
> @@ -1506,7 +1462,6 @@ void DwarfDebug::endFunctionImpl(const M
> // DbgVariables except those that are also in AbstractVariables (since they
> // can be used cross-function)
> InfoHolder.getScopeVariables().clear();
> - InfoHolder.getScopeLabels().clear();
> PrevLabel = nullptr;
> CurFn = nullptr;
> }
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=337812&r1=337811&r2=337812&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Mon Jul 23 23:17:45 2018
> @@ -15,7 +15,7 @@
> #define LLVM_LIB_CODEGEN_ASMPRINTER_DWARFDEBUG_H
>
> #include "AddressPool.h"
> -#include "DbgEntityHistoryCalculator.h"
> +#include "DbgValueHistoryCalculator.h"
> #include "DebugHandlerBase.h"
> #include "DebugLocStream.h"
> #include "DwarfFile.h"
> @@ -62,46 +62,6 @@ class MDNode;
> class Module;
>
> //===----------------------------------------------------------------------===//
> -/// This class is defined as the common parent of DbgVariable and DbgLabel
> -/// such that it could levarage polymorphism to extract common code for
> -/// DbgVariable and DbgLabel.
> -class DbgEntity {
> - const DINode *Entity;
> - const DILocation *InlinedAt;
> - DIE *TheDIE = nullptr;
> - unsigned SubclassID;
> -
> -public:
> - enum DbgEntityKind {
> - DbgVariableKind,
> - DbgLabelKind
> - };
> -
> - DbgEntity(const DINode *N, const DILocation *IA, unsigned ID)
> - : Entity(N), InlinedAt(IA), SubclassID(ID) {}
> -
> - /// Accessors.
> - /// @{
> - const DINode *getEntity() const { return Entity; }
> - const DILocation *getInlinedAt() const { return InlinedAt; }
> - DIE *getDIE() const { return TheDIE; }
> - unsigned getDbgEntityID() const { return SubclassID; }
> - /// @}
> -
> - void setDIE(DIE &D) { TheDIE = &D; }
> -
> - static bool classof(const DbgEntity *N) {
> - switch (N->getDbgEntityID()) {
> - default:
> - return false;
> - case DbgVariableKind:
> - case DbgLabelKind:
> - return true;
> - }
> - }
> -};
> -
> -//===----------------------------------------------------------------------===//
> /// This class is used to track local variable information.
> ///
> /// Variables can be created from allocas, in which case they're generated from
> @@ -113,7 +73,10 @@ public:
> /// single instruction use \a MInsn and (optionally) a single entry of \a Expr.
> ///
> /// Variables that have been optimized out use none of these fields.
> -class DbgVariable : public DbgEntity {
> +class DbgVariable {
> + const DILocalVariable *Var; /// Variable Descriptor.
> + const DILocation *IA; /// Inlined at location.
> + DIE *TheDIE = nullptr; /// Variable DIE.
> unsigned DebugLocListIndex = ~0u; /// Offset in DebugLocs.
> const MachineInstr *MInsn = nullptr; /// DBG_VALUE instruction.
>
> @@ -130,7 +93,7 @@ public:
> /// Creates a variable without any DW_AT_location. Call \a initializeMMI()
> /// for MMI entries, or \a initializeDbgValue() for DBG_VALUE instructions.
> DbgVariable(const DILocalVariable *V, const DILocation *IA)
> - : DbgEntity(V, IA, DbgVariableKind) {}
> + : Var(V), IA(IA) {}
>
> /// Initialize from the MMI table.
> void initializeMMI(const DIExpression *E, int FI) {
> @@ -148,9 +111,8 @@ public:
> assert(FrameIndexExprs.empty() && "Already initialized?");
> assert(!MInsn && "Already initialized?");
>
> - assert(getVariable() == DbgValue->getDebugVariable() && "Wrong variable");
> - assert(getInlinedAt() == DbgValue->getDebugLoc()->getInlinedAt() &&
> - "Wrong inlined-at");
> + assert(Var == DbgValue->getDebugVariable() && "Wrong variable");
> + assert(IA == DbgValue->getDebugLoc()->getInlinedAt() && "Wrong inlined-at");
>
> MInsn = DbgValue;
> if (auto *E = DbgValue->getDebugExpression())
> @@ -159,18 +121,19 @@ public:
> }
>
> // Accessors.
> - const DILocalVariable *getVariable() const {
> - return cast<DILocalVariable>(getEntity());
> - }
> + const DILocalVariable *getVariable() const { return Var; }
> + const DILocation *getInlinedAt() const { return IA; }
>
> const DIExpression *getSingleExpression() const {
> assert(MInsn && FrameIndexExprs.size() <= 1);
> return FrameIndexExprs.size() ? FrameIndexExprs[0].Expr : nullptr;
> }
>
> + void setDIE(DIE &D) { TheDIE = &D; }
> + DIE *getDIE() const { return TheDIE; }
> void setDebugLocListIndex(unsigned O) { DebugLocListIndex = O; }
> unsigned getDebugLocListIndex() const { return DebugLocListIndex; }
> - StringRef getName() const { return getVariable()->getName(); }
> + StringRef getName() const { return Var->getName(); }
> const MachineInstr *getMInsn() const { return MInsn; }
> /// Get the FI entries, sorted by fragment offset.
> ArrayRef<FrameIndexExpr> getFrameIndexExprs() const;
> @@ -180,7 +143,7 @@ public:
> // Translate tag to proper Dwarf tag.
> dwarf::Tag getTag() const {
> // FIXME: Why don't we just infer this tag and store it all along?
> - if (getVariable()->isParameter())
> + if (Var->isParameter())
> return dwarf::DW_TAG_formal_parameter;
>
> return dwarf::DW_TAG_variable;
> @@ -188,7 +151,7 @@ public:
>
> /// Return true if DbgVariable is artificial.
> bool isArtificial() const {
> - if (getVariable()->isArtificial())
> + if (Var->isArtificial())
> return true;
> if (getType()->isArtificial())
> return true;
> @@ -196,7 +159,7 @@ public:
> }
>
> bool isObjectPointer() const {
> - if (getVariable()->isObjectPointer())
> + if (Var->isObjectPointer())
> return true;
> if (getType()->isObjectPointer())
> return true;
> @@ -215,45 +178,6 @@ public:
> bool isBlockByrefVariable() const;
> const DIType *getType() const;
>
> - static bool classof(const DbgEntity *N) {
> - return N->getDbgEntityID() == DbgVariableKind;
> - }
> -
> -private:
> - template <typename T> T *resolve(TypedDINodeRef<T> Ref) const {
> - return Ref.resolve();
> - }
> -};
> -
> -//===----------------------------------------------------------------------===//
> -/// This class is used to track label information.
> -///
> -/// Labels are collected from \c DBG_LABEL instructions.
> -class DbgLabel : public DbgEntity {
> - const MCSymbol *Sym; /// Symbol before DBG_LABEL instruction.
> -
> -public:
> - /// We need MCSymbol information to generate DW_AT_low_pc.
> - DbgLabel(const DILabel *L, const DILocation *IA, const MCSymbol *Sym = nullptr)
> - : DbgEntity(L, IA, DbgLabelKind), Sym(Sym) {}
> -
> - /// Accessors.
> - /// @{
> - const DILabel *getLabel() const { return cast<DILabel>(getEntity()); }
> - const MCSymbol *getSymbol() const { return Sym; }
> -
> - StringRef getName() const { return getLabel()->getName(); }
> - /// @}
> -
> - /// Translate tag to proper Dwarf tag.
> - dwarf::Tag getTag() const {
> - return dwarf::DW_TAG_label;
> - }
> -
> - static bool classof(const DbgEntity *N) {
> - return N->getDbgEntityID() == DbgLabelKind;
> - }
> -
> private:
> template <typename T> T *resolve(TypedDINodeRef<T> Ref) const {
> return Ref.resolve();
> @@ -293,8 +217,8 @@ class DwarfDebug : public DebugHandlerBa
> /// Size of each symbol emitted (for those symbols that have a specific size).
> DenseMap<const MCSymbol *, uint64_t> SymSize;
>
> - /// Collection of abstract variables/labels.
> - SmallVector<std::unique_ptr<DbgEntity>, 64> ConcreteEntities;
> + /// Collection of abstract variables.
> + SmallVector<std::unique_ptr<DbgVariable>, 64> ConcreteVariables;
>
> /// Collection of DebugLocEntry. Stored in a linked list so that DIELocLists
> /// can refer to them in spite of insertions into this list.
> @@ -409,20 +333,14 @@ class DwarfDebug : public DebugHandlerBa
> }
>
> using InlinedVariable = DbgValueHistoryMap::InlinedVariable;
> - using InlinedLabel = DbgLabelInstrMap::InlinedLabel;
>
> - void ensureAbstractEntityIsCreated(DwarfCompileUnit &CU,
> - const DINode *Node,
> - const MDNode *Scope);
> - void ensureAbstractEntityIsCreatedIfScoped(DwarfCompileUnit &CU,
> - const DINode *Node,
> - const MDNode *Scope);
> -
> - DbgEntity *createConcreteEntity(DwarfCompileUnit &TheCU,
> - LexicalScope &Scope,
> - const DINode *Node,
> - const DILocation *Location,
> - const MCSymbol *Sym = nullptr);
> + void ensureAbstractVariableIsCreated(DwarfCompileUnit &CU, InlinedVariable IV,
> + const MDNode *Scope);
> + void ensureAbstractVariableIsCreatedIfScoped(DwarfCompileUnit &CU, InlinedVariable IV,
> + const MDNode *Scope);
> +
> + DbgVariable *createConcreteVariable(DwarfCompileUnit &TheCU,
> + LexicalScope &Scope, InlinedVariable IV);
>
> /// Construct a DIE for this abstract scope.
> void constructAbstractSubprogramScopeDIE(DwarfCompileUnit &SrcCU, LexicalScope *Scope);
> @@ -431,7 +349,7 @@ class DwarfDebug : public DebugHandlerBa
> void addAccelNameImpl(AccelTable<DataT> &AppleAccel, StringRef Name,
> const DIE &Die);
>
> - void finishEntityDefinitions();
> + void finishVariableDefinitions();
>
> void finishSubprogramDefinitions();
>
> @@ -543,8 +461,8 @@ class DwarfDebug : public DebugHandlerBa
> unsigned Flags);
>
> /// Populate LexicalScope entries with variables' info.
> - void collectEntityInfo(DwarfCompileUnit &TheCU, const DISubprogram *SP,
> - DenseSet<InlinedVariable> &ProcessedVars);
> + void collectVariableInfo(DwarfCompileUnit &TheCU, const DISubprogram *SP,
> + DenseSet<InlinedVariable> &ProcessedVars);
>
> /// Build the location list for all DBG_VALUEs in the
> /// function that describe the same variable.
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp?rev=337812&r1=337811&r2=337812&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp Mon Jul 23 23:17:45 2018
> @@ -118,8 +118,3 @@ bool DwarfFile::addScopeVariable(Lexical
> }
> return true;
> }
> -
> -void DwarfFile::addScopeLabel(LexicalScope *LS, DbgLabel *Label) {
> - SmallVectorImpl<DbgLabel *> &Labels = ScopeLabels[LS];
> - Labels.push_back(Label);
> -}
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.h?rev=337812&r1=337811&r2=337812&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.h Mon Jul 23 23:17:45 2018
> @@ -24,9 +24,7 @@
> namespace llvm {
>
> class AsmPrinter;
> -class DbgEntity;
> class DbgVariable;
> -class DbgLabel;
> class DwarfCompileUnit;
> class DwarfUnit;
> class LexicalScope;
> @@ -64,13 +62,9 @@ class DwarfFile {
> /// Collection of DbgVariables of each lexical scope.
> DenseMap<LexicalScope *, ScopeVars> ScopeVariables;
>
> - /// Collection of DbgLabels of each lexical scope.
> - using LabelList = SmallVector<DbgLabel *, 4>;
> - DenseMap<LexicalScope *, LabelList> ScopeLabels;
> -
> // Collection of abstract subprogram DIEs.
> DenseMap<const MDNode *, DIE *> AbstractSPDies;
> - DenseMap<const DINode *, std::unique_ptr<DbgEntity>> AbstractEntities;
> + DenseMap<const MDNode *, std::unique_ptr<DbgVariable>> AbstractVariables
More information about the llvm-commits
mailing list