diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-08-11 03:42:33 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-08-11 03:42:33 +0000 |
commit | ba013013b2cf64e385df6f5283c3412ca1f68fbb (patch) | |
tree | c8ae97464c17bc0e1fff0a911b3c97608073adaa | |
parent | 171a05bf92997381459f9fe367cde2fc9e87adc5 (diff) | |
download | external_llvm-ba013013b2cf64e385df6f5283c3412ca1f68fbb.zip external_llvm-ba013013b2cf64e385df6f5283c3412ca1f68fbb.tar.gz external_llvm-ba013013b2cf64e385df6f5283c3412ca1f68fbb.tar.bz2 |
llvm-mc: Fix darwin .section parsing. It was skipping the section name and a ','
(and outputting a diagnostic pointing at the wrong place), all of which lead to
much confusion.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78637 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | test/MC/AsmParser/directive_darwin_section.s | 4 | ||||
-rw-r--r-- | tools/llvm-mc/AsmParser.cpp | 18 |
2 files changed, 18 insertions, 4 deletions
diff --git a/test/MC/AsmParser/directive_darwin_section.s b/test/MC/AsmParser/directive_darwin_section.s new file mode 100644 index 0000000..4fea2ea --- /dev/null +++ b/test/MC/AsmParser/directive_darwin_section.s @@ -0,0 +1,4 @@ +# RUN: llvm-mc -triple i386-apple-darwin9 %s | FileCheck %s + +# CHECK: .section __DWARF,__debug_frame,regular,debug + .section __DWARF,__debug_frame,regular,debug diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp index 09ca3f2..b4fdd83 100644 --- a/tools/llvm-mc/AsmParser.cpp +++ b/tools/llvm-mc/AsmParser.cpp @@ -688,14 +688,24 @@ bool AsmParser::ParseDirectiveSet() { /// FIXME: This should actually parse out the segment, section, attributes and /// sizeof_stub fields. bool AsmParser::ParseDirectiveDarwinSection() { + SMLoc Loc = Lexer.getLoc(); + StringRef SectionName; + if (ParseIdentifier(SectionName)) + return Error(Loc, "expected identifier after '.section' directive"); + + // Verify there is a following comma. + if (!Lexer.is(AsmToken::Comma)) + return TokError("unexpected token in '.section' directive"); - if (Lexer.isNot(AsmToken::Identifier)) - return TokError("expected identifier after '.section' directive"); - std::string SectionSpec = SectionName; + SectionSpec += ","; + + // Add all the tokens until the end of the line, ParseSectionSpecifier will + // handle this. StringRef EOL = Lexer.LexUntilEndOfStatement(); SectionSpec.append(EOL.begin(), EOL.end()); + Lexer.Lex(); if (Lexer.isNot(AsmToken::EndOfStatement)) return TokError("unexpected token in '.section' directive"); @@ -709,7 +719,7 @@ bool AsmParser::ParseDirectiveDarwinSection() { TAA, StubSize); if (!ErrorStr.empty()) - return TokError(ErrorStr.c_str()); + return Error(Loc, ErrorStr.c_str()); // FIXME: CACHE THESE. |