diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-12-28 04:15:37 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-12-28 04:15:37 +0000 |
| commit | 5bba08425374ca36fe5fbc7423ce1a09858e4097 (patch) | |
| tree | dfbbfeaacf943481840eae1bdfbd93a7a2ab16c7 /lib/MC | |
| parent | 4213618088b0c0c85b208a01b45d89972984831b (diff) | |
| download | external_llvm-5bba08425374ca36fe5fbc7423ce1a09858e4097.zip external_llvm-5bba08425374ca36fe5fbc7423ce1a09858e4097.tar.gz external_llvm-5bba08425374ca36fe5fbc7423ce1a09858e4097.tar.bz2 | |
Start adding basic support for emitting the call frame instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122590 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
| -rw-r--r-- | lib/MC/MCDwarf.cpp | 6 | ||||
| -rw-r--r-- | lib/MC/MCStreamer.cpp | 9 |
2 files changed, 13 insertions, 2 deletions
diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index cd51410..6e59a58 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -460,9 +460,11 @@ static void EmitFrameMoves(MCStreamer &streamer, if (BaseLabel && Label) { MCSymbol *ThisSym = Label; if (ThisSym != BaseLabel) { + // FIXME: We should relax this instead of using a DW_CFA_advance_loc4 + // for every address change! streamer.EmitIntValue(dwarf::DW_CFA_advance_loc4, 1); const MCExpr *Length = MakeStartMinusEndExpr(streamer, *BaseLabel, - *ThisSym, 4); + *ThisSym, 0); streamer.EmitValue(Length, 4); BaseLabel = ThisSym; } @@ -672,6 +674,8 @@ static MCSymbol *EmitFDE(MCStreamer &streamer, streamer.EmitLabel(augmentationEnd); // Call Frame Instructions + EmitFrameMoves(streamer, frame.Moves, frame.Begin, true); + // Padding streamer.EmitValueToAlignment(4); diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 922a40c..048e886 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -157,7 +157,7 @@ bool MCStreamer::EmitCFIStartProc() { report_fatal_error("Starting a frame before finishing the previous one!"); return true; } - MCDwarfFrameInfo Frame = {0, 0, 0, 0, 0, 0}; + MCDwarfFrameInfo Frame; Frame.Begin = getContext().CreateTempSymbol(); EmitLabel(Frame.Begin); FrameInfos.push_back(Frame); @@ -174,6 +174,13 @@ bool MCStreamer::EmitCFIEndProc() { bool MCStreamer::EmitCFIDefCfaOffset(int64_t Offset) { EnsureValidFrame(); + MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo(); + MCSymbol *Label = getContext().CreateTempSymbol(); + EmitLabel(Label); + MachineLocation Dest(MachineLocation::VirtualFP); + MachineLocation Source(MachineLocation::VirtualFP, -Offset); + MachineMove Move(Label, Dest, Source); + CurFrame->Moves.push_back(Move); return false; } |
