1 /*========================== begin_copyright_notice ============================
2
3 Copyright (C) 2021 Intel Corporation
4
5 SPDX-License-Identifier: MIT
6
7 ============================= end_copyright_notice ===========================*/
8
9 #include "vc/Utils/General/BiF.h"
10
11 #include "Probe/Assertion.h"
12
13 #include <llvm/Bitcode/BitcodeReader.h>
14 #include <llvm/Support/Error.h>
15
16 #include <sstream>
17 #include <utility>
18
19 using namespace llvm;
20
21 template <typename DecoderT>
22 std::unique_ptr<Module>
getBiFModuleOrReportErrorImpl(MemoryBufferRef BiFModuleBuffer,LLVMContext & Ctx,DecoderT Decoder)23 getBiFModuleOrReportErrorImpl(MemoryBufferRef BiFModuleBuffer, LLVMContext &Ctx,
24 DecoderT Decoder) {
25 Expected<std::unique_ptr<Module>> BiFModule = Decoder(BiFModuleBuffer, Ctx);
26 if (!BiFModule) {
27 auto Err = BiFModule.takeError();
28 std::stringstream ErrStream;
29 ErrStream << "BiF module decoding has failed"
30 "because of the following errors:\n";
31 handleAllErrors(std::move(Err),
32 [&ErrStream](const llvm::ErrorInfoBase &EI) {
33 ErrStream << EI.message() << std::endl;
34 });
35 report_fatal_error(ErrStream.str());
36 }
37 return std::move(BiFModule.get());
38 }
39
40 std::unique_ptr<Module>
getBiFModuleOrReportError(MemoryBufferRef BiFModuleBuffer,LLVMContext & Ctx)41 vc::getBiFModuleOrReportError(MemoryBufferRef BiFModuleBuffer,
42 LLVMContext &Ctx) {
43 return getBiFModuleOrReportErrorImpl(
44 BiFModuleBuffer, Ctx,
45 [](MemoryBufferRef BiFModuleBufferIn, LLVMContext &CtxIn) {
46 return parseBitcodeFile(BiFModuleBufferIn, CtxIn);
47 });
48 }
49
50 std::unique_ptr<Module>
getLazyBiFModuleOrReportError(MemoryBufferRef BiFModuleBuffer,LLVMContext & Ctx)51 vc::getLazyBiFModuleOrReportError(MemoryBufferRef BiFModuleBuffer,
52 LLVMContext &Ctx) {
53 return getBiFModuleOrReportErrorImpl(
54 BiFModuleBuffer, Ctx,
55 [](MemoryBufferRef BiFModuleBufferIn, LLVMContext &CtxIn) {
56 return getLazyBitcodeModule(BiFModuleBufferIn, CtxIn);
57 });
58 }
59
internalizeImportedFunctions(const llvm::Module & M,const vc::FunctionNameSeq & FuncNames,bool SetAlwaysInline)60 void vc::internalizeImportedFunctions(const llvm::Module &M,
61 const vc::FunctionNameSeq &FuncNames,
62 bool SetAlwaysInline) {
63 for (auto &Name : FuncNames) {
64 auto *F = M.getFunction(Name);
65 IGC_ASSERT_MESSAGE(F, "Function is expected");
66 if (!F->isDeclaration()) {
67 F->setLinkage(GlobalValue::LinkageTypes::InternalLinkage);
68 if (SetAlwaysInline)
69 F->addFnAttr(Attribute::AlwaysInline);
70 }
71 }
72 }
73