diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2011-04-11 20:29:16 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2011-04-11 20:29:16 +0000 |
commit | ffd2e5163b5a5a105a78ce81aa1a89b65de5a32a (patch) | |
tree | b9745118353ee0f773d98d29fe49e44e90b9323f /llvm | |
parent | 2c81975bae556c5f90b4c24cb74a9209ad50cf27 (diff) | |
download | bcm5719-llvm-ffd2e5163b5a5a105a78ce81aa1a89b65de5a32a.tar.gz bcm5719-llvm-ffd2e5163b5a5a105a78ce81aa1a89b65de5a32a.zip |
implement .cfi_adjust_cfa_offset.
llvm-svn: 129296
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/MC/MCParser/AsmParser.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index 09c92b85f23..5eb772eafaa 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -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); } |