Refactor address attributes. Add base register to frame info.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27226 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jim Laskey 2006-03-28 14:58:32 +00:00
parent a99791886d
commit b3e7be25be
2 changed files with 24 additions and 13 deletions

View File

@ -41,6 +41,7 @@ class DIE;
class DIEAbbrev;
class GlobalVariableDesc;
class MachineDebugInfo;
class MachineLocation;
class MachineFunction;
class Module;
class SubprogramDesc;
@ -321,6 +322,10 @@ private:
/// entry.
void AddSourceLine(DIE *Die, CompileUnitDesc *File, unsigned Line);
/// AddAddress - Add an address attribute to a die based on the location
/// provided.
void AddAddress(DIE *Die, unsigned Attribute, MachineLocation &Location);
/// NewType - Create a new type DIE.
///
DIE *NewType(DIE *Context, TypeDesc *TyDesc, CompileUnit *Unit);

View File

@ -1213,6 +1213,21 @@ void DwarfWriter::AddSourceLine(DIE *Die, CompileUnitDesc *File, unsigned Line)
}
}
/// AddAddress - Add an address attribute to a die based on the location
/// provided.
void DwarfWriter::AddAddress(DIE *Die, unsigned Attribute,
MachineLocation &Location) {
DIEBlock *Block = new DIEBlock();
if (Location.isRegister()) {
Block->AddUInt(DW_FORM_data1, DW_OP_reg0 + Location.getRegister());
} else {
Block->AddUInt(DW_FORM_data1, DW_OP_breg0 + Location.getRegister());
Block->AddUInt(DW_FORM_sdata, Location.getOffset());
}
Block->ComputeSize(*this);
Die->AddBlock(Attribute, 0, Block);
}
/// getDieMapSlotFor - Returns the debug information entry map slot for the
/// specified debug descriptor.
DIE *&DwarfWriter::getDieMapSlotFor(DebugInfoDesc *DD) {
@ -1518,7 +1533,6 @@ DIE *DwarfWriter::NewSubprogram(SubprogramDesc *SPD) {
return SubprogramDie;
}
/// NewScopeVariable - Create a new scope variable.
///
DIE *DwarfWriter::NewScopeVariable(DebugVariable *DV, CompileUnit *Unit) {
@ -1545,20 +1559,10 @@ DIE *DwarfWriter::NewScopeVariable(DebugVariable *DV, CompileUnit *Unit) {
DIE *Type = NewType(Unit->getDie(), VD->getType(), Unit);
VariableDie->AddDIEntry(DW_AT_type, DW_FORM_ref4, Type);
// Get variable address.
// Add variable address.
MachineLocation Location;
Asm->TM.getRegisterInfo()->getLocation(*MF, DV->getFrameIndex(), Location);
// Add computation for variable.
DIEBlock *Block = new DIEBlock();
if (Location.isRegister()) {
Block->AddUInt(DW_FORM_data1, DW_OP_reg0 + Location.getRegister());
} else {
Block->AddUInt(DW_FORM_data1, DW_OP_breg0 + Location.getRegister());
Block->AddUInt(DW_FORM_sdata, Location.getOffset());
}
Block->ComputeSize(*this);
VariableDie->AddBlock(DW_AT_location, 0, Block);
AddAddress(VariableDie, DW_AT_location, Location);
return VariableDie;
}
@ -1628,6 +1632,8 @@ void DwarfWriter::ConstructRootScope(DebugScope *RootScope) {
DWLabel("func_begin", SubprogramCount));
SPDie->AddLabel(DW_AT_high_pc, DW_FORM_addr,
DWLabel("func_end", SubprogramCount));
MachineLocation Location(Asm->TM.getRegisterInfo()->getFrameRegister(*MF));
AddAddress(SPDie, DW_AT_frame_base, Location);
ConstructScope(RootScope, SPDie, Unit);
}