aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-08-11 03:42:33 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-08-11 03:42:33 +0000
commitba013013b2cf64e385df6f5283c3412ca1f68fbb (patch)
treec8ae97464c17bc0e1fff0a911b3c97608073adaa
parent171a05bf92997381459f9fe367cde2fc9e87adc5 (diff)
downloadexternal_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.s4
-rw-r--r--tools/llvm-mc/AsmParser.cpp18
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.