diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-10-27 15:18:17 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-10-27 15:18:17 +0000 |
| commit | eb0c2c170d8831c37deada38e485cc717259932f (patch) | |
| tree | d75ca79e0fcef05effa70ef0ad3654472ae0eaf4 /llvm/lib/MC/MCParser | |
| parent | a5efd6a27cf4b00adbd731fe17fca4a5a416ea9c (diff) | |
| download | bcm5719-llvm-eb0c2c170d8831c37deada38e485cc717259932f.tar.gz bcm5719-llvm-eb0c2c170d8831c37deada38e485cc717259932f.zip | |
Add support for the .symver directive. This is really ugly, but most of it is
contained in the ELF object writer.
llvm-svn: 117448
Diffstat (limited to 'llvm/lib/MC/MCParser')
| -rw-r--r-- | llvm/lib/MC/MCParser/ELFAsmParser.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/llvm/lib/MC/MCParser/ELFAsmParser.cpp b/llvm/lib/MC/MCParser/ELFAsmParser.cpp index 1970124b2d8..33fdf98bcfc 100644 --- a/llvm/lib/MC/MCParser/ELFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/ELFAsmParser.cpp @@ -12,6 +12,7 @@ #include "llvm/ADT/Twine.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" +#include "llvm/MC/MCExpr.h" #include "llvm/MC/MCParser/MCAsmLexer.h" #include "llvm/MC/MCSectionELF.h" #include "llvm/MC/MCStreamer.h" @@ -51,6 +52,7 @@ public: AddDirectiveHandler<&ELFAsmParser::ParseDirectivePrevious>(".previous"); AddDirectiveHandler<&ELFAsmParser::ParseDirectiveType>(".type"); AddDirectiveHandler<&ELFAsmParser::ParseDirectiveIdent>(".ident"); + AddDirectiveHandler<&ELFAsmParser::ParseDirectiveSymver>(".symver"); } // FIXME: Part of this logic is duplicated in the MCELFStreamer. What is @@ -116,6 +118,7 @@ public: bool ParseDirectivePrevious(StringRef, SMLoc); bool ParseDirectiveType(StringRef, SMLoc); bool ParseDirectiveIdent(StringRef, SMLoc); + bool ParseDirectiveSymver(StringRef, SMLoc); private: bool ParseSectionName(StringRef &SectionName); @@ -377,6 +380,33 @@ bool ELFAsmParser::ParseDirectiveIdent(StringRef, SMLoc) { return false; } +/// ParseDirectiveSymver +/// ::= .symver foo, bar2@zed +bool ELFAsmParser::ParseDirectiveSymver(StringRef, SMLoc) { + StringRef Name; + if (getParser().ParseIdentifier(Name)) + return TokError("expected identifier in directive"); + + if (getLexer().isNot(AsmToken::Comma)) + return TokError("expected a comma"); + + Lex(); + + StringRef AliasName; + if (getParser().ParseIdentifier(AliasName)) + return TokError("expected identifier in directive"); + + if (AliasName.find('@') == StringRef::npos) + return TokError("expected a '@' in the name"); + + MCSymbol *Alias = getContext().GetOrCreateSymbol(AliasName); + MCSymbol *Sym = getContext().GetOrCreateSymbol(Name); + const MCExpr *Value = MCSymbolRefExpr::Create(Sym, getContext()); + + getStreamer().EmitAssignment(Alias, Value); + return false; +} + namespace llvm { MCAsmParserExtension *createELFAsmParser() { |

