mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-14 15:38:57 +00:00
Refactor.
llvm-svn: 110607
This commit is contained in:
parent
e7ceec4edf
commit
8d0c79694e
@ -62,6 +62,7 @@ namespace llvm {
|
||||
}
|
||||
|
||||
GlobalVariable *getGlobalVariableField(unsigned Elt) const;
|
||||
Constant *getConstantField(unsigned Elt) const;
|
||||
Function *getFunctionField(unsigned Elt) const;
|
||||
|
||||
public:
|
||||
@ -447,6 +448,7 @@ namespace llvm {
|
||||
unsigned isDefinition() const { return getUnsignedField(10); }
|
||||
|
||||
GlobalVariable *getGlobal() const { return getGlobalVariableField(11); }
|
||||
Constant *getConstant() const { return getConstantField(11); }
|
||||
|
||||
/// Verify - Verify that a global variable descriptor is well formed.
|
||||
bool Verify() const;
|
||||
@ -696,6 +698,15 @@ namespace llvm {
|
||||
unsigned LineNo, DIType Ty, bool isLocalToUnit,
|
||||
bool isDefinition, llvm::GlobalVariable *GV);
|
||||
|
||||
/// CreateGlobalVariable - Create a new descriptor for the specified constant.
|
||||
DIGlobalVariable
|
||||
CreateGlobalVariable(DIDescriptor Context, StringRef Name,
|
||||
StringRef DisplayName,
|
||||
StringRef LinkageName,
|
||||
DIFile F,
|
||||
unsigned LineNo, DIType Ty, bool isLocalToUnit,
|
||||
bool isDefinition, llvm::Constant *C);
|
||||
|
||||
/// CreateVariable - Create a new descriptor for the specified variable.
|
||||
DIVariable CreateVariable(unsigned Tag, DIDescriptor Context,
|
||||
StringRef Name,
|
||||
|
@ -89,6 +89,15 @@ GlobalVariable *DIDescriptor::getGlobalVariableField(unsigned Elt) const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Constant *DIDescriptor::getConstantField(unsigned Elt) const {
|
||||
if (DbgNode == 0)
|
||||
return 0;
|
||||
|
||||
if (Elt < DbgNode->getNumOperands())
|
||||
return dyn_cast_or_null<Constant>(DbgNode->getOperand(Elt));
|
||||
return 0;
|
||||
}
|
||||
|
||||
Function *DIDescriptor::getFunctionField(unsigned Elt) const {
|
||||
if (DbgNode == 0)
|
||||
return 0;
|
||||
@ -341,7 +350,7 @@ bool DIGlobalVariable::Verify() const {
|
||||
if (!Ty.Verify())
|
||||
return false;
|
||||
|
||||
if (!getGlobal())
|
||||
if (!getGlobal() && !getConstant())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@ -1060,6 +1069,38 @@ DIFactory::CreateGlobalVariable(DIDescriptor Context, StringRef Name,
|
||||
return DIGlobalVariable(Node);
|
||||
}
|
||||
|
||||
/// CreateGlobalVariable - Create a new descriptor for the specified constant.
|
||||
DIGlobalVariable
|
||||
DIFactory::CreateGlobalVariable(DIDescriptor Context, StringRef Name,
|
||||
StringRef DisplayName,
|
||||
StringRef LinkageName,
|
||||
DIFile F,
|
||||
unsigned LineNo, DIType Ty,bool isLocalToUnit,
|
||||
bool isDefinition, llvm::Constant *Val) {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_variable),
|
||||
llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
|
||||
Context,
|
||||
MDString::get(VMContext, Name),
|
||||
MDString::get(VMContext, DisplayName),
|
||||
MDString::get(VMContext, LinkageName),
|
||||
F,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
|
||||
Ty,
|
||||
ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
|
||||
ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
|
||||
Val
|
||||
};
|
||||
|
||||
Value *const *Vs = &Elts[0];
|
||||
MDNode *Node = MDNode::get(VMContext,Vs, 12);
|
||||
|
||||
// Create a named metadata so that we do not lose this mdnode.
|
||||
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.gv");
|
||||
NMD->addOperand(Node);
|
||||
|
||||
return DIGlobalVariable(Node);
|
||||
}
|
||||
|
||||
/// CreateVariable - Create a new descriptor for the specified variable.
|
||||
DIVariable DIFactory::CreateVariable(unsigned Tag, DIDescriptor Context,
|
||||
|
@ -1190,7 +1190,7 @@ static StringRef getRealLinkageName(StringRef LinkageName) {
|
||||
DIE *DwarfDebug::createGlobalVariableDIE(const DIGlobalVariable &GV) {
|
||||
// If the global variable was optmized out then no need to create debug info
|
||||
// entry.
|
||||
if (!GV.getGlobal()) return NULL;
|
||||
if (!GV.Verify()) return NULL;
|
||||
if (GV.getDisplayName().empty()) return NULL;
|
||||
|
||||
DIE *GVDie = new DIE(dwarf::DW_TAG_variable);
|
||||
@ -1908,6 +1908,10 @@ void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
|
||||
|
||||
// Add to context owner.
|
||||
DIDescriptor GVContext = DI_GV.getContext();
|
||||
DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
|
||||
addLabel(Block, 0, dwarf::DW_FORM_udata,
|
||||
Asm->Mang->getSymbol(DI_GV.getGlobal()));
|
||||
// Do not create specification DIE if context is either compile unit
|
||||
// or a subprogram.
|
||||
if (DI_GV.isDefinition() && !GVContext.isCompileUnit() &&
|
||||
@ -1917,18 +1921,10 @@ void DwarfDebug::constructGlobalVariableDIE(const MDNode *N) {
|
||||
DIE *VariableSpecDIE = new DIE(dwarf::DW_TAG_variable);
|
||||
addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification,
|
||||
dwarf::DW_FORM_ref4, VariableDie);
|
||||
DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
|
||||
addLabel(Block, 0, dwarf::DW_FORM_udata,
|
||||
Asm->Mang->getSymbol(DI_GV.getGlobal()));
|
||||
addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block);
|
||||
addUInt(VariableDie, dwarf::DW_AT_declaration, dwarf::DW_FORM_flag, 1);
|
||||
TheCU->addDie(VariableSpecDIE);
|
||||
} else {
|
||||
DIEBlock *Block = new (DIEValueAllocator) DIEBlock();
|
||||
addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr);
|
||||
addLabel(Block, 0, dwarf::DW_FORM_udata,
|
||||
Asm->Mang->getSymbol(DI_GV.getGlobal()));
|
||||
addBlock(VariableDie, dwarf::DW_AT_location, 0, Block);
|
||||
}
|
||||
addToContextOwner(VariableDie, GVContext);
|
||||
|
Loading…
x
Reference in New Issue
Block a user