implement .cfi_adjust_cfa_offset.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 11 Apr 2011 20:29:16 +0000 (20:29 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 11 Apr 2011 20:29:16 +0000 (20:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129296 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCParser/AsmParser.cpp

index 09c92b85f237d3e54e2347b59f4a92e946ef3aa1..5eb772eafaac8edd18f18d7175520eb16b71fe71 100644 (file)
@@ -80,6 +80,7 @@ private:
   SourceMgr &SrcMgr;
   MCAsmParserExtension *GenericParser;
   MCAsmParserExtension *PlatformParser;
+  int64_t LastOffset;
 
   /// This is the current buffer index we're lexing from as managed by the
   /// SourceMgr object.
@@ -140,6 +141,14 @@ public:
 
   /// }
 
+  int64_t adjustLastOffset(int64_t Adjustment) {
+    LastOffset += Adjustment;
+    return LastOffset;
+  }
+  void setLastOffset(int64_t Offset) {
+    LastOffset = Offset;
+  }
+
 private:
   void CheckForValidSection();
 
@@ -251,6 +260,8 @@ public:
                                                          ".cfi_def_cfa");
     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveCFIDefCfaOffset>(
                                                          ".cfi_def_cfa_offset");
+    AddDirectiveHandler<&GenericAsmParser::ParseDirectiveCFIAdjustCfaOffset>(
+                                                      ".cfi_adjust_cfa_offset");
     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveCFIDefCfaRegister>(
                                                        ".cfi_def_cfa_register");
     AddDirectiveHandler<&GenericAsmParser::ParseDirectiveCFIOffset>(
@@ -287,6 +298,7 @@ public:
   bool ParseDirectiveCFIEndProc(StringRef, SMLoc DirectiveLoc);
   bool ParseDirectiveCFIDefCfa(StringRef, SMLoc DirectiveLoc);
   bool ParseDirectiveCFIDefCfaOffset(StringRef, SMLoc DirectiveLoc);
+  bool ParseDirectiveCFIAdjustCfaOffset(StringRef, SMLoc DirectiveLoc);
   bool ParseDirectiveCFIDefCfaRegister(StringRef, SMLoc DirectiveLoc);
   bool ParseDirectiveCFIOffset(StringRef, SMLoc DirectiveLoc);
   bool ParseDirectiveCFIPersonalityOrLsda(StringRef, SMLoc DirectiveLoc);
@@ -315,7 +327,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),
+    GenericParser(new GenericAsmParser), PlatformParser(0), LastOffset(0),
     CurBuffer(0), MacrosEnabled(true) {
   Lexer.setBuffer(SrcMgr.getMemoryBuffer(CurBuffer));
 
@@ -2309,6 +2321,21 @@ bool GenericAsmParser::ParseDirectiveCFIDefCfaOffset(StringRef,
   if (getParser().ParseAbsoluteExpression(Offset))
     return true;
 
+  getParser().setLastOffset(Offset);
+
+  return getStreamer().EmitCFIDefCfaOffset(Offset);
+}
+
+/// ParseDirectiveCFIAdjustCfaOffset
+/// ::= .cfi_adjust_cfa_offset adjustment
+bool GenericAsmParser::ParseDirectiveCFIAdjustCfaOffset(StringRef,
+                                                        SMLoc DirectiveLoc) {
+  int64_t Adjustment = 0;
+  if (getParser().ParseAbsoluteExpression(Adjustment))
+    return true;
+
+  int64_t Offset = getParser().adjustLastOffset(Adjustment);
+
   return getStreamer().EmitCFIDefCfaOffset(Offset);
 }