From: Kevin Enderby Date: Mon, 13 Jul 2009 21:03:15 +0000 (+0000) Subject: add llvm-mc support for parsing the .subsections_via_symbols directive. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=a5c783280f83df5c60a8ed9e32c61b05a11048e3;p=oota-llvm.git add llvm-mc support for parsing the .subsections_via_symbols directive. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75500 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index e0c50ebb72b..dc185aecfdf 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -89,6 +89,11 @@ namespace llvm { // symbol section in the constructor and initialize it here? virtual void EmitLabel(MCSymbol *Symbol) = 0; + /// SubsectionsViaSymbols - Note in the output that the conventions used in + /// in the assembly file allows the bytes of a section to be divided up at + /// the boundaries of the symbols by a link editor for processing as atoms. + virtual void SubsectionsViaSymbols(void) = 0; + /// EmitAssignment - Emit an assignment of @param Value to @param Symbol. /// /// This corresponds to an assembler statement such as: diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 172ae9ec958..c0a334adc9e 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -38,6 +38,8 @@ namespace { virtual void EmitLabel(MCSymbol *Symbol); + virtual void SubsectionsViaSymbols(void); + virtual void EmitAssignment(MCSymbol *Symbol, const MCValue &Value, bool MakeAbsolute = false); @@ -117,6 +119,10 @@ void MCAsmStreamer::EmitLabel(MCSymbol *Symbol) { Symbol->setExternal(false); } +void MCAsmStreamer::SubsectionsViaSymbols(void) { + OS << ".subsections_via_symbols\n"; +} + void MCAsmStreamer::EmitAssignment(MCSymbol *Symbol, const MCValue &Value, bool MakeAbsolute) { assert(!Symbol->getSection() && "Cannot assign to a label!"); diff --git a/test/MC/AsmParser/directive_subsections_via_symbols.s b/test/MC/AsmParser/directive_subsections_via_symbols.s new file mode 100644 index 00000000000..826b7f19232 --- /dev/null +++ b/test/MC/AsmParser/directive_subsections_via_symbols.s @@ -0,0 +1,6 @@ +# RUN: llvm-mc %s | FileCheck %s + +# CHECK: TEST0: +# CHECK: .subsections_via_symbols +TEST0: + .subsections_via_symbols diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp index a2cdea4c4dc..fe9d4f3352f 100644 --- a/tools/llvm-mc/AsmParser.cpp +++ b/tools/llvm-mc/AsmParser.cpp @@ -527,6 +527,9 @@ bool AsmParser::ParseStatement() { if (!strcmp(IDVal, ".zerofill")) return ParseDirectiveDarwinZerofill(); + if (!strcmp(IDVal, ".subsections_via_symbols")) + return ParseDirectiveDarwinSubsectionsViaSymbols(); + Warning(IDLoc, "ignoring directive for now"); EatToEndOfStatement(); return false; @@ -1052,3 +1055,16 @@ bool AsmParser::ParseDirectiveDarwinZerofill() { return false; } + +/// ParseDirectiveDarwinSubsectionsViaSymbols +/// ::= .subsections_via_symbols +bool AsmParser::ParseDirectiveDarwinSubsectionsViaSymbols() { + if (Lexer.isNot(asmtok::EndOfStatement)) + return TokError("unexpected token in '.subsections_via_symbols' directive"); + + Lexer.Lex(); + + Out.SubsectionsViaSymbols(); + + return false; +} diff --git a/tools/llvm-mc/AsmParser.h b/tools/llvm-mc/AsmParser.h index 620ac19c986..fcdd064977c 100644 --- a/tools/llvm-mc/AsmParser.h +++ b/tools/llvm-mc/AsmParser.h @@ -112,6 +112,9 @@ private: bool ParseDirectiveComm(bool IsLocal); // ".comm" and ".lcomm" bool ParseDirectiveDarwinZerofill(); // Darwin specific ".zerofill" + + // Darwin specific ".subsections_via_symbols" + bool ParseDirectiveDarwinSubsectionsViaSymbols(); }; } // end namespace llvm