mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-17 15:38:40 +00:00
Validate dbg_* intrinsics before lowering them.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62286 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fa9c5eac33
commit
cf3a4487c0
@ -29,6 +29,7 @@ class DwarfDebug;
|
|||||||
class DwarfException;
|
class DwarfException;
|
||||||
class MachineModuleInfo;
|
class MachineModuleInfo;
|
||||||
class MachineFunction;
|
class MachineFunction;
|
||||||
|
class Value;
|
||||||
class Module;
|
class Module;
|
||||||
class GlobalVariable;
|
class GlobalVariable;
|
||||||
class TargetAsmInfo;
|
class TargetAsmInfo;
|
||||||
@ -75,6 +76,8 @@ public:
|
|||||||
///
|
///
|
||||||
void EndFunction(MachineFunction *MF);
|
void EndFunction(MachineFunction *MF);
|
||||||
|
|
||||||
|
/// ValidDebugInfo - Return true if V represents valid debug info value.
|
||||||
|
bool ValidDebugInfo(Value *V);
|
||||||
|
|
||||||
/// label. Returns a unique label ID used to generate a label and provide
|
/// label. Returns a unique label ID used to generate a label and provide
|
||||||
/// correspondence to the source line list.
|
/// correspondence to the source line list.
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "llvm/ADT/UniqueVector.h"
|
#include "llvm/ADT/UniqueVector.h"
|
||||||
#include "llvm/Module.h"
|
#include "llvm/Module.h"
|
||||||
#include "llvm/DerivedTypes.h"
|
#include "llvm/DerivedTypes.h"
|
||||||
|
#include "llvm/Constants.h"
|
||||||
#include "llvm/CodeGen/AsmPrinter.h"
|
#include "llvm/CodeGen/AsmPrinter.h"
|
||||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||||
@ -100,6 +101,25 @@ getGlobalVariablesUsing(Module &M, const std::string &RootName,
|
|||||||
getGlobalVariablesUsing(UseRoot, Result);
|
getGlobalVariablesUsing(UseRoot, Result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// getGlobalVariable - Return either a direct or cast Global value.
|
||||||
|
///
|
||||||
|
static GlobalVariable *getGlobalVariable(Value *V) {
|
||||||
|
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) {
|
||||||
|
return GV;
|
||||||
|
} else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) {
|
||||||
|
if (CE->getOpcode() == Instruction::BitCast) {
|
||||||
|
return dyn_cast<GlobalVariable>(CE->getOperand(0));
|
||||||
|
} else if (CE->getOpcode() == Instruction::GetElementPtr) {
|
||||||
|
for (unsigned int i=1; i<CE->getNumOperands(); i++) {
|
||||||
|
if (!CE->getOperand(i)->isNullValue())
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return dyn_cast<GlobalVariable>(CE->getOperand(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
/// DWLabel - Labels are used to track locations in the assembler file.
|
/// DWLabel - Labels are used to track locations in the assembler file.
|
||||||
/// Labels appear in the form @verbatim <prefix><Tag><Number> @endverbatim,
|
/// Labels appear in the form @verbatim <prefix><Tag><Number> @endverbatim,
|
||||||
@ -3056,6 +3076,26 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/// ValidDebugInfo - Return true if V represents valid debug info value.
|
||||||
|
bool ValidDebugInfo(Value *V) {
|
||||||
|
GlobalVariable *GV = getGlobalVariable(V);
|
||||||
|
if (!GV)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (GV->getLinkage() != GlobalValue::InternalLinkage
|
||||||
|
&& GV->getLinkage() != GlobalValue::LinkOnceLinkage)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
DIDescriptor DI(GV);
|
||||||
|
// Check current version. Allow Version6 for now.
|
||||||
|
unsigned Version = DI.getVersion();
|
||||||
|
if (Version != DIDescriptor::Version7 && Version != DIDescriptor::Version6)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
//FIXME - Check individual descriptors.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/// RecordSourceLine - Records location information and associates it with a
|
/// RecordSourceLine - Records location information and associates it with a
|
||||||
/// label. Returns a unique label ID used to generate a label and provide
|
/// label. Returns a unique label ID used to generate a label and provide
|
||||||
/// correspondence to the source line list.
|
/// correspondence to the source line list.
|
||||||
@ -4221,6 +4261,11 @@ void DwarfWriter::EndFunction(MachineFunction *MF) {
|
|||||||
MMI->EndFunction();
|
MMI->EndFunction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ValidDebugInfo - Return true if V represents valid debug info value.
|
||||||
|
bool DwarfWriter::ValidDebugInfo(Value *V) {
|
||||||
|
return DD->ValidDebugInfo(V);
|
||||||
|
}
|
||||||
|
|
||||||
/// RecordSourceLine - Records location information and associates it with a
|
/// RecordSourceLine - Records location information and associates it with a
|
||||||
/// label. Returns a unique label ID used to generate a label and provide
|
/// label. Returns a unique label ID used to generate a label and provide
|
||||||
/// correspondence to the source line list.
|
/// correspondence to the source line list.
|
||||||
|
@ -317,7 +317,7 @@ bool FastISel::SelectCall(User *I) {
|
|||||||
default: break;
|
default: break;
|
||||||
case Intrinsic::dbg_stoppoint: {
|
case Intrinsic::dbg_stoppoint: {
|
||||||
DbgStopPointInst *SPI = cast<DbgStopPointInst>(I);
|
DbgStopPointInst *SPI = cast<DbgStopPointInst>(I);
|
||||||
if (DW && SPI->getContext()) {
|
if (DW && SPI->getContext() && DW->ValidDebugInfo(SPI->getContext())) {
|
||||||
DICompileUnit CU(cast<GlobalVariable>(SPI->getContext()));
|
DICompileUnit CU(cast<GlobalVariable>(SPI->getContext()));
|
||||||
unsigned SrcFile = DW->RecordSource(CU.getDirectory(),
|
unsigned SrcFile = DW->RecordSource(CU.getDirectory(),
|
||||||
CU.getFilename());
|
CU.getFilename());
|
||||||
@ -331,7 +331,7 @@ bool FastISel::SelectCall(User *I) {
|
|||||||
}
|
}
|
||||||
case Intrinsic::dbg_region_start: {
|
case Intrinsic::dbg_region_start: {
|
||||||
DbgRegionStartInst *RSI = cast<DbgRegionStartInst>(I);
|
DbgRegionStartInst *RSI = cast<DbgRegionStartInst>(I);
|
||||||
if (DW && RSI->getContext()) {
|
if (DW && RSI->getContext() && DW->ValidDebugInfo(RSI->getContext())) {
|
||||||
unsigned ID =
|
unsigned ID =
|
||||||
DW->RecordRegionStart(cast<GlobalVariable>(RSI->getContext()));
|
DW->RecordRegionStart(cast<GlobalVariable>(RSI->getContext()));
|
||||||
const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
|
const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
|
||||||
@ -341,7 +341,7 @@ bool FastISel::SelectCall(User *I) {
|
|||||||
}
|
}
|
||||||
case Intrinsic::dbg_region_end: {
|
case Intrinsic::dbg_region_end: {
|
||||||
DbgRegionEndInst *REI = cast<DbgRegionEndInst>(I);
|
DbgRegionEndInst *REI = cast<DbgRegionEndInst>(I);
|
||||||
if (DW && REI->getContext()) {
|
if (DW && REI->getContext() && DW->ValidDebugInfo(REI->getContext())) {
|
||||||
unsigned ID =
|
unsigned ID =
|
||||||
DW->RecordRegionEnd(cast<GlobalVariable>(REI->getContext()));
|
DW->RecordRegionEnd(cast<GlobalVariable>(REI->getContext()));
|
||||||
const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
|
const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
|
||||||
@ -353,7 +353,7 @@ bool FastISel::SelectCall(User *I) {
|
|||||||
if (!DW) return true;
|
if (!DW) return true;
|
||||||
DbgFuncStartInst *FSI = cast<DbgFuncStartInst>(I);
|
DbgFuncStartInst *FSI = cast<DbgFuncStartInst>(I);
|
||||||
Value *SP = FSI->getSubprogram();
|
Value *SP = FSI->getSubprogram();
|
||||||
if (SP) {
|
if (SP && DW->ValidDebugInfo(SP)) {
|
||||||
// llvm.dbg.func.start implicitly defines a dbg_stoppoint which is
|
// llvm.dbg.func.start implicitly defines a dbg_stoppoint which is
|
||||||
// what (most?) gdb expects.
|
// what (most?) gdb expects.
|
||||||
DISubprogram Subprogram(cast<GlobalVariable>(SP));
|
DISubprogram Subprogram(cast<GlobalVariable>(SP));
|
||||||
@ -375,7 +375,7 @@ bool FastISel::SelectCall(User *I) {
|
|||||||
case Intrinsic::dbg_declare: {
|
case Intrinsic::dbg_declare: {
|
||||||
DbgDeclareInst *DI = cast<DbgDeclareInst>(I);
|
DbgDeclareInst *DI = cast<DbgDeclareInst>(I);
|
||||||
Value *Variable = DI->getVariable();
|
Value *Variable = DI->getVariable();
|
||||||
if (DW && Variable) {
|
if (DW && Variable && DW->ValidDebugInfo(Variable)) {
|
||||||
// Determine the address of the declared object.
|
// Determine the address of the declared object.
|
||||||
Value *Address = DI->getAddress();
|
Value *Address = DI->getAddress();
|
||||||
if (BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
|
if (BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
|
||||||
|
@ -3746,7 +3746,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
|
|||||||
case Intrinsic::dbg_stoppoint: {
|
case Intrinsic::dbg_stoppoint: {
|
||||||
DwarfWriter *DW = DAG.getDwarfWriter();
|
DwarfWriter *DW = DAG.getDwarfWriter();
|
||||||
DbgStopPointInst &SPI = cast<DbgStopPointInst>(I);
|
DbgStopPointInst &SPI = cast<DbgStopPointInst>(I);
|
||||||
if (DW && SPI.getContext())
|
if (DW && SPI.getContext() && DW->ValidDebugInfo(SPI.getContext()))
|
||||||
DAG.setRoot(DAG.getDbgStopPoint(getRoot(),
|
DAG.setRoot(DAG.getDbgStopPoint(getRoot(),
|
||||||
SPI.getLine(),
|
SPI.getLine(),
|
||||||
SPI.getColumn(),
|
SPI.getColumn(),
|
||||||
@ -3756,7 +3756,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
|
|||||||
case Intrinsic::dbg_region_start: {
|
case Intrinsic::dbg_region_start: {
|
||||||
DwarfWriter *DW = DAG.getDwarfWriter();
|
DwarfWriter *DW = DAG.getDwarfWriter();
|
||||||
DbgRegionStartInst &RSI = cast<DbgRegionStartInst>(I);
|
DbgRegionStartInst &RSI = cast<DbgRegionStartInst>(I);
|
||||||
if (DW && RSI.getContext()) {
|
if (DW && RSI.getContext() && DW->ValidDebugInfo(RSI.getContext())) {
|
||||||
unsigned LabelID =
|
unsigned LabelID =
|
||||||
DW->RecordRegionStart(cast<GlobalVariable>(RSI.getContext()));
|
DW->RecordRegionStart(cast<GlobalVariable>(RSI.getContext()));
|
||||||
DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getRoot(), LabelID));
|
DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getRoot(), LabelID));
|
||||||
@ -3767,7 +3767,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
|
|||||||
case Intrinsic::dbg_region_end: {
|
case Intrinsic::dbg_region_end: {
|
||||||
DwarfWriter *DW = DAG.getDwarfWriter();
|
DwarfWriter *DW = DAG.getDwarfWriter();
|
||||||
DbgRegionEndInst &REI = cast<DbgRegionEndInst>(I);
|
DbgRegionEndInst &REI = cast<DbgRegionEndInst>(I);
|
||||||
if (DW && REI.getContext()) {
|
if (DW && REI.getContext() && DW->ValidDebugInfo(REI.getContext())) {
|
||||||
unsigned LabelID =
|
unsigned LabelID =
|
||||||
DW->RecordRegionEnd(cast<GlobalVariable>(REI.getContext()));
|
DW->RecordRegionEnd(cast<GlobalVariable>(REI.getContext()));
|
||||||
DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getRoot(), LabelID));
|
DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getRoot(), LabelID));
|
||||||
@ -3780,7 +3780,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
|
|||||||
if (!DW) return 0;
|
if (!DW) return 0;
|
||||||
DbgFuncStartInst &FSI = cast<DbgFuncStartInst>(I);
|
DbgFuncStartInst &FSI = cast<DbgFuncStartInst>(I);
|
||||||
Value *SP = FSI.getSubprogram();
|
Value *SP = FSI.getSubprogram();
|
||||||
if (SP) {
|
if (SP && DW->ValidDebugInfo(SP)) {
|
||||||
// llvm.dbg.func.start implicitly defines a dbg_stoppoint which is
|
// llvm.dbg.func.start implicitly defines a dbg_stoppoint which is
|
||||||
// what (most?) gdb expects.
|
// what (most?) gdb expects.
|
||||||
DISubprogram Subprogram(cast<GlobalVariable>(SP));
|
DISubprogram Subprogram(cast<GlobalVariable>(SP));
|
||||||
@ -3802,7 +3802,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
|
|||||||
DwarfWriter *DW = DAG.getDwarfWriter();
|
DwarfWriter *DW = DAG.getDwarfWriter();
|
||||||
DbgDeclareInst &DI = cast<DbgDeclareInst>(I);
|
DbgDeclareInst &DI = cast<DbgDeclareInst>(I);
|
||||||
Value *Variable = DI.getVariable();
|
Value *Variable = DI.getVariable();
|
||||||
if (DW && Variable)
|
if (DW && Variable && DW->ValidDebugInfo(Variable))
|
||||||
DAG.setRoot(DAG.getNode(ISD::DECLARE, MVT::Other, getRoot(),
|
DAG.setRoot(DAG.getNode(ISD::DECLARE, MVT::Other, getRoot(),
|
||||||
getValue(DI.getAddress()), getValue(Variable)));
|
getValue(DI.getAddress()), getValue(Variable)));
|
||||||
return 0;
|
return 0;
|
||||||
|
15
test/DebugInfo/2009-01-15-dbg_declare.ll
Normal file
15
test/DebugInfo/2009-01-15-dbg_declare.ll
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
; RUN: llvm-as < %s | llc -f -o /dev/null
|
||||||
|
target triple = "powerpc-apple-darwin9.5"
|
||||||
|
%llvm.dbg.variable.type = type { i32, { }*, i8*, { }*, i32, { }*, i8*, i8* }
|
||||||
|
@llvm.dbg.variable24 = external constant %llvm.dbg.variable.type ; <%llvm.dbg.variable.type*> [#uses=1]
|
||||||
|
|
||||||
|
declare void @llvm.dbg.declare({ }*, { }*) nounwind
|
||||||
|
|
||||||
|
define i32 @isascii(i32 %_c) nounwind {
|
||||||
|
entry:
|
||||||
|
call void @llvm.dbg.declare({ }* null, { }* bitcast (%llvm.dbg.variable.type* @llvm.dbg.variable24 to { }*))
|
||||||
|
unreachable
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user