Path: blob/main/contrib/llvm-project/llvm/lib/AsmParser/Parser.cpp
35233 views
//===- Parser.cpp - Main dispatch module for the Parser library -----------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This library implements the functionality defined in llvm/AsmParser/Parser.h9//10//===----------------------------------------------------------------------===//1112#include "llvm/AsmParser/Parser.h"13#include "llvm/AsmParser/LLParser.h"14#include "llvm/IR/DebugInfoMetadata.h"15#include "llvm/IR/Module.h"16#include "llvm/IR/ModuleSummaryIndex.h"17#include "llvm/Support/MemoryBuffer.h"18#include "llvm/Support/SourceMgr.h"19#include <system_error>2021using namespace llvm;2223static bool parseAssemblyInto(MemoryBufferRef F, Module *M,24ModuleSummaryIndex *Index, SMDiagnostic &Err,25SlotMapping *Slots, bool UpgradeDebugInfo,26DataLayoutCallbackTy DataLayoutCallback) {27SourceMgr SM;28std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(F);29SM.AddNewSourceBuffer(std::move(Buf), SMLoc());3031std::optional<LLVMContext> OptContext;32return LLParser(F.getBuffer(), SM, Err, M, Index,33M ? M->getContext() : OptContext.emplace(), Slots)34.Run(UpgradeDebugInfo, DataLayoutCallback);35}3637bool llvm::parseAssemblyInto(MemoryBufferRef F, Module *M,38ModuleSummaryIndex *Index, SMDiagnostic &Err,39SlotMapping *Slots,40DataLayoutCallbackTy DataLayoutCallback) {41return ::parseAssemblyInto(F, M, Index, Err, Slots,42/*UpgradeDebugInfo*/ true, DataLayoutCallback);43}4445std::unique_ptr<Module>46llvm::parseAssembly(MemoryBufferRef F, SMDiagnostic &Err, LLVMContext &Context,47SlotMapping *Slots,48DataLayoutCallbackTy DataLayoutCallback) {49std::unique_ptr<Module> M =50std::make_unique<Module>(F.getBufferIdentifier(), Context);5152if (parseAssemblyInto(F, M.get(), nullptr, Err, Slots, DataLayoutCallback))53return nullptr;5455return M;56}5758std::unique_ptr<Module> llvm::parseAssemblyFile(StringRef Filename,59SMDiagnostic &Err,60LLVMContext &Context,61SlotMapping *Slots) {62ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =63MemoryBuffer::getFileOrSTDIN(Filename);64if (std::error_code EC = FileOrErr.getError()) {65Err = SMDiagnostic(Filename, SourceMgr::DK_Error,66"Could not open input file: " + EC.message());67return nullptr;68}6970return parseAssembly(FileOrErr.get()->getMemBufferRef(), Err, Context, Slots);71}7273static ParsedModuleAndIndex74parseAssemblyWithIndex(MemoryBufferRef F, SMDiagnostic &Err,75LLVMContext &Context, SlotMapping *Slots,76bool UpgradeDebugInfo,77DataLayoutCallbackTy DataLayoutCallback) {78std::unique_ptr<Module> M =79std::make_unique<Module>(F.getBufferIdentifier(), Context);80std::unique_ptr<ModuleSummaryIndex> Index =81std::make_unique<ModuleSummaryIndex>(/*HaveGVs=*/true);8283if (parseAssemblyInto(F, M.get(), Index.get(), Err, Slots, UpgradeDebugInfo,84DataLayoutCallback))85return {nullptr, nullptr};8687return {std::move(M), std::move(Index)};88}8990ParsedModuleAndIndex llvm::parseAssemblyWithIndex(MemoryBufferRef F,91SMDiagnostic &Err,92LLVMContext &Context,93SlotMapping *Slots) {94return ::parseAssemblyWithIndex(95F, Err, Context, Slots,96/*UpgradeDebugInfo*/ true,97[](StringRef, StringRef) { return std::nullopt; });98}99100static ParsedModuleAndIndex101parseAssemblyFileWithIndex(StringRef Filename, SMDiagnostic &Err,102LLVMContext &Context, SlotMapping *Slots,103bool UpgradeDebugInfo,104DataLayoutCallbackTy DataLayoutCallback) {105ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =106MemoryBuffer::getFileOrSTDIN(Filename, /*IsText=*/true);107if (std::error_code EC = FileOrErr.getError()) {108Err = SMDiagnostic(Filename, SourceMgr::DK_Error,109"Could not open input file: " + EC.message());110return {nullptr, nullptr};111}112113return parseAssemblyWithIndex(FileOrErr.get()->getMemBufferRef(), Err,114Context, Slots, UpgradeDebugInfo,115DataLayoutCallback);116}117118ParsedModuleAndIndex119llvm::parseAssemblyFileWithIndex(StringRef Filename, SMDiagnostic &Err,120LLVMContext &Context, SlotMapping *Slots,121DataLayoutCallbackTy DataLayoutCallback) {122return ::parseAssemblyFileWithIndex(Filename, Err, Context, Slots,123/*UpgradeDebugInfo*/ true,124DataLayoutCallback);125}126127ParsedModuleAndIndex llvm::parseAssemblyFileWithIndexNoUpgradeDebugInfo(128StringRef Filename, SMDiagnostic &Err, LLVMContext &Context,129SlotMapping *Slots, DataLayoutCallbackTy DataLayoutCallback) {130return ::parseAssemblyFileWithIndex(Filename, Err, Context, Slots,131/*UpgradeDebugInfo*/ false,132DataLayoutCallback);133}134135std::unique_ptr<Module> llvm::parseAssemblyString(StringRef AsmString,136SMDiagnostic &Err,137LLVMContext &Context,138SlotMapping *Slots) {139MemoryBufferRef F(AsmString, "<string>");140return parseAssembly(F, Err, Context, Slots);141}142143static bool parseSummaryIndexAssemblyInto(MemoryBufferRef F,144ModuleSummaryIndex &Index,145SMDiagnostic &Err) {146SourceMgr SM;147std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(F);148SM.AddNewSourceBuffer(std::move(Buf), SMLoc());149150// The parser holds a reference to a context that is unused when parsing the151// index, but we need to initialize it.152LLVMContext unusedContext;153return LLParser(F.getBuffer(), SM, Err, nullptr, &Index, unusedContext)154.Run(true, [](StringRef, StringRef) { return std::nullopt; });155}156157std::unique_ptr<ModuleSummaryIndex>158llvm::parseSummaryIndexAssembly(MemoryBufferRef F, SMDiagnostic &Err) {159std::unique_ptr<ModuleSummaryIndex> Index =160std::make_unique<ModuleSummaryIndex>(/*HaveGVs=*/false);161162if (parseSummaryIndexAssemblyInto(F, *Index, Err))163return nullptr;164165return Index;166}167168std::unique_ptr<ModuleSummaryIndex>169llvm::parseSummaryIndexAssemblyFile(StringRef Filename, SMDiagnostic &Err) {170ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =171MemoryBuffer::getFileOrSTDIN(Filename);172if (std::error_code EC = FileOrErr.getError()) {173Err = SMDiagnostic(Filename, SourceMgr::DK_Error,174"Could not open input file: " + EC.message());175return nullptr;176}177178return parseSummaryIndexAssembly(FileOrErr.get()->getMemBufferRef(), Err);179}180181std::unique_ptr<ModuleSummaryIndex>182llvm::parseSummaryIndexAssemblyString(StringRef AsmString, SMDiagnostic &Err) {183MemoryBufferRef F(AsmString, "<string>");184return parseSummaryIndexAssembly(F, Err);185}186187Constant *llvm::parseConstantValue(StringRef Asm, SMDiagnostic &Err,188const Module &M, const SlotMapping *Slots) {189SourceMgr SM;190std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Asm);191SM.AddNewSourceBuffer(std::move(Buf), SMLoc());192Constant *C;193if (LLParser(Asm, SM, Err, const_cast<Module *>(&M), nullptr, M.getContext())194.parseStandaloneConstantValue(C, Slots))195return nullptr;196return C;197}198199Type *llvm::parseType(StringRef Asm, SMDiagnostic &Err, const Module &M,200const SlotMapping *Slots) {201unsigned Read;202Type *Ty = parseTypeAtBeginning(Asm, Read, Err, M, Slots);203if (!Ty)204return nullptr;205if (Read != Asm.size()) {206SourceMgr SM;207std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Asm);208SM.AddNewSourceBuffer(std::move(Buf), SMLoc());209Err = SM.GetMessage(SMLoc::getFromPointer(Asm.begin() + Read),210SourceMgr::DK_Error, "expected end of string");211return nullptr;212}213return Ty;214}215Type *llvm::parseTypeAtBeginning(StringRef Asm, unsigned &Read,216SMDiagnostic &Err, const Module &M,217const SlotMapping *Slots) {218SourceMgr SM;219std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Asm);220SM.AddNewSourceBuffer(std::move(Buf), SMLoc());221Type *Ty;222if (LLParser(Asm, SM, Err, const_cast<Module *>(&M), nullptr, M.getContext())223.parseTypeAtBeginning(Ty, Read, Slots))224return nullptr;225return Ty;226}227228DIExpression *llvm::parseDIExpressionBodyAtBeginning(StringRef Asm,229unsigned &Read,230SMDiagnostic &Err,231const Module &M,232const SlotMapping *Slots) {233SourceMgr SM;234std::unique_ptr<MemoryBuffer> Buf = MemoryBuffer::getMemBuffer(Asm);235SM.AddNewSourceBuffer(std::move(Buf), SMLoc());236MDNode *MD;237if (LLParser(Asm, SM, Err, const_cast<Module *>(&M), nullptr, M.getContext())238.parseDIExpressionBodyAtBeginning(MD, Read, Slots))239return nullptr;240return dyn_cast<DIExpression>(MD);241}242243244