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