diff options
| author | Jim Laskey <jlaskey@mac.com> | 2006-08-29 16:24:26 +0000 |
|---|---|---|
| committer | Jim Laskey <jlaskey@mac.com> | 2006-08-29 16:24:26 +0000 |
| commit | ce50a165c784d71abf1b2f981be18f867787d972 (patch) | |
| tree | 33d65f6e590c8fecf1aa457fd7181f6936d209c5 /lib/CodeGen/DwarfWriter.cpp | |
| parent | 85aaf9088e98451bb31c7942986f63e95dedef4d (diff) | |
Handle callee saved registers in dwarf frame info (lead up to exception
handling.)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29954 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/DwarfWriter.cpp')
| -rw-r--r-- | lib/CodeGen/DwarfWriter.cpp | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index 54942b8098..5b5be545aa 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -35,7 +35,7 @@ using namespace llvm::dwarf; static cl::opt<bool> DwarfVerbose("dwarf-verbose", cl::Hidden, - cl::desc("Add comments to Dwarf directives.")); + cl::desc("Add comments to Dwarf directives.")); namespace llvm { @@ -1946,7 +1946,7 @@ void DwarfWriter::EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID, // Advance row if new location. if (BaseLabel && LabelID && BaseLabelID != LabelID) { - EmitULEB128Bytes(DW_CFA_advance_loc4); + EmitInt8(DW_CFA_advance_loc4); EOL("DW_CFA_advance_loc4"); EmitDifference("loc", LabelID, BaseLabel, BaseLabelID); EOL(""); @@ -1955,30 +1955,56 @@ void DwarfWriter::EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID, BaseLabel = "loc"; } + int stackGrowth = + Asm->TM.getFrameInfo()->getStackGrowthDirection() == + TargetFrameInfo::StackGrowsUp ? + AddressSize : -AddressSize; + // If advancing cfa. if (Dst.isRegister() && Dst.getRegister() == MachineLocation::VirtualFP) { if (!Src.isRegister()) { if (Src.getRegister() == MachineLocation::VirtualFP) { - EmitULEB128Bytes(DW_CFA_def_cfa_offset); + EmitInt8(DW_CFA_def_cfa_offset); EOL("DW_CFA_def_cfa_offset"); } else { - EmitULEB128Bytes(DW_CFA_def_cfa); + EmitInt8(DW_CFA_def_cfa); EOL("DW_CFA_def_cfa"); EmitULEB128Bytes(RI->getDwarfRegNum(Src.getRegister())); EOL("Register"); } - int stackGrowth = - Asm->TM.getFrameInfo()->getStackGrowthDirection() == - TargetFrameInfo::StackGrowsUp ? - AddressSize : -AddressSize; + int Offset = Src.getOffset() / stackGrowth; - EmitULEB128Bytes(Src.getOffset() / stackGrowth); + EmitULEB128Bytes(Offset); EOL("Offset"); } else { + assert(0 && "Machine move no supported yet."); } } else { + unsigned Reg = RI->getDwarfRegNum(Src.getRegister()); + int Offset = Dst.getOffset() / stackGrowth; + + if (Offset < 0) { + EmitInt8(DW_CFA_offset_extended_sf); + EOL("DW_CFA_offset_extended_sf"); + EmitULEB128Bytes(Reg); + EOL("Reg"); + EmitSLEB128Bytes(Offset); + EOL("Offset"); + } else if (Reg < 64) { + EmitInt8(DW_CFA_offset + Reg); + EOL("DW_CFA_offset + Reg"); + EmitULEB128Bytes(Offset); + EOL("Offset"); + } else { + EmitInt8(DW_CFA_offset_extended); + EOL("DW_CFA_offset_extended"); + EmitULEB128Bytes(Reg); + EOL("Reg"); + EmitULEB128Bytes(Offset); + EOL("Offset"); + } } } } |
