diff options
-rw-r--r-- | include/llvm/MC/MCStreamer.h | 6 | ||||
-rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 6 | ||||
-rw-r--r-- | test/MC/AsmParser/directive_desc.s | 8 | ||||
-rw-r--r-- | tools/llvm-mc/AsmParser.cpp | 33 | ||||
-rw-r--r-- | tools/llvm-mc/AsmParser.h | 1 |
5 files changed, 54 insertions, 0 deletions
diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index 8ceb772..a418a0f 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -120,6 +120,12 @@ namespace llvm { virtual void EmitSymbolAttribute(MCSymbol *Symbol, SymbolAttr Attribute) = 0; + /// EmitSymbolDesc - Set the @param DescValue for the @param Symbol. + /// + /// @param Symbol - The symbol to have its n_desc field set. + /// @param DescValue - The value to set into the n_desc field. + virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) = 0; + /// EmitCommonSymbol - Emit a common or local common symbol of @param Size /// with the @param Pow2Alignment if non-zero. /// diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index b8e71ce..b346008 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -45,6 +45,8 @@ namespace { virtual void EmitSymbolAttribute(MCSymbol *Symbol, SymbolAttr Attribute); + virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue); + virtual void EmitCommonSymbol(MCSymbol *Symbol, unsigned Size, unsigned Pow2Alignment, bool IsLocal); @@ -166,6 +168,10 @@ void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol, OS << ' ' << Symbol->getName() << '\n'; } +void MCAsmStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { + OS << ".desc" << ' ' << Symbol->getName() << ',' << DescValue << '\n'; +} + void MCAsmStreamer::EmitCommonSymbol(MCSymbol *Symbol, unsigned Size, unsigned Pow2Alignment, bool IsLocal) { if (IsLocal) diff --git a/test/MC/AsmParser/directive_desc.s b/test/MC/AsmParser/directive_desc.s new file mode 100644 index 0000000..80acc26 --- /dev/null +++ b/test/MC/AsmParser/directive_desc.s @@ -0,0 +1,8 @@ +# RUN: llvm-mc %s | FileCheck %s + +# CHECK: TEST0: +# CHECK: .desc foo,16 +# CHECK: .desc bar,4 +TEST0: + .desc foo,0x10 + .desc bar, 1 +3 diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp index c105801..d94b7b3 100644 --- a/tools/llvm-mc/AsmParser.cpp +++ b/tools/llvm-mc/AsmParser.cpp @@ -526,6 +526,8 @@ bool AsmParser::ParseStatement() { return ParseDirectiveComm(/*IsLocal=*/true); if (!strcmp(IDVal, ".zerofill")) return ParseDirectiveDarwinZerofill(); + if (!strcmp(IDVal, ".desc")) + return ParseDirectiveDarwinSymbolDesc(); if (!strcmp(IDVal, ".subsections_via_symbols")) return ParseDirectiveDarwinSubsectionsViaSymbols(); @@ -909,6 +911,37 @@ bool AsmParser::ParseDirectiveSymbolAttribute(MCStreamer::SymbolAttr Attr) { return false; } +/// ParseDirectiveDarwinSymbolDesc +/// ::= .desc identifier , expression +bool AsmParser::ParseDirectiveDarwinSymbolDesc() { + if (Lexer.isNot(asmtok::Identifier)) + return TokError("expected identifier in directive"); + + // handle the identifier as the key symbol. + SMLoc IDLoc = Lexer.getLoc(); + MCSymbol *Sym = Ctx.GetOrCreateSymbol(Lexer.getCurStrVal()); + Lexer.Lex(); + + if (Lexer.isNot(asmtok::Comma)) + return TokError("unexpected token in '.desc' directive"); + Lexer.Lex(); + + SMLoc DescLoc = Lexer.getLoc(); + int64_t DescValue; + if (ParseAbsoluteExpression(DescValue)) + return true; + + if (Lexer.isNot(asmtok::EndOfStatement)) + return TokError("unexpected token in '.desc' directive"); + + Lexer.Lex(); + + // Set the n_desc field of this Symbol to this DescValue + Out.EmitSymbolDesc(Sym, DescValue); + + return false; +} + /// ParseDirectiveComm /// ::= ( .comm | .lcomm ) identifier , size_expression [ , align_expression ] bool AsmParser::ParseDirectiveComm(bool IsLocal) { diff --git a/tools/llvm-mc/AsmParser.h b/tools/llvm-mc/AsmParser.h index da54673..b4f5e2d 100644 --- a/tools/llvm-mc/AsmParser.h +++ b/tools/llvm-mc/AsmParser.h @@ -109,6 +109,7 @@ private: /// ParseDirectiveSymbolAttribute - Parse a directive like ".globl" which /// accepts a single symbol (which should be a label or an external). bool ParseDirectiveSymbolAttribute(MCStreamer::SymbolAttr Attr); + bool ParseDirectiveDarwinSymbolDesc(); // Darwin specific ".desc" bool ParseDirectiveComm(bool IsLocal); // ".comm" and ".lcomm" bool ParseDirectiveDarwinZerofill(); // Darwin specific ".zerofill" |