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