From ace63127bc7501d4d7707f744cdae09894342aa9 Mon Sep 17 00:00:00 2001
From: Daniel Dunbar <daniel@zuster.org>
Date: Tue, 11 Aug 2009 03:42:33 +0000
Subject: [PATCH] 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
---
 test/MC/AsmParser/directive_darwin_section.s |  4 ++++
 tools/llvm-mc/AsmParser.cpp                  | 20 +++++++++++++++-----
 2 files changed, 19 insertions(+), 5 deletions(-)
 create mode 100644 test/MC/AsmParser/directive_darwin_section.s

diff --git a/test/MC/AsmParser/directive_darwin_section.s b/test/MC/AsmParser/directive_darwin_section.s
new file mode 100644
index 00000000000..4fea2ead930
--- /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 09ca3f2ef16..b4fdd83f7bb 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() {
-  StringRef SectionName;
+  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.