brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 299d4b4 Raw
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