From 68ca67b212c3be05ab5a8f5f3c7afcaec785834f Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Thu, 19 Feb 2015 20:24:04 +0000 Subject: [PATCH] MC: Allow multiple comma-separated expressions on the .uleb128 directive. For compatiblity with GNU as. Binutils documents this as '.uleb128 expressions'. Subtle, isn't it? llvm-svn: 229911 --- llvm/lib/MC/MCParser/AsmParser.cpp | 24 +++++++++++++++--------- llvm/test/MC/ELF/uleb.s | 9 +++++---- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index c714f3e..ef6a540 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -3636,21 +3636,27 @@ bool AsmParser::parseDirectiveSpace(StringRef IDVal) { } /// parseDirectiveLEB128 -/// ::= (.sleb128 | .uleb128) expression +/// ::= (.sleb128 | .uleb128) [ expression (, expression)* ] bool AsmParser::parseDirectiveLEB128(bool Signed) { checkForValidSection(); const MCExpr *Value; - if (parseExpression(Value)) - return true; + for (;;) { + if (parseExpression(Value)) + return true; - if (getLexer().isNot(AsmToken::EndOfStatement)) - return TokError("unexpected token in directive"); + if (Signed) + getStreamer().EmitSLEB128Value(Value); + else + getStreamer().EmitULEB128Value(Value); - if (Signed) - getStreamer().EmitSLEB128Value(Value); - else - getStreamer().EmitULEB128Value(Value); + if (getLexer().is(AsmToken::EndOfStatement)) + break; + + if (getLexer().isNot(AsmToken::Comma)) + return TokError("unexpected token in directive"); + Lex(); + } return false; } diff --git a/llvm/test/MC/ELF/uleb.s b/llvm/test/MC/ELF/uleb.s index d755cc2..5d203a9 100644 --- a/llvm/test/MC/ELF/uleb.s +++ b/llvm/test/MC/ELF/uleb.s @@ -11,16 +11,17 @@ foo: .uleb128 128 .uleb128 16383 .uleb128 16384 + .uleb128 23, 42 // ELF_32: Name: .text // ELF_32: SectionData ( -// ELF_32: 0000: 00017F80 01FF7F80 8001 +// ELF_32: 0000: 00017F80 01FF7F80 8001172A // ELF_32: ) // ELF_64: Name: .text // ELF_64: SectionData ( -// ELF_64: 0000: 00017F80 01FF7F80 8001 +// ELF_64: 0000: 00017F80 01FF7F80 8001172A // ELF_64: ) // MACHO_32: ('section_name', '__text\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') -// MACHO_32: ('_section_data', '00017f80 01ff7f80 8001') +// MACHO_32: ('_section_data', '00017f80 01ff7f80 8001172a') // MACHO_64: ('section_name', '__text\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') -// MACHO_64: ('_section_data', '00017f80 01ff7f80 8001') +// MACHO_64: ('_section_data', '00017f80 01ff7f80 8001172a') -- 2.7.4