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" 10*5ffd83dbSDimitry Andric #include "llvm/MC/MCContext.h" 11*5ffd83dbSDimitry Andric #include "llvm/MC/MCStreamer.h" 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric using namespace llvm; 140b57cec5SDimitry Andric 150b57cec5SDimitry Andric MCAsmParserExtension::MCAsmParserExtension() = default; 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric MCAsmParserExtension::~MCAsmParserExtension() = default; 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric void MCAsmParserExtension::Initialize(MCAsmParser &Parser) { 200b57cec5SDimitry Andric this->Parser = &Parser; 210b57cec5SDimitry Andric } 22*5ffd83dbSDimitry Andric 23*5ffd83dbSDimitry Andric /// ParseDirectiveCGProfile 24*5ffd83dbSDimitry Andric /// ::= .cg_profile identifier, identifier, <number> 25*5ffd83dbSDimitry Andric bool MCAsmParserExtension::ParseDirectiveCGProfile(StringRef, SMLoc) { 26*5ffd83dbSDimitry Andric StringRef From; 27*5ffd83dbSDimitry Andric SMLoc FromLoc = getLexer().getLoc(); 28*5ffd83dbSDimitry Andric if (getParser().parseIdentifier(From)) 29*5ffd83dbSDimitry Andric return TokError("expected identifier in directive"); 30*5ffd83dbSDimitry Andric 31*5ffd83dbSDimitry Andric if (getLexer().isNot(AsmToken::Comma)) 32*5ffd83dbSDimitry Andric return TokError("expected a comma"); 33*5ffd83dbSDimitry Andric Lex(); 34*5ffd83dbSDimitry Andric 35*5ffd83dbSDimitry Andric StringRef To; 36*5ffd83dbSDimitry Andric SMLoc ToLoc = getLexer().getLoc(); 37*5ffd83dbSDimitry Andric if (getParser().parseIdentifier(To)) 38*5ffd83dbSDimitry Andric return TokError("expected identifier in directive"); 39*5ffd83dbSDimitry Andric 40*5ffd83dbSDimitry Andric if (getLexer().isNot(AsmToken::Comma)) 41*5ffd83dbSDimitry Andric return TokError("expected a comma"); 42*5ffd83dbSDimitry Andric Lex(); 43*5ffd83dbSDimitry Andric 44*5ffd83dbSDimitry Andric int64_t Count; 45*5ffd83dbSDimitry Andric if (getParser().parseIntToken( 46*5ffd83dbSDimitry Andric Count, "expected integer count in '.cg_profile' directive")) 47*5ffd83dbSDimitry Andric return true; 48*5ffd83dbSDimitry Andric 49*5ffd83dbSDimitry Andric if (getLexer().isNot(AsmToken::EndOfStatement)) 50*5ffd83dbSDimitry Andric return TokError("unexpected token in directive"); 51*5ffd83dbSDimitry Andric 52*5ffd83dbSDimitry Andric MCSymbol *FromSym = getContext().getOrCreateSymbol(From); 53*5ffd83dbSDimitry Andric MCSymbol *ToSym = getContext().getOrCreateSymbol(To); 54*5ffd83dbSDimitry Andric 55*5ffd83dbSDimitry Andric getStreamer().emitCGProfileEntry( 56*5ffd83dbSDimitry Andric MCSymbolRefExpr::create(FromSym, MCSymbolRefExpr::VK_None, getContext(), 57*5ffd83dbSDimitry Andric FromLoc), 58*5ffd83dbSDimitry Andric MCSymbolRefExpr::create(ToSym, MCSymbolRefExpr::VK_None, getContext(), 59*5ffd83dbSDimitry Andric ToLoc), 60*5ffd83dbSDimitry Andric Count); 61*5ffd83dbSDimitry Andric return false; 62*5ffd83dbSDimitry Andric } 63