1//===--- ModuleLinker.cpp - Shared bitcode link helpers -------------------===//
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 "clang/CodeGen/ModuleLinker.h"
10
11#include "clang/Basic/CodeGenOptions.h"
12#include "clang/Frontend/CompilerInstance.h"
13#include "llvm/Bitcode/BitcodeReader.h"
14#include "llvm/IR/Module.h"
15
16using namespace clang;
17
18bool clang::loadLinkModules(CompilerInstance &CI, llvm::LLVMContext &Ctx,
19 llvm::SmallVectorImpl<LinkModule> &LinkModules) {
20 if (!LinkModules.empty())
21 return false;
22
23 for (const CodeGenOptions::BitcodeFileToLink &F :
24 CI.getCodeGenOpts().LinkBitcodeFiles) {
25 auto BCBuf = CI.getFileManager().getBufferForFile(Filename: F.Filename);
26 if (!BCBuf) {
27 CI.getDiagnostics().Report(DiagID: diag::err_cannot_open_file)
28 << F.Filename << BCBuf.getError().message();
29 LinkModules.clear();
30 return true;
31 }
32
33 llvm::Expected<std::unique_ptr<llvm::Module>> ModuleOrErr =
34 llvm::getOwningLazyBitcodeModule(Buffer: std::move(*BCBuf), Context&: Ctx);
35 if (!ModuleOrErr) {
36 llvm::handleAllErrors(
37 E: ModuleOrErr.takeError(), Handlers: [&](llvm::ErrorInfoBase &EIB) {
38 CI.getDiagnostics().Report(DiagID: diag::err_cannot_open_file)
39 << F.Filename << EIB.message();
40 });
41 LinkModules.clear();
42 return true;
43 }
44
45 LinkModules.push_back(Elt: {.Module: std::move(ModuleOrErr.get()), .PropagateAttrs: F.PropagateAttrs,
46 .Internalize: F.Internalize, .LinkFlags: F.LinkFlags});
47 }
48 return false;
49}
50