Remove LastOffset from the asm parser.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 12 Apr 2011 18:53:30 +0000 (18:53 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 12 Apr 2011 18:53:30 +0000 (18:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129378 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCStreamer.h
lib/MC/MCDwarf.cpp
lib/MC/MCParser/AsmParser.cpp
lib/MC/MCStreamer.cpp

index f87bcfd00506f5a0ea034aa0a8a105df0f7626ce..1ccfc3f712ec45acc07324edbf4da9e2d34f98db 100644 (file)
@@ -448,6 +448,7 @@ namespace llvm {
     virtual bool EmitCFIRestoreState();
     void EmitCFISameValue(int64_t Register);
     void EmitCFIRelOffset(int64_t Register, int64_t Offset);
+    void EmitCFIAdjustCfaOffset(int64_t Adjustment);
 
     /// EmitInstruction - Emit the given @p Instruction into the current
     /// section.
index 84f4a3f5317e591d8a5301a410e1b0ca010d7ace..8770c8fd2beca6a39f59940d3aaf92fe2421af2a 100644 (file)
@@ -523,6 +523,7 @@ void FrameEmitterImpl::EmitCFIInstruction(MCStreamer &Streamer,
   case MCCFIInstruction::RelMove: {
     const MachineLocation &Dst = Instr.getDestination();
     const MachineLocation &Src = Instr.getSource();
+    const bool IsRelative = Instr.getOperation() == MCCFIInstruction::RelMove;
 
     // If advancing cfa.
     if (Dst.isReg() && Dst.getReg() == MachineLocation::VirtualFP) {
@@ -535,7 +536,11 @@ void FrameEmitterImpl::EmitCFIInstruction(MCStreamer &Streamer,
         Streamer.EmitULEB128IntValue(Src.getReg());
       }
 
-      CFAOffset = -Src.getOffset();
+      if (IsRelative)
+        CFAOffset += Src.getOffset();
+      else
+        CFAOffset = -Src.getOffset();
+
       Streamer.EmitULEB128IntValue(CFAOffset, 1);
       return;
     }
@@ -549,7 +554,6 @@ void FrameEmitterImpl::EmitCFIInstruction(MCStreamer &Streamer,
 
     unsigned Reg = Src.getReg();
 
-    const bool IsRelative = Instr.getOperation() == MCCFIInstruction::RelMove;
     int Offset = Dst.getOffset();
     if (IsRelative)
       Offset -= CFAOffset;
index 87b7cd634f3d65ad196436484b54c7aa6a3fb7c2..04c1f8bf901e1a5988233b5766696d901b8c8cca 100644 (file)
@@ -81,11 +81,6 @@ private:
   MCAsmParserExtension *GenericParser;
   MCAsmParserExtension *PlatformParser;
 
-  // FIXME: This is not the best place to store this. To handle a (for example)
-  // .cfi_rel_offset before a .cfi_def_cfa_offset we need to know the initial
-  // frame state.
-  int64_t LastOffset;
-
   /// This is the current buffer index we're lexing from as managed by the
   /// SourceMgr object.
   int CurBuffer;
@@ -145,14 +140,6 @@ public:
 
   /// }
 
-  int64_t adjustLastOffset(int64_t Adjustment) {
-    LastOffset += Adjustment;
-    return LastOffset;
-  }
-  void setLastOffset(int64_t Offset) {
-    LastOffset = Offset;
-  }
-
 private:
   void CheckForValidSection();
 
@@ -337,7 +324,7 @@ enum { DEFAULT_ADDRSPACE = 0 };
 AsmParser::AsmParser(const Target &T, SourceMgr &_SM, MCContext &_Ctx,
                      MCStreamer &_Out, const MCAsmInfo &_MAI)
   : Lexer(_MAI), Ctx(_Ctx), Out(_Out), SrcMgr(_SM),
-    GenericParser(new GenericAsmParser), PlatformParser(0), LastOffset(0),
+    GenericParser(new GenericAsmParser), PlatformParser(0),
     CurBuffer(0), MacrosEnabled(true) {
   Lexer.setBuffer(SrcMgr.getMemoryBuffer(CurBuffer));
 
@@ -2334,8 +2321,6 @@ bool GenericAsmParser::ParseDirectiveCFIDefCfaOffset(StringRef,
   if (getParser().ParseAbsoluteExpression(Offset))
     return true;
 
-  getParser().setLastOffset(Offset);
-
   return getStreamer().EmitCFIDefCfaOffset(Offset);
 }
 
@@ -2347,9 +2332,8 @@ bool GenericAsmParser::ParseDirectiveCFIAdjustCfaOffset(StringRef,
   if (getParser().ParseAbsoluteExpression(Adjustment))
     return true;
 
-  int64_t Offset = getParser().adjustLastOffset(Adjustment);
-
-  return getStreamer().EmitCFIDefCfaOffset(Offset);
+  getStreamer().EmitCFIAdjustCfaOffset(Adjustment);
+  return false;
 }
 
 /// ParseDirectiveCFIDefCfaRegister
index 92e76c9ed42a414a24f61af1047126efafa92031..a02e9ac0d175bd951d320c9dacd9ec4ea2f0c27e 100644 (file)
@@ -197,6 +197,17 @@ bool MCStreamer::EmitCFIDefCfaOffset(int64_t Offset) {
   return false;
 }
 
+void MCStreamer::EmitCFIAdjustCfaOffset(int64_t Adjustment) {
+  EnsureValidFrame();
+  MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
+  MCSymbol *Label = getContext().CreateTempSymbol();
+  EmitLabel(Label);
+  MachineLocation Dest(MachineLocation::VirtualFP);
+  MachineLocation Source(MachineLocation::VirtualFP, Adjustment);
+  MCCFIInstruction Instruction(MCCFIInstruction::RelMove, Label, Dest, Source);
+  CurFrame->Instructions.push_back(Instruction);
+}
+
 bool MCStreamer::EmitCFIDefCfaRegister(int64_t Register) {
   EnsureValidFrame();
   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();