xref: /freebsd/contrib/llvm-project/llvm/lib/MC/MCParser/MCAsmParserExtension.cpp (revision 5ffd83dbcc34f10e07f6d3e968ae6365869615f4)
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