diff options
| author | Roman Divacky <rdivacky@freebsd.org> | 2011-01-27 17:16:37 +0000 |
|---|---|---|
| committer | Roman Divacky <rdivacky@freebsd.org> | 2011-01-27 17:16:37 +0000 |
| commit | ed5efb40534616c30ae07eefa362fb3ea41c03a1 (patch) | |
| tree | 043f58e546c76219c43157dc3b2178e6ab28b947 /llvm/lib | |
| parent | 36b1b47c5a576ad2ba47ff3a7da9c0b8ba92f031 (diff) | |
| download | bcm5719-llvm-ed5efb40534616c30ae07eefa362fb3ea41c03a1.tar.gz bcm5719-llvm-ed5efb40534616c30ae07eefa362fb3ea41c03a1.zip | |
Add support for specifying register name in cfi-register/offset/def
as well as register number.
llvm-svn: 124379
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/MC/MCParser/AsmParser.cpp | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index b72894db78b..9cb15b496fb 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -30,6 +30,7 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Target/TargetAsmInfo.h" #include "llvm/Target/TargetAsmParser.h" #include <cctype> #include <vector> @@ -274,6 +275,8 @@ public: AddDirectiveHandler<&GenericAsmParser::ParseDirectiveLEB128>(".uleb128"); } + bool ParseRegisterOrRegisterNumber(int64_t &Register, SMLoc DirectiveLoc); + bool ParseDirectiveFile(StringRef, SMLoc DirectiveLoc); bool ParseDirectiveLine(StringRef, SMLoc DirectiveLoc); bool ParseDirectiveLoc(StringRef, SMLoc DirectiveLoc); @@ -2181,12 +2184,28 @@ bool GenericAsmParser::ParseDirectiveCFIEndProc(StringRef, SMLoc DirectiveLoc) { return getStreamer().EmitCFIEndProc(); } +/// ParseRegisterOrRegisterNumber - parse register name or number. +bool GenericAsmParser::ParseRegisterOrRegisterNumber(int64_t &Register, + SMLoc DirectiveLoc) { + unsigned RegNo; + + if (getLexer().is(AsmToken::Percent)) { + if (getParser().getTargetParser().ParseRegister(RegNo, DirectiveLoc, + DirectiveLoc)) + return true; + Register = getContext().getTargetAsmInfo().getDwarfRegNum(RegNo, true); + } else + return getParser().ParseAbsoluteExpression(Register); + + return false; +} + /// ParseDirectiveCFIDefCfa /// ::= .cfi_def_cfa register, offset bool GenericAsmParser::ParseDirectiveCFIDefCfa(StringRef, SMLoc DirectiveLoc) { int64_t Register = 0; - if (getParser().ParseAbsoluteExpression(Register)) + if (ParseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; if (getLexer().isNot(AsmToken::Comma)) @@ -2216,7 +2235,7 @@ bool GenericAsmParser::ParseDirectiveCFIDefCfaOffset(StringRef, bool GenericAsmParser::ParseDirectiveCFIDefCfaRegister(StringRef, SMLoc DirectiveLoc) { int64_t Register = 0; - if (getParser().ParseAbsoluteExpression(Register)) + if (ParseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; return getStreamer().EmitCFIDefCfaRegister(Register); @@ -2227,7 +2246,8 @@ bool GenericAsmParser::ParseDirectiveCFIDefCfaRegister(StringRef, bool GenericAsmParser::ParseDirectiveCFIOffset(StringRef, SMLoc DirectiveLoc) { int64_t Register = 0; int64_t Offset = 0; - if (getParser().ParseAbsoluteExpression(Register)) + + if (ParseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; if (getLexer().isNot(AsmToken::Comma)) |

