Add support for parsing .size directives for ELF.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108606 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eli Friedman 2010-07-17 03:09:18 +00:00
parent d1e3b44d6c
commit f82ccf5a0d

View File

@ -31,6 +31,8 @@ public:
&ELFAsmParser::ParseSectionDirectiveData)); &ELFAsmParser::ParseSectionDirectiveData));
Parser.AddDirectiveHandler(this, ".text", MCAsmParser::DirectiveHandler( Parser.AddDirectiveHandler(this, ".text", MCAsmParser::DirectiveHandler(
&ELFAsmParser::ParseSectionDirectiveText)); &ELFAsmParser::ParseSectionDirectiveText));
Parser.AddDirectiveHandler(this, ".size", MCAsmParser::DirectiveHandler(
&ELFAsmParser::ParseSizeDirective));
} }
bool ParseSectionDirectiveData(StringRef, SMLoc) { bool ParseSectionDirectiveData(StringRef, SMLoc) {
@ -43,6 +45,7 @@ public:
MCSectionELF::SHF_EXECINSTR | MCSectionELF::SHF_EXECINSTR |
MCSectionELF::SHF_ALLOC, SectionKind::getText()); MCSectionELF::SHF_ALLOC, SectionKind::getText());
} }
bool ParseSizeDirective(StringRef, SMLoc);
}; };
} }
@ -59,6 +62,27 @@ bool ELFAsmParser::ParseSectionSwitch(StringRef Section, unsigned Type,
return false; return false;
} }
bool ELFAsmParser::ParseSizeDirective(StringRef, SMLoc) {
StringRef Name;
if (getParser().ParseIdentifier(Name))
return TokError("expected identifier in directive");
MCSymbol *Sym = getContext().GetOrCreateSymbol(Name);;
if (getLexer().isNot(AsmToken::Comma))
return TokError("unexpected token in directive");
Lex();
const MCExpr *Expr;
if (getParser().ParseExpression(Expr))
return true;
if (getLexer().isNot(AsmToken::EndOfStatement))
return TokError("unexpected token in directive");
getStreamer().EmitELFSize(Sym, Expr);
return false;
}
namespace llvm { namespace llvm {
MCAsmParserExtension *createELFAsmParser() { MCAsmParserExtension *createELFAsmParser() {