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
15using namespace llvm;
16
17MCAsmParserExtension::MCAsmParserExtension() = default;
18
19MCAsmParserExtension::~MCAsmParserExtension() = default;
20
21void MCAsmParserExtension::Initialize(MCAsmParser &Parser) {
22  this->Parser = &Parser;
23}
24
25/// ParseDirectiveCGProfile
26///  ::= .cg_profile identifier, identifier, <number>
27bool 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