1 //===- MCAsmParserExtension.cpp - Asm Parser Hooks ------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/MC/MCParser/MCAsmParserExtension.h" 10 #include "llvm/MC/MCContext.h" 11 #include "llvm/MC/MCExpr.h" 12 #include "llvm/MC/MCParser/MCAsmLexer.h" 13 #include "llvm/MC/MCStreamer.h" 14 15 using namespace llvm; 16 17 MCAsmParserExtension::MCAsmParserExtension() = default; 18 19 MCAsmParserExtension::~MCAsmParserExtension() = default; 20 21 void MCAsmParserExtension::Initialize(MCAsmParser &Parser) { 22 this->Parser = &Parser; 23 } 24 25 /// ParseDirectiveCGProfile 26 /// ::= .cg_profile identifier, identifier, <number> 27 bool MCAsmParserExtension::ParseDirectiveCGProfile(StringRef, SMLoc) { 28 StringRef From; 29 SMLoc FromLoc = getLexer().getLoc(); 30 if (getParser().parseIdentifier(From)) 31 return TokError("expected identifier in directive"); 32 33 if (getLexer().isNot(AsmToken::Comma)) 34 return TokError("expected a comma"); 35 Lex(); 36 37 StringRef To; 38 SMLoc ToLoc = getLexer().getLoc(); 39 if (getParser().parseIdentifier(To)) 40 return TokError("expected identifier in directive"); 41 42 if (getLexer().isNot(AsmToken::Comma)) 43 return TokError("expected a comma"); 44 Lex(); 45 46 int64_t Count; 47 if (getParser().parseIntToken( 48 Count, "expected integer count in '.cg_profile' directive")) 49 return true; 50 51 if (getLexer().isNot(AsmToken::EndOfStatement)) 52 return TokError("unexpected token in directive"); 53 54 MCSymbol *FromSym = getContext().getOrCreateSymbol(From); 55 MCSymbol *ToSym = getContext().getOrCreateSymbol(To); 56 57 getStreamer().emitCGProfileEntry( 58 MCSymbolRefExpr::create(FromSym, MCSymbolRefExpr::VK_None, getContext(), 59 FromLoc), 60 MCSymbolRefExpr::create(ToSym, MCSymbolRefExpr::VK_None, getContext(), 61 ToLoc), 62 Count); 63 return false; 64 } 65