diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-09-11 16:45:15 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-09-11 16:45:15 +0000 |
commit | b98ac2a71e55e685efa0fdbebdffb5228f7a512d (patch) | |
tree | f465f442732805a1655aa054451bd778d9105e29 /lib/MC/MCParser | |
parent | dfa3c9d98260f899297c11cda2b15dc44fc4f91e (diff) | |
download | external_llvm-b98ac2a71e55e685efa0fdbebdffb5228f7a512d.zip external_llvm-b98ac2a71e55e685efa0fdbebdffb5228f7a512d.tar.gz external_llvm-b98ac2a71e55e685efa0fdbebdffb5228f7a512d.tar.bz2 |
Add support for leb128 of absolute expressions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113691 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCParser')
-rw-r--r-- | lib/MC/MCParser/AsmParser.cpp | 49 | ||||
-rw-r--r-- | lib/MC/MCParser/ELFAsmParser.cpp | 23 |
2 files changed, 49 insertions, 23 deletions
diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index 0a664fd..5ef6f68 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -238,6 +238,9 @@ public: AddDirectiveHandler<&GenericAsmParser::ParseDirectiveMacro>(".macro"); AddDirectiveHandler<&GenericAsmParser::ParseDirectiveEndMacro>(".endm"); AddDirectiveHandler<&GenericAsmParser::ParseDirectiveEndMacro>(".endmacro"); + + AddDirectiveHandler<&GenericAsmParser::ParseDirectiveLEB128>(".sleb128"); + AddDirectiveHandler<&GenericAsmParser::ParseDirectiveLEB128>(".uleb128"); } bool ParseDirectiveFile(StringRef, SMLoc DirectiveLoc); @@ -247,6 +250,10 @@ public: bool ParseDirectiveMacrosOnOff(StringRef, SMLoc DirectiveLoc); bool ParseDirectiveMacro(StringRef, SMLoc DirectiveLoc); bool ParseDirectiveEndMacro(StringRef, SMLoc DirectiveLoc); + + void ParseUleb128(uint64_t Value); + void ParseSleb128(int64_t Value); + bool ParseDirectiveLEB128(StringRef, SMLoc); }; } @@ -2049,6 +2056,48 @@ bool GenericAsmParser::ParseDirectiveEndMacro(StringRef Directive, "no current macro definition"); } +void GenericAsmParser::ParseUleb128(uint64_t Value) { + const uint64_t Mask = (1 << 7) - 1; + do { + unsigned Byte = Value & Mask; + Value >>= 7; + if (Value) // Not the last one + Byte |= (1 << 7); + getStreamer().EmitIntValue(Byte, 1, DEFAULT_ADDRSPACE); + } while (Value); +} + +void GenericAsmParser::ParseSleb128(int64_t Value) { + const int64_t Mask = (1 << 7) - 1; + for(;;) { + unsigned Byte = Value & Mask; + Value >>= 7; + bool Done = ((Value == 0 && (Byte & 0x40) == 0) || + (Value == -1 && (Byte & 0x40) != 0)); + if (!Done) + Byte |= (1 << 7); + getStreamer().EmitIntValue(Byte, 1, DEFAULT_ADDRSPACE); + if (Done) + break; + } +} + +bool GenericAsmParser::ParseDirectiveLEB128(StringRef DirName, SMLoc) { + int64_t Value; + if (getParser().ParseAbsoluteExpression(Value)) + return true; + + if (getLexer().isNot(AsmToken::EndOfStatement)) + return TokError("unexpected token in directive"); + + if (DirName[1] == 's') + ParseSleb128(Value); + else + ParseUleb128(Value); + return false; +} + + /// \brief Create an MCAsmParser instance. MCAsmParser *llvm::createMCAsmParser(const Target &T, SourceMgr &SM, MCContext &C, MCStreamer &Out, diff --git a/lib/MC/MCParser/ELFAsmParser.cpp b/lib/MC/MCParser/ELFAsmParser.cpp index f982fda..38288d7 100644 --- a/lib/MC/MCParser/ELFAsmParser.cpp +++ b/lib/MC/MCParser/ELFAsmParser.cpp @@ -48,8 +48,6 @@ public: AddDirectiveHandler<&ELFAsmParser::ParseSectionDirectiveEhFrame>(".eh_frame"); AddDirectiveHandler<&ELFAsmParser::ParseDirectiveSection>(".section"); AddDirectiveHandler<&ELFAsmParser::ParseDirectiveSize>(".size"); - AddDirectiveHandler<&ELFAsmParser::ParseDirectiveLEB128>(".sleb128"); - AddDirectiveHandler<&ELFAsmParser::ParseDirectiveLEB128>(".uleb128"); AddDirectiveHandler<&ELFAsmParser::ParseDirectivePrevious>(".previous"); } @@ -109,7 +107,6 @@ public: MCSectionELF::SHF_WRITE, SectionKind::getDataRel()); } - bool ParseDirectiveLEB128(StringRef, SMLoc); bool ParseDirectiveSection(StringRef, SMLoc); bool ParseDirectiveSize(StringRef, SMLoc); bool ParseDirectivePrevious(StringRef, SMLoc); @@ -254,26 +251,6 @@ bool ELFAsmParser::ParseDirectiveSection(StringRef, SMLoc) { return false; } -bool ELFAsmParser::ParseDirectiveLEB128(StringRef DirName, SMLoc) { - int64_t Value; - if (getParser().ParseAbsoluteExpression(Value)) - return true; - - if (getLexer().isNot(AsmToken::EndOfStatement)) - return TokError("unexpected token in directive"); - - // FIXME: Add proper MC support. - if (getContext().getAsmInfo().hasLEB128()) { - if (DirName[1] == 's') - getStreamer().EmitRawText("\t.sleb128\t" + Twine(Value)); - else - getStreamer().EmitRawText("\t.uleb128\t" + Twine(Value)); - return false; - } - // FIXME: This shouldn't be an error! - return TokError("LEB128 not supported yet"); -} - bool ELFAsmParser::ParseDirectivePrevious(StringRef DirName, SMLoc) { const MCSection *PreviousSection = getStreamer().getPreviousSection(); if (PreviousSection != NULL) |