1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
/*========================== begin_copyright_notice ============================
Copyright (C) 2021 Intel Corporation
SPDX-License-Identifier: MIT
============================= end_copyright_notice ===========================*/
#ifndef VC_UTILS_GENERAL_BIF_H
#define VC_UTILS_GENERAL_BIF_H
#include <llvm/IR/Function.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Module.h>
#include <llvm/Support/MemoryBuffer.h>
#include <string>
#include <vector>
namespace vc {
// Decodes binary module provided via \p BiFModuleBuffer. Returns obtained
// llvm::Module. If some errors occured reports fatal error.
// Note: wraps parseBitcodeFile.
std::unique_ptr<llvm::Module>
getBiFModuleOrReportError(llvm::MemoryBufferRef BiFModuleBuffer,
llvm::LLVMContext &Ctx);
// Same as getBiFModuleOrReportError but the decoding is lazy.
// Note: wraps getLazyBitcodeModule.
std::unique_ptr<llvm::Module>
getLazyBiFModuleOrReportError(llvm::MemoryBufferRef BiFModuleBuffer,
llvm::LLVMContext &Ctx);
using FunctionNameSeq = std::vector<std::string>;
// Collect all functions for which predicate \p Pred returns true.
// PredT is a functor that takes const Function &F as an argument and returns
// bool.
template <typename PredT>
FunctionNameSeq collectFunctionNamesIf(const llvm::Module &M, PredT Pred) {
using namespace llvm;
auto Functions = make_filter_range(M.getFunctionList(), Pred);
FunctionNameSeq Names;
llvm::transform(Functions, std::back_inserter(Names),
[](const Function &F) { return F.getName().str(); });
return Names;
}
// Set internal linkage for functions whose name is in \p FuncNames.
// \p FuncNames may contain declarations, they won't be changed. AlwaysInline
// attribute is optionally set.
void internalizeImportedFunctions(const llvm::Module &M,
const FunctionNameSeq &FuncNames,
bool SetAlwaysInline);
} // namespace vc
#endif // VC_UTILS_GENERAL_BIF_H
|