83 lines · cpp
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-exception6//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/AsmLexer.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/// parseDirectiveCGProfile26/// ::= .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(Count))48 return true;49 50 if (getLexer().isNot(AsmToken::EndOfStatement))51 return TokError("unexpected token in directive");52 53 MCSymbol *FromSym = getContext().parseSymbol(From);54 MCSymbol *ToSym = getContext().parseSymbol(To);55 56 getStreamer().emitCGProfileEntry(57 MCSymbolRefExpr::create(FromSym, getContext(), FromLoc),58 MCSymbolRefExpr::create(ToSym, getContext(), ToLoc), Count);59 return false;60}61 62bool MCAsmParserExtension::maybeParseUniqueID(int64_t &UniqueID) {63 AsmLexer &L = getLexer();64 if (L.isNot(AsmToken::Comma))65 return false;66 Lex();67 StringRef UniqueStr;68 if (getParser().parseIdentifier(UniqueStr))69 return TokError("expected identifier");70 if (UniqueStr != "unique")71 return TokError("expected 'unique'");72 if (L.isNot(AsmToken::Comma))73 return TokError("expected commma");74 Lex();75 if (getParser().parseAbsoluteExpression(UniqueID))76 return true;77 if (UniqueID < 0)78 return TokError("unique id must be positive");79 if (!isUInt<32>(UniqueID) || UniqueID == ~0U)80 return TokError("unique id is too large");81 return false;82}83