mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-19 18:24:00 +00:00
Reland 196270 "Generalize debug info / EH emission in AsmPrinter"
Addressing the existense AMDGPUAsmPrinter and other subclasses of AsmPrinter git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196288 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -22,6 +22,7 @@
|
|||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
class AsmPrinterHandler;
|
||||||
class BlockAddress;
|
class BlockAddress;
|
||||||
class GCStrategy;
|
class GCStrategy;
|
||||||
class Constant;
|
class Constant;
|
||||||
@ -110,13 +111,21 @@ namespace llvm {
|
|||||||
/// function.
|
/// function.
|
||||||
MachineLoopInfo *LI;
|
MachineLoopInfo *LI;
|
||||||
|
|
||||||
|
struct HandlerInfo {
|
||||||
|
AsmPrinterHandler *Handler;
|
||||||
|
const char *TimerName, *TimerGroupName;
|
||||||
|
HandlerInfo(AsmPrinterHandler *Handler, const char *TimerName,
|
||||||
|
const char *TimerGroupName)
|
||||||
|
: Handler(Handler), TimerName(TimerName),
|
||||||
|
TimerGroupName(TimerGroupName) {}
|
||||||
|
};
|
||||||
|
/// Handlers - a vector of all debug/EH info emitters we should use.
|
||||||
|
/// This vector maintains ownership of the emitters.
|
||||||
|
SmallVector<HandlerInfo, 1> Handlers;
|
||||||
|
|
||||||
/// DD - If the target supports dwarf debug info, this pointer is non-null.
|
/// DD - If the target supports dwarf debug info, this pointer is non-null.
|
||||||
DwarfDebug *DD;
|
DwarfDebug *DD;
|
||||||
|
|
||||||
/// DE - If the target supports dwarf exception info, this pointer is
|
|
||||||
/// non-null.
|
|
||||||
DwarfException *DE;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
explicit AsmPrinter(TargetMachine &TM, MCStreamer &Streamer);
|
explicit AsmPrinter(TargetMachine &TM, MCStreamer &Streamer);
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ void ARMException::beginFunction(const MachineFunction *MF) {
|
|||||||
|
|
||||||
/// endFunction - Gather and emit post-function exception information.
|
/// endFunction - Gather and emit post-function exception information.
|
||||||
///
|
///
|
||||||
void ARMException::endFunction() {
|
void ARMException::endFunction(const MachineFunction *) {
|
||||||
ARMTargetStreamer &ATS = getTargetStreamer();
|
ARMTargetStreamer &ATS = getTargetStreamer();
|
||||||
if (!Asm->MF->getFunction()->needsUnwindTableEntry())
|
if (!Asm->MF->getFunction()->needsUnwindTableEntry())
|
||||||
ATS.emitCantUnwind();
|
ATS.emitCantUnwind();
|
||||||
|
@ -99,14 +99,14 @@ AsmPrinter::AsmPrinter(TargetMachine &tm, MCStreamer &Streamer)
|
|||||||
OutContext(Streamer.getContext()),
|
OutContext(Streamer.getContext()),
|
||||||
OutStreamer(Streamer),
|
OutStreamer(Streamer),
|
||||||
LastMI(0), LastFn(0), Counter(~0U), SetCounter(0) {
|
LastMI(0), LastFn(0), Counter(~0U), SetCounter(0) {
|
||||||
DD = 0; DE = 0; MMI = 0; LI = 0; MF = 0;
|
DD = 0; MMI = 0; LI = 0; MF = 0;
|
||||||
CurrentFnSym = CurrentFnSymForSize = 0;
|
CurrentFnSym = CurrentFnSymForSize = 0;
|
||||||
GCMetadataPrinters = 0;
|
GCMetadataPrinters = 0;
|
||||||
VerboseAsm = Streamer.isVerboseAsm();
|
VerboseAsm = Streamer.isVerboseAsm();
|
||||||
}
|
}
|
||||||
|
|
||||||
AsmPrinter::~AsmPrinter() {
|
AsmPrinter::~AsmPrinter() {
|
||||||
assert(DD == 0 && DE == 0 && "Debug/EH info didn't get finalized");
|
assert(DD == 0 && Handlers.empty() && "Debug/EH info didn't get finalized");
|
||||||
|
|
||||||
if (GCMetadataPrinters != 0) {
|
if (GCMetadataPrinters != 0) {
|
||||||
gcp_map_type &GCMap = getGCMap(GCMetadataPrinters);
|
gcp_map_type &GCMap = getGCMap(GCMetadataPrinters);
|
||||||
@ -192,25 +192,29 @@ bool AsmPrinter::doInitialization(Module &M) {
|
|||||||
OutStreamer.AddBlankLine();
|
OutStreamer.AddBlankLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAI->doesSupportDebugInformation())
|
if (MAI->doesSupportDebugInformation()) {
|
||||||
DD = new DwarfDebug(this, &M);
|
DD = new DwarfDebug(this, &M);
|
||||||
|
Handlers.push_back(HandlerInfo(DD, DbgTimerName, DWARFGroupName));
|
||||||
|
}
|
||||||
|
|
||||||
|
DwarfException *DE = 0;
|
||||||
switch (MAI->getExceptionHandlingType()) {
|
switch (MAI->getExceptionHandlingType()) {
|
||||||
case ExceptionHandling::None:
|
case ExceptionHandling::None:
|
||||||
return false;
|
break;
|
||||||
case ExceptionHandling::SjLj:
|
case ExceptionHandling::SjLj:
|
||||||
case ExceptionHandling::DwarfCFI:
|
case ExceptionHandling::DwarfCFI:
|
||||||
DE = new DwarfCFIException(this);
|
DE = new DwarfCFIException(this);
|
||||||
return false;
|
break;
|
||||||
case ExceptionHandling::ARM:
|
case ExceptionHandling::ARM:
|
||||||
DE = new ARMException(this);
|
DE = new ARMException(this);
|
||||||
return false;
|
break;
|
||||||
case ExceptionHandling::Win64:
|
case ExceptionHandling::Win64:
|
||||||
DE = new Win64Exception(this);
|
DE = new Win64Exception(this);
|
||||||
return false;
|
break;
|
||||||
}
|
}
|
||||||
|
if (DE)
|
||||||
llvm_unreachable("Unknown exception type.");
|
Handlers.push_back(HandlerInfo(DE, EHTimerName, DWARFGroupName));
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AsmPrinter::EmitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const {
|
void AsmPrinter::EmitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const {
|
||||||
@ -311,8 +315,11 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
|
|||||||
// sections and expected to be contiguous (e.g. ObjC metadata).
|
// sections and expected to be contiguous (e.g. ObjC metadata).
|
||||||
unsigned AlignLog = getGVAlignmentLog2(GV, *DL);
|
unsigned AlignLog = getGVAlignmentLog2(GV, *DL);
|
||||||
|
|
||||||
if (DD)
|
for (unsigned I = 0, E = Handlers.size(); I != E; ++I) {
|
||||||
DD->setSymbolSize(GVSym, Size);
|
const HandlerInfo &OI = Handlers[I];
|
||||||
|
NamedRegionTimer T(OI.TimerName, OI.TimerGroupName, TimePassesIsEnabled);
|
||||||
|
OI.Handler->setSymbolSize(GVSym, Size);
|
||||||
|
}
|
||||||
|
|
||||||
// Handle common and BSS local symbols (.lcomm).
|
// Handle common and BSS local symbols (.lcomm).
|
||||||
if (GVKind.isCommon() || GVKind.isBSSLocal()) {
|
if (GVKind.isCommon() || GVKind.isBSSLocal()) {
|
||||||
@ -482,13 +489,10 @@ void AsmPrinter::EmitFunctionHeader() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Emit pre-function debug and/or EH information.
|
// Emit pre-function debug and/or EH information.
|
||||||
if (DE) {
|
for (unsigned I = 0, E = Handlers.size(); I != E; ++I) {
|
||||||
NamedRegionTimer T(EHTimerName, DWARFGroupName, TimePassesIsEnabled);
|
const HandlerInfo &OI = Handlers[I];
|
||||||
DE->beginFunction(MF);
|
NamedRegionTimer T(OI.TimerName, OI.TimerGroupName, TimePassesIsEnabled);
|
||||||
}
|
OI.Handler->beginFunction(MF);
|
||||||
if (DD) {
|
|
||||||
NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
|
|
||||||
DD->beginFunction(MF);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emit the prefix data.
|
// Emit the prefix data.
|
||||||
@ -693,7 +697,7 @@ void AsmPrinter::EmitFunctionBody() {
|
|||||||
// Emit target-specific gunk before the function body.
|
// Emit target-specific gunk before the function body.
|
||||||
EmitFunctionBodyStart();
|
EmitFunctionBodyStart();
|
||||||
|
|
||||||
bool ShouldPrintDebugScopes = DD && MMI->hasDebugInfo();
|
bool ShouldPrintDebugScopes = MMI->hasDebugInfo();
|
||||||
|
|
||||||
// Print out code for the function.
|
// Print out code for the function.
|
||||||
bool HasAnyRealCode = false;
|
bool HasAnyRealCode = false;
|
||||||
@ -714,8 +718,12 @@ void AsmPrinter::EmitFunctionBody() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ShouldPrintDebugScopes) {
|
if (ShouldPrintDebugScopes) {
|
||||||
NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
|
for (unsigned III = 0, EEE = Handlers.size(); III != EEE; ++III) {
|
||||||
DD->beginInstruction(II);
|
const HandlerInfo &OI = Handlers[III];
|
||||||
|
NamedRegionTimer T(OI.TimerName, OI.TimerGroupName,
|
||||||
|
TimePassesIsEnabled);
|
||||||
|
OI.Handler->beginInstruction(II);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isVerbose())
|
if (isVerbose())
|
||||||
@ -754,8 +762,12 @@ void AsmPrinter::EmitFunctionBody() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ShouldPrintDebugScopes) {
|
if (ShouldPrintDebugScopes) {
|
||||||
NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
|
for (unsigned III = 0, EEE = Handlers.size(); III != EEE; ++III) {
|
||||||
DD->endInstruction(II);
|
const HandlerInfo &OI = Handlers[III];
|
||||||
|
NamedRegionTimer T(OI.TimerName, OI.TimerGroupName,
|
||||||
|
TimePassesIsEnabled);
|
||||||
|
OI.Handler->endInstruction();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -811,14 +823,11 @@ void AsmPrinter::EmitFunctionBody() {
|
|||||||
OutStreamer.EmitELFSize(CurrentFnSym, SizeExp);
|
OutStreamer.EmitELFSize(CurrentFnSym, SizeExp);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emit post-function debug information.
|
// Emit post-function debug and/or EH information.
|
||||||
if (DD) {
|
for (unsigned I = 0, E = Handlers.size(); I != E; ++I) {
|
||||||
NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
|
const HandlerInfo &OI = Handlers[I];
|
||||||
DD->endFunction(MF);
|
NamedRegionTimer T(OI.TimerName, OI.TimerGroupName, TimePassesIsEnabled);
|
||||||
}
|
OI.Handler->endFunction(MF);
|
||||||
if (DE) {
|
|
||||||
NamedRegionTimer T(EHTimerName, DWARFGroupName, TimePassesIsEnabled);
|
|
||||||
DE->endFunction();
|
|
||||||
}
|
}
|
||||||
MMI->EndFunction();
|
MMI->EndFunction();
|
||||||
|
|
||||||
@ -907,20 +916,15 @@ bool AsmPrinter::doFinalization(Module &M) {
|
|||||||
OutStreamer.Flush();
|
OutStreamer.Flush();
|
||||||
|
|
||||||
// Finalize debug and EH information.
|
// Finalize debug and EH information.
|
||||||
if (DE) {
|
for (unsigned I = 0, E = Handlers.size(); I != E; ++I) {
|
||||||
{
|
const HandlerInfo &OI = Handlers[I];
|
||||||
NamedRegionTimer T(EHTimerName, DWARFGroupName, TimePassesIsEnabled);
|
NamedRegionTimer T(OI.TimerName, OI.TimerGroupName,
|
||||||
DE->endModule();
|
TimePassesIsEnabled);
|
||||||
}
|
OI.Handler->endModule();
|
||||||
delete DE; DE = 0;
|
delete OI.Handler;
|
||||||
}
|
|
||||||
if (DD) {
|
|
||||||
{
|
|
||||||
NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
|
|
||||||
DD->endModule();
|
|
||||||
}
|
|
||||||
delete DD; DD = 0;
|
|
||||||
}
|
}
|
||||||
|
Handlers.clear();
|
||||||
|
DD = 0;
|
||||||
|
|
||||||
// If the target wants to know about weak references, print them all.
|
// If the target wants to know about weak references, print them all.
|
||||||
if (MAI->getWeakRefDirective()) {
|
if (MAI->getWeakRefDirective()) {
|
||||||
|
56
lib/CodeGen/AsmPrinter/AsmPrinterHandler.h
Normal file
56
lib/CodeGen/AsmPrinter/AsmPrinterHandler.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
//===-- lib/CodeGen/AsmPrinter/AsmPrinterHandler.h -------------*- C++ -*--===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file contains a generic interface for AsmPrinter handlers,
|
||||||
|
// like debug and EH info emitters.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef CODEGEN_ASMPRINTER_ASMPRINTERHANDLER_H__
|
||||||
|
#define CODEGEN_ASMPRINTER_ASMPRINTERHANDLER_H__
|
||||||
|
|
||||||
|
#include "llvm/Support/DataTypes.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
|
||||||
|
class MachineFunction;
|
||||||
|
class MachineInstr;
|
||||||
|
class MCSymbol;
|
||||||
|
|
||||||
|
/// \brief Collects and handles AsmPrinter objects required to build debug
|
||||||
|
/// or EH information.
|
||||||
|
class AsmPrinterHandler {
|
||||||
|
public:
|
||||||
|
virtual ~AsmPrinterHandler() {}
|
||||||
|
|
||||||
|
/// \brief For symbols that have a size designated (e.g. common symbols),
|
||||||
|
/// this tracks that size.
|
||||||
|
virtual void setSymbolSize(const MCSymbol *Sym, uint64_t Size) = 0;
|
||||||
|
|
||||||
|
/// \brief Emit all sections that should come after the content.
|
||||||
|
virtual void endModule() = 0;
|
||||||
|
|
||||||
|
/// \brief Gather pre-function debug information.
|
||||||
|
/// Every beginFunction(MF) call should be followed by an endFunction(MF) call.
|
||||||
|
virtual void beginFunction(const MachineFunction *MF) = 0;
|
||||||
|
|
||||||
|
/// \brief Gather post-function debug information.
|
||||||
|
/// Please note that some AsmPrinter implementationss may not call
|
||||||
|
/// beginFunction at all.
|
||||||
|
virtual void endFunction(const MachineFunction *MF) = 0;
|
||||||
|
|
||||||
|
/// \brief Process beginning of an instruction.
|
||||||
|
virtual void beginInstruction(const MachineInstr *MI) = 0;
|
||||||
|
|
||||||
|
/// \brief Process end of an instruction.
|
||||||
|
virtual void endInstruction() = 0;
|
||||||
|
};
|
||||||
|
} // End of namespace llvm
|
||||||
|
|
||||||
|
#endif
|
@ -390,7 +390,9 @@ unsigned DIEEntry::getRefAddrSize(AsmPrinter *AP) {
|
|||||||
// specified to be four bytes in the DWARF 32-bit format and eight bytes
|
// specified to be four bytes in the DWARF 32-bit format and eight bytes
|
||||||
// in the DWARF 64-bit format, while DWARF Version 2 specifies that such
|
// in the DWARF 64-bit format, while DWARF Version 2 specifies that such
|
||||||
// references have the same size as an address on the target system.
|
// references have the same size as an address on the target system.
|
||||||
if (AP->getDwarfDebug()->getDwarfVersion() == 2)
|
const DwarfDebug *DD = AP->getDwarfDebug();
|
||||||
|
assert(DD && "Expected Dwarf Debug info to be available");
|
||||||
|
if (DD->getDwarfVersion() == 2)
|
||||||
return AP->getDataLayout().getPointerSize();
|
return AP->getDataLayout().getPointerSize();
|
||||||
return sizeof(int32_t);
|
return sizeof(int32_t);
|
||||||
}
|
}
|
||||||
|
@ -137,7 +137,7 @@ void DwarfCFIException::beginFunction(const MachineFunction *MF) {
|
|||||||
|
|
||||||
/// endFunction - Gather and emit post-function exception information.
|
/// endFunction - Gather and emit post-function exception information.
|
||||||
///
|
///
|
||||||
void DwarfCFIException::endFunction() {
|
void DwarfCFIException::endFunction(const MachineFunction *) {
|
||||||
if (!shouldEmitPersonality && !shouldEmitMoves)
|
if (!shouldEmitPersonality && !shouldEmitMoves)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -197,6 +197,7 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
|
|||||||
DwarfAddrSectionSym = 0;
|
DwarfAddrSectionSym = 0;
|
||||||
DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
|
DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
|
||||||
FunctionBeginSym = FunctionEndSym = 0;
|
FunctionBeginSym = FunctionEndSym = 0;
|
||||||
|
CurFn = 0; CurMI = 0;
|
||||||
|
|
||||||
// Turn on accelerator tables for Darwin by default, pubnames by
|
// Turn on accelerator tables for Darwin by default, pubnames by
|
||||||
// default for non-Darwin, and handle split dwarf.
|
// default for non-Darwin, and handle split dwarf.
|
||||||
@ -1144,6 +1145,8 @@ void DwarfDebug::endSections() {
|
|||||||
|
|
||||||
// Emit all Dwarf sections that should come after the content.
|
// Emit all Dwarf sections that should come after the content.
|
||||||
void DwarfDebug::endModule() {
|
void DwarfDebug::endModule() {
|
||||||
|
assert(CurFn == 0);
|
||||||
|
assert(CurMI == 0);
|
||||||
|
|
||||||
if (!FirstCU)
|
if (!FirstCU)
|
||||||
return;
|
return;
|
||||||
@ -1225,8 +1228,7 @@ DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If Var is a current function argument then add it to CurrentFnArguments list.
|
// If Var is a current function argument then add it to CurrentFnArguments list.
|
||||||
bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
|
bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope) {
|
||||||
DbgVariable *Var, LexicalScope *Scope) {
|
|
||||||
if (!LScopes.isCurrentFunctionScope(Scope))
|
if (!LScopes.isCurrentFunctionScope(Scope))
|
||||||
return false;
|
return false;
|
||||||
DIVariable DV = Var->getVariable();
|
DIVariable DV = Var->getVariable();
|
||||||
@ -1238,7 +1240,7 @@ bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
|
|||||||
|
|
||||||
size_t Size = CurrentFnArguments.size();
|
size_t Size = CurrentFnArguments.size();
|
||||||
if (Size == 0)
|
if (Size == 0)
|
||||||
CurrentFnArguments.resize(MF->getFunction()->arg_size());
|
CurrentFnArguments.resize(CurFn->getFunction()->arg_size());
|
||||||
// llvm::Function argument size is not good indicator of how many
|
// llvm::Function argument size is not good indicator of how many
|
||||||
// arguments does the function have at source level.
|
// arguments does the function have at source level.
|
||||||
if (ArgNo > Size)
|
if (ArgNo > Size)
|
||||||
@ -1249,7 +1251,7 @@ bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
|
|||||||
|
|
||||||
// Collect variable information from side table maintained by MMI.
|
// Collect variable information from side table maintained by MMI.
|
||||||
void DwarfDebug::collectVariableInfoFromMMITable(
|
void DwarfDebug::collectVariableInfoFromMMITable(
|
||||||
const MachineFunction *MF, SmallPtrSet<const MDNode *, 16> &Processed) {
|
SmallPtrSet<const MDNode *, 16> &Processed) {
|
||||||
MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
|
MachineModuleInfo::VariableDbgInfoMapTy &VMap = MMI->getVariableDbgInfo();
|
||||||
for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
|
for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI = VMap.begin(),
|
||||||
VE = VMap.end();
|
VE = VMap.end();
|
||||||
@ -1270,7 +1272,7 @@ void DwarfDebug::collectVariableInfoFromMMITable(
|
|||||||
DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
|
DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
|
||||||
DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable, this);
|
DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable, this);
|
||||||
RegVar->setFrameIndex(VP.first);
|
RegVar->setFrameIndex(VP.first);
|
||||||
if (!addCurrentFnArgument(MF, RegVar, Scope))
|
if (!addCurrentFnArgument(RegVar, Scope))
|
||||||
addScopeVariable(Scope, RegVar);
|
addScopeVariable(Scope, RegVar);
|
||||||
if (AbsDbgVariable)
|
if (AbsDbgVariable)
|
||||||
AbsDbgVariable->setFrameIndex(VP.first);
|
AbsDbgVariable->setFrameIndex(VP.first);
|
||||||
@ -1317,11 +1319,10 @@ static DotDebugLocEntry getDebugLocEntry(AsmPrinter *Asm,
|
|||||||
|
|
||||||
// Find variables for each lexical scope.
|
// Find variables for each lexical scope.
|
||||||
void
|
void
|
||||||
DwarfDebug::collectVariableInfo(const MachineFunction *MF,
|
DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) {
|
||||||
SmallPtrSet<const MDNode *, 16> &Processed) {
|
|
||||||
|
|
||||||
// Grab the variable info that was squirreled away in the MMI side-table.
|
// Grab the variable info that was squirreled away in the MMI side-table.
|
||||||
collectVariableInfoFromMMITable(MF, Processed);
|
collectVariableInfoFromMMITable(Processed);
|
||||||
|
|
||||||
for (SmallVectorImpl<const MDNode *>::const_iterator
|
for (SmallVectorImpl<const MDNode *>::const_iterator
|
||||||
UVI = UserVariables.begin(),
|
UVI = UserVariables.begin(),
|
||||||
@ -1341,7 +1342,7 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,
|
|||||||
DIVariable DV(Var);
|
DIVariable DV(Var);
|
||||||
LexicalScope *Scope = NULL;
|
LexicalScope *Scope = NULL;
|
||||||
if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
|
if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
|
||||||
DISubprogram(DV.getContext()).describes(MF->getFunction()))
|
DISubprogram(DV.getContext()).describes(CurFn->getFunction()))
|
||||||
Scope = LScopes.getCurrentFunctionScope();
|
Scope = LScopes.getCurrentFunctionScope();
|
||||||
else if (MDNode *IA = DV.getInlinedAt())
|
else if (MDNode *IA = DV.getInlinedAt())
|
||||||
Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
|
Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
|
||||||
@ -1355,7 +1356,7 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,
|
|||||||
assert(MInsn->isDebugValue() && "History must begin with debug value");
|
assert(MInsn->isDebugValue() && "History must begin with debug value");
|
||||||
DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
|
DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
|
||||||
DbgVariable *RegVar = new DbgVariable(DV, AbsVar, this);
|
DbgVariable *RegVar = new DbgVariable(DV, AbsVar, this);
|
||||||
if (!addCurrentFnArgument(MF, RegVar, Scope))
|
if (!addCurrentFnArgument(RegVar, Scope))
|
||||||
addScopeVariable(Scope, RegVar);
|
addScopeVariable(Scope, RegVar);
|
||||||
if (AbsVar)
|
if (AbsVar)
|
||||||
AbsVar->setMInsn(MInsn);
|
AbsVar->setMInsn(MInsn);
|
||||||
@ -1437,6 +1438,8 @@ MCSymbol *DwarfDebug::getLabelAfterInsn(const MachineInstr *MI) {
|
|||||||
|
|
||||||
// Process beginning of an instruction.
|
// Process beginning of an instruction.
|
||||||
void DwarfDebug::beginInstruction(const MachineInstr *MI) {
|
void DwarfDebug::beginInstruction(const MachineInstr *MI) {
|
||||||
|
assert(CurMI == 0);
|
||||||
|
CurMI = MI;
|
||||||
// Check if source location changes, but ignore DBG_VALUE locations.
|
// Check if source location changes, but ignore DBG_VALUE locations.
|
||||||
if (!MI->isDebugValue()) {
|
if (!MI->isDebugValue()) {
|
||||||
DebugLoc DL = MI->getDebugLoc();
|
DebugLoc DL = MI->getDebugLoc();
|
||||||
@ -1478,14 +1481,16 @@ void DwarfDebug::beginInstruction(const MachineInstr *MI) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Process end of an instruction.
|
// Process end of an instruction.
|
||||||
void DwarfDebug::endInstruction(const MachineInstr *MI) {
|
void DwarfDebug::endInstruction() {
|
||||||
|
assert(CurMI != 0);
|
||||||
// Don't create a new label after DBG_VALUE instructions.
|
// Don't create a new label after DBG_VALUE instructions.
|
||||||
// They don't generate code.
|
// They don't generate code.
|
||||||
if (!MI->isDebugValue())
|
if (!CurMI->isDebugValue())
|
||||||
PrevLabel = 0;
|
PrevLabel = 0;
|
||||||
|
|
||||||
DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
|
DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
|
||||||
LabelsAfterInsn.find(MI);
|
LabelsAfterInsn.find(CurMI);
|
||||||
|
CurMI = 0;
|
||||||
|
|
||||||
// No label needed.
|
// No label needed.
|
||||||
if (I == LabelsAfterInsn.end())
|
if (I == LabelsAfterInsn.end())
|
||||||
@ -1565,6 +1570,7 @@ static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
|
|||||||
// Gather pre-function debug information. Assumes being called immediately
|
// Gather pre-function debug information. Assumes being called immediately
|
||||||
// after the function entry point has been emitted.
|
// after the function entry point has been emitted.
|
||||||
void DwarfDebug::beginFunction(const MachineFunction *MF) {
|
void DwarfDebug::beginFunction(const MachineFunction *MF) {
|
||||||
|
CurFn = MF;
|
||||||
|
|
||||||
// If there's no debug info for the function we're not going to do anything.
|
// If there's no debug info for the function we're not going to do anything.
|
||||||
if (!MMI->hasDebugInfo())
|
if (!MMI->hasDebugInfo())
|
||||||
@ -1792,8 +1798,19 @@ void DwarfDebug::addScopeVariable(LexicalScope *LS, DbgVariable *Var) {
|
|||||||
|
|
||||||
// Gather and emit post-function debug information.
|
// Gather and emit post-function debug information.
|
||||||
void DwarfDebug::endFunction(const MachineFunction *MF) {
|
void DwarfDebug::endFunction(const MachineFunction *MF) {
|
||||||
if (!MMI->hasDebugInfo() || LScopes.empty())
|
// Every beginFunction(MF) call should be followed by an endFunction(MF) call,
|
||||||
|
// though the beginFunction may not be called at all.
|
||||||
|
// We should handle both cases.
|
||||||
|
if (CurFn == 0)
|
||||||
|
CurFn = MF;
|
||||||
|
else
|
||||||
|
assert(CurFn == MF);
|
||||||
|
assert(CurFn != 0);
|
||||||
|
|
||||||
|
if (!MMI->hasDebugInfo() || LScopes.empty()) {
|
||||||
|
CurFn = 0;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Define end label for subprogram.
|
// Define end label for subprogram.
|
||||||
FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber());
|
FunctionEndSym = Asm->GetTempSymbol("func_end", Asm->getFunctionNumber());
|
||||||
@ -1803,7 +1820,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
|
|||||||
Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
|
Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
|
||||||
|
|
||||||
SmallPtrSet<const MDNode *, 16> ProcessedVars;
|
SmallPtrSet<const MDNode *, 16> ProcessedVars;
|
||||||
collectVariableInfo(MF, ProcessedVars);
|
collectVariableInfo(ProcessedVars);
|
||||||
|
|
||||||
LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
|
LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
|
||||||
CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
|
CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
|
||||||
@ -1837,7 +1854,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
|
|||||||
|
|
||||||
DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
|
DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
|
||||||
|
|
||||||
if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
|
if (!CurFn->getTarget().Options.DisableFramePointerElim(*CurFn))
|
||||||
TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
|
TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
|
||||||
|
|
||||||
// Clear debug info
|
// Clear debug info
|
||||||
@ -1853,6 +1870,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
|
|||||||
LabelsBeforeInsn.clear();
|
LabelsBeforeInsn.clear();
|
||||||
LabelsAfterInsn.clear();
|
LabelsAfterInsn.clear();
|
||||||
PrevLabel = NULL;
|
PrevLabel = NULL;
|
||||||
|
CurFn = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register a source line with debug info. Returns the unique label that was
|
// Register a source line with debug info. Returns the unique label that was
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#ifndef CODEGEN_ASMPRINTER_DWARFDEBUG_H__
|
#ifndef CODEGEN_ASMPRINTER_DWARFDEBUG_H__
|
||||||
#define CODEGEN_ASMPRINTER_DWARFDEBUG_H__
|
#define CODEGEN_ASMPRINTER_DWARFDEBUG_H__
|
||||||
|
|
||||||
|
#include "AsmPrinterHandler.h"
|
||||||
#include "DIE.h"
|
#include "DIE.h"
|
||||||
#include "llvm/ADT/DenseMap.h"
|
#include "llvm/ADT/DenseMap.h"
|
||||||
#include "llvm/ADT/FoldingSet.h"
|
#include "llvm/ADT/FoldingSet.h"
|
||||||
@ -316,7 +317,7 @@ struct SymbolCU {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/// \brief Collects and handles dwarf debug information.
|
/// \brief Collects and handles dwarf debug information.
|
||||||
class DwarfDebug {
|
class DwarfDebug : public AsmPrinterHandler {
|
||||||
// Target of Dwarf emission.
|
// Target of Dwarf emission.
|
||||||
AsmPrinter *Asm;
|
AsmPrinter *Asm;
|
||||||
|
|
||||||
@ -418,6 +419,12 @@ class DwarfDebug {
|
|||||||
// body.
|
// body.
|
||||||
DebugLoc PrologEndLoc;
|
DebugLoc PrologEndLoc;
|
||||||
|
|
||||||
|
// If nonnull, stores the current machine function we're processing.
|
||||||
|
const MachineFunction *CurFn;
|
||||||
|
|
||||||
|
// If nonnull, stores the current machine instruction we're processing.
|
||||||
|
const MachineInstr *CurMI;
|
||||||
|
|
||||||
// Section Symbols: these are assembler temporary labels that are emitted at
|
// Section Symbols: these are assembler temporary labels that are emitted at
|
||||||
// the beginning of each supported dwarf section. These are used to form
|
// the beginning of each supported dwarf section. These are used to form
|
||||||
// section offsets and are created by EmitSectionLabels.
|
// section offsets and are created by EmitSectionLabels.
|
||||||
@ -648,17 +655,14 @@ class DwarfDebug {
|
|||||||
|
|
||||||
/// \brief If Var is an current function argument that add it in
|
/// \brief If Var is an current function argument that add it in
|
||||||
/// CurrentFnArguments list.
|
/// CurrentFnArguments list.
|
||||||
bool addCurrentFnArgument(const MachineFunction *MF,
|
bool addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope);
|
||||||
DbgVariable *Var, LexicalScope *Scope);
|
|
||||||
|
|
||||||
/// \brief Populate LexicalScope entries with variables' info.
|
/// \brief Populate LexicalScope entries with variables' info.
|
||||||
void collectVariableInfo(const MachineFunction *,
|
void collectVariableInfo(SmallPtrSet<const MDNode *, 16> &ProcessedVars);
|
||||||
SmallPtrSet<const MDNode *, 16> &ProcessedVars);
|
|
||||||
|
|
||||||
/// \brief Collect variable information from the side table maintained
|
/// \brief Collect variable information from the side table maintained
|
||||||
/// by MMI.
|
/// by MMI.
|
||||||
void collectVariableInfoFromMMITable(const MachineFunction * MF,
|
void collectVariableInfoFromMMITable(SmallPtrSet<const MDNode *, 16> &P);
|
||||||
SmallPtrSet<const MDNode *, 16> &P);
|
|
||||||
|
|
||||||
/// \brief Ensure that a label will be emitted before MI.
|
/// \brief Ensure that a label will be emitted before MI.
|
||||||
void requestLabelBeforeInsn(const MachineInstr *MI) {
|
void requestLabelBeforeInsn(const MachineInstr *MI) {
|
||||||
@ -706,7 +710,7 @@ public:
|
|||||||
void beginInstruction(const MachineInstr *MI);
|
void beginInstruction(const MachineInstr *MI);
|
||||||
|
|
||||||
/// \brief Process end of an instruction.
|
/// \brief Process end of an instruction.
|
||||||
void endInstruction(const MachineInstr *MI);
|
void endInstruction();
|
||||||
|
|
||||||
/// \brief Add a DIE to the set of types that we're going to pull into
|
/// \brief Add a DIE to the set of types that we're going to pull into
|
||||||
/// type units.
|
/// type units.
|
||||||
|
@ -730,7 +730,6 @@ void DwarfException::beginFunction(const MachineFunction *MF) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// endFunction - Gather and emit post-function exception information.
|
/// endFunction - Gather and emit post-function exception information.
|
||||||
///
|
void DwarfException::endFunction(const MachineFunction *) {
|
||||||
void DwarfException::endFunction() {
|
|
||||||
llvm_unreachable("Should be implemented");
|
llvm_unreachable("Should be implemented");
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#ifndef LLVM_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H
|
#ifndef LLVM_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H
|
||||||
#define LLVM_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H
|
#define LLVM_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H
|
||||||
|
|
||||||
|
#include "AsmPrinterHandler.h"
|
||||||
#include "llvm/ADT/DenseMap.h"
|
#include "llvm/ADT/DenseMap.h"
|
||||||
#include "llvm/CodeGen/AsmPrinter.h"
|
#include "llvm/CodeGen/AsmPrinter.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -35,7 +36,7 @@ class AsmPrinter;
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
/// DwarfException - Emits Dwarf exception handling directives.
|
/// DwarfException - Emits Dwarf exception handling directives.
|
||||||
///
|
///
|
||||||
class DwarfException {
|
class DwarfException : public AsmPrinterHandler {
|
||||||
protected:
|
protected:
|
||||||
/// Asm - Target of Dwarf emission.
|
/// Asm - Target of Dwarf emission.
|
||||||
AsmPrinter *Asm;
|
AsmPrinter *Asm;
|
||||||
@ -139,7 +140,12 @@ public:
|
|||||||
virtual void beginFunction(const MachineFunction *MF);
|
virtual void beginFunction(const MachineFunction *MF);
|
||||||
|
|
||||||
/// endFunction - Gather and emit post-function exception information.
|
/// endFunction - Gather and emit post-function exception information.
|
||||||
virtual void endFunction();
|
virtual void endFunction(const MachineFunction *);
|
||||||
|
|
||||||
|
// We don't need these.
|
||||||
|
virtual void setSymbolSize(const MCSymbol *Sym, uint64_t Size) {}
|
||||||
|
virtual void beginInstruction(const MachineInstr *MI) {}
|
||||||
|
virtual void endInstruction() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class DwarfCFIException : public DwarfException {
|
class DwarfCFIException : public DwarfException {
|
||||||
@ -173,7 +179,7 @@ public:
|
|||||||
virtual void beginFunction(const MachineFunction *MF);
|
virtual void beginFunction(const MachineFunction *MF);
|
||||||
|
|
||||||
/// endFunction - Gather and emit post-function exception information.
|
/// endFunction - Gather and emit post-function exception information.
|
||||||
virtual void endFunction();
|
virtual void endFunction(const MachineFunction *);
|
||||||
};
|
};
|
||||||
|
|
||||||
class ARMException : public DwarfException {
|
class ARMException : public DwarfException {
|
||||||
@ -196,7 +202,7 @@ public:
|
|||||||
virtual void beginFunction(const MachineFunction *MF);
|
virtual void beginFunction(const MachineFunction *MF);
|
||||||
|
|
||||||
/// endFunction - Gather and emit post-function exception information.
|
/// endFunction - Gather and emit post-function exception information.
|
||||||
virtual void endFunction();
|
virtual void endFunction(const MachineFunction *);
|
||||||
};
|
};
|
||||||
|
|
||||||
class Win64Exception : public DwarfException {
|
class Win64Exception : public DwarfException {
|
||||||
@ -228,7 +234,7 @@ public:
|
|||||||
virtual void beginFunction(const MachineFunction *MF);
|
virtual void beginFunction(const MachineFunction *MF);
|
||||||
|
|
||||||
/// endFunction - Gather and emit post-function exception information.
|
/// endFunction - Gather and emit post-function exception information.
|
||||||
virtual void endFunction();
|
virtual void endFunction(const MachineFunction *);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // End of namespace llvm
|
} // End of namespace llvm
|
||||||
|
@ -88,7 +88,7 @@ void Win64Exception::beginFunction(const MachineFunction *MF) {
|
|||||||
|
|
||||||
/// endFunction - Gather and emit post-function exception information.
|
/// endFunction - Gather and emit post-function exception information.
|
||||||
///
|
///
|
||||||
void Win64Exception::endFunction() {
|
void Win64Exception::endFunction(const MachineFunction *) {
|
||||||
if (!shouldEmitPersonality && !shouldEmitMoves)
|
if (!shouldEmitPersonality && !shouldEmitMoves)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user