From: Jim Laskey Date: Tue, 28 Mar 2006 14:58:32 +0000 (+0000) Subject: Refactor address attributes. Add base register to frame info. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b3e7be25be0b6fafae5b5301df40e09a7cae0ede;p=oota-llvm.git 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 --- diff --git a/include/llvm/CodeGen/DwarfWriter.h b/include/llvm/CodeGen/DwarfWriter.h index f7b5eaaf3b3..7ac5aa6ba46 100644 --- a/include/llvm/CodeGen/DwarfWriter.h +++ b/include/llvm/CodeGen/DwarfWriter.h @@ -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); diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index ab38f3158a5..43fbb3b902f 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -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); }