Path: blob/main/contrib/llvm-project/llvm/lib/IRReader/IRReader.cpp
35233 views
//===---- IRReader.cpp - Reader for LLVM IR files -------------------------===//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//===----------------------------------------------------------------------===//78#include "llvm/IRReader/IRReader.h"9#include "llvm-c/IRReader.h"10#include "llvm/AsmParser/Parser.h"11#include "llvm/Bitcode/BitcodeReader.h"12#include "llvm/IR/LLVMContext.h"13#include "llvm/IR/Module.h"14#include "llvm/Support/MemoryBuffer.h"15#include "llvm/Support/SourceMgr.h"16#include "llvm/Support/Timer.h"17#include "llvm/Support/raw_ostream.h"18#include <optional>19#include <system_error>2021using namespace llvm;2223namespace llvm {24extern bool TimePassesIsEnabled;25}2627const char TimeIRParsingGroupName[] = "irparse";28const char TimeIRParsingGroupDescription[] = "LLVM IR Parsing";29const char TimeIRParsingName[] = "parse";30const char TimeIRParsingDescription[] = "Parse IR";3132std::unique_ptr<Module>33llvm::getLazyIRModule(std::unique_ptr<MemoryBuffer> Buffer, SMDiagnostic &Err,34LLVMContext &Context, bool ShouldLazyLoadMetadata) {35if (isBitcode((const unsigned char *)Buffer->getBufferStart(),36(const unsigned char *)Buffer->getBufferEnd())) {37Expected<std::unique_ptr<Module>> ModuleOrErr = getOwningLazyBitcodeModule(38std::move(Buffer), Context, ShouldLazyLoadMetadata);39if (Error E = ModuleOrErr.takeError()) {40handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) {41Err = SMDiagnostic(Buffer->getBufferIdentifier(), SourceMgr::DK_Error,42EIB.message());43});44return nullptr;45}46return std::move(ModuleOrErr.get());47}4849return parseAssembly(Buffer->getMemBufferRef(), Err, Context);50}5152std::unique_ptr<Module> llvm::getLazyIRFileModule(StringRef Filename,53SMDiagnostic &Err,54LLVMContext &Context,55bool ShouldLazyLoadMetadata) {56ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =57MemoryBuffer::getFileOrSTDIN(Filename);58if (std::error_code EC = FileOrErr.getError()) {59Err = SMDiagnostic(Filename, SourceMgr::DK_Error,60"Could not open input file: " + EC.message());61return nullptr;62}6364return getLazyIRModule(std::move(FileOrErr.get()), Err, Context,65ShouldLazyLoadMetadata);66}6768std::unique_ptr<Module> llvm::parseIR(MemoryBufferRef Buffer, SMDiagnostic &Err,69LLVMContext &Context,70ParserCallbacks Callbacks) {71NamedRegionTimer T(TimeIRParsingName, TimeIRParsingDescription,72TimeIRParsingGroupName, TimeIRParsingGroupDescription,73TimePassesIsEnabled);74if (isBitcode((const unsigned char *)Buffer.getBufferStart(),75(const unsigned char *)Buffer.getBufferEnd())) {76Expected<std::unique_ptr<Module>> ModuleOrErr =77parseBitcodeFile(Buffer, Context, Callbacks);78if (Error E = ModuleOrErr.takeError()) {79handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) {80Err = SMDiagnostic(Buffer.getBufferIdentifier(), SourceMgr::DK_Error,81EIB.message());82});83return nullptr;84}85return std::move(ModuleOrErr.get());86}8788return parseAssembly(Buffer, Err, Context, nullptr,89Callbacks.DataLayout.value_or(90[](StringRef, StringRef) { return std::nullopt; }));91}9293std::unique_ptr<Module> llvm::parseIRFile(StringRef Filename, SMDiagnostic &Err,94LLVMContext &Context,95ParserCallbacks Callbacks) {96ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =97MemoryBuffer::getFileOrSTDIN(Filename, /*IsText=*/true);98if (std::error_code EC = FileOrErr.getError()) {99Err = SMDiagnostic(Filename, SourceMgr::DK_Error,100"Could not open input file: " + EC.message());101return nullptr;102}103104return parseIR(FileOrErr.get()->getMemBufferRef(), Err, Context, Callbacks);105}106107//===----------------------------------------------------------------------===//108// C API.109//===----------------------------------------------------------------------===//110111LLVMBool LLVMParseIRInContext(LLVMContextRef ContextRef,112LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,113char **OutMessage) {114SMDiagnostic Diag;115116std::unique_ptr<MemoryBuffer> MB(unwrap(MemBuf));117*OutM =118wrap(parseIR(MB->getMemBufferRef(), Diag, *unwrap(ContextRef)).release());119120if(!*OutM) {121if (OutMessage) {122std::string buf;123raw_string_ostream os(buf);124125Diag.print(nullptr, os, false);126os.flush();127128*OutMessage = strdup(buf.c_str());129}130return 1;131}132133return 0;134}135136137