mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-24 13:18:17 +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:
@@ -19,6 +19,7 @@
|
||||
#include "llvm/ADT/UniqueVector.h"
|
||||
#include "llvm/Module.h"
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "llvm/Constants.h"
|
||||
#include "llvm/CodeGen/AsmPrinter.h"
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
@@ -100,6 +101,25 @@ getGlobalVariablesUsing(Module &M, const std::string &RootName,
|
||||
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.
|
||||
/// Labels appear in the form @verbatim <prefix><Tag><Number> @endverbatim,
|
||||
@@ -3056,6 +3076,26 @@ 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
|
||||
/// label. Returns a unique label ID used to generate a label and provide
|
||||
/// correspondence to the source line list.
|
||||
@@ -4221,6 +4261,11 @@ void DwarfWriter::EndFunction(MachineFunction *MF) {
|
||||
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
|
||||
/// label. Returns a unique label ID used to generate a label and provide
|
||||
/// correspondence to the source line list.
|
||||
|
||||
Reference in New Issue
Block a user