xref: /freebsd-src/contrib/llvm-project/llvm/lib/MC/MCParser/MCAsmParserExtension.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
10b57cec5SDimitry Andric //===- MCAsmParserExtension.cpp - Asm Parser Hooks ------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "llvm/MC/MCParser/MCAsmParserExtension.h"
105ffd83dbSDimitry Andric #include "llvm/MC/MCContext.h"
11*81ad6265SDimitry Andric #include "llvm/MC/MCExpr.h"
12*81ad6265SDimitry Andric #include "llvm/MC/MCParser/MCAsmLexer.h"
135ffd83dbSDimitry Andric #include "llvm/MC/MCStreamer.h"
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric using namespace llvm;
160b57cec5SDimitry Andric 
170b57cec5SDimitry Andric MCAsmParserExtension::MCAsmParserExtension() = default;
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric MCAsmParserExtension::~MCAsmParserExtension() = default;
200b57cec5SDimitry Andric 
Initialize(MCAsmParser & Parser)210b57cec5SDimitry Andric void MCAsmParserExtension::Initialize(MCAsmParser &Parser) {
220b57cec5SDimitry Andric   this->Parser = &Parser;
230b57cec5SDimitry Andric }
245ffd83dbSDimitry Andric 
255ffd83dbSDimitry Andric /// ParseDirectiveCGProfile
265ffd83dbSDimitry Andric ///  ::= .cg_profile identifier, identifier, <number>
ParseDirectiveCGProfile(StringRef,SMLoc)275ffd83dbSDimitry Andric bool MCAsmParserExtension::ParseDirectiveCGProfile(StringRef, SMLoc) {
285ffd83dbSDimitry Andric   StringRef From;
295ffd83dbSDimitry Andric   SMLoc FromLoc = getLexer().getLoc();
305ffd83dbSDimitry Andric   if (getParser().parseIdentifier(From))
315ffd83dbSDimitry Andric     return TokError("expected identifier in directive");
325ffd83dbSDimitry Andric 
335ffd83dbSDimitry Andric   if (getLexer().isNot(AsmToken::Comma))
345ffd83dbSDimitry Andric     return TokError("expected a comma");
355ffd83dbSDimitry Andric   Lex();
365ffd83dbSDimitry Andric 
375ffd83dbSDimitry Andric   StringRef To;
385ffd83dbSDimitry Andric   SMLoc ToLoc = getLexer().getLoc();
395ffd83dbSDimitry Andric   if (getParser().parseIdentifier(To))
405ffd83dbSDimitry Andric     return TokError("expected identifier in directive");
415ffd83dbSDimitry Andric 
425ffd83dbSDimitry Andric   if (getLexer().isNot(AsmToken::Comma))
435ffd83dbSDimitry Andric     return TokError("expected a comma");
445ffd83dbSDimitry Andric   Lex();
455ffd83dbSDimitry Andric 
465ffd83dbSDimitry Andric   int64_t Count;
475ffd83dbSDimitry Andric   if (getParser().parseIntToken(
485ffd83dbSDimitry Andric           Count, "expected integer count in '.cg_profile' directive"))
495ffd83dbSDimitry Andric     return true;
505ffd83dbSDimitry Andric 
515ffd83dbSDimitry Andric   if (getLexer().isNot(AsmToken::EndOfStatement))
525ffd83dbSDimitry Andric     return TokError("unexpected token in directive");
535ffd83dbSDimitry Andric 
545ffd83dbSDimitry Andric   MCSymbol *FromSym = getContext().getOrCreateSymbol(From);
555ffd83dbSDimitry Andric   MCSymbol *ToSym = getContext().getOrCreateSymbol(To);
565ffd83dbSDimitry Andric 
575ffd83dbSDimitry Andric   getStreamer().emitCGProfileEntry(
585ffd83dbSDimitry Andric       MCSymbolRefExpr::create(FromSym, MCSymbolRefExpr::VK_None, getContext(),
595ffd83dbSDimitry Andric                               FromLoc),
605ffd83dbSDimitry Andric       MCSymbolRefExpr::create(ToSym, MCSymbolRefExpr::VK_None, getContext(),
615ffd83dbSDimitry Andric                               ToLoc),
625ffd83dbSDimitry Andric       Count);
635ffd83dbSDimitry Andric   return false;
645ffd83dbSDimitry Andric }
65