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
|
/*========================== begin_copyright_notice ============================
Copyright (C) 2018-2021 Intel Corporation
SPDX-License-Identifier: MIT
============================= end_copyright_notice ===========================*/
#pragma once
#include "common/LLVMWarningsPush.hpp"
#include <llvm/IR/Instructions.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/Type.h>
#include <llvm/Transforms/Utils/ValueMapper.h>
#include <llvm/Transforms/Utils/Cloning.h>
#include <llvm/ADT/MapVector.h>
#include "common/LLVMWarningsPop.hpp"
class FunctionUpgrader
{
private:
llvm::Function* m_pFunction;
// map place holder argument with the real argument
llvm::MapVector<llvm::LoadInst*, llvm::Argument*> m_pNewArguments;
std::vector<llvm::LoadInst*> m_placeHolders;
llvm::FunctionType* UpgradeFunctionTypeWithNewArgs();
llvm::Function* UpgradeFunctionWithNewArgs();
void CleanPlaceHoldersArgs();
public:
void SetFunctionToUpgrade(llvm::Function* pFunction);
void Clean();
int SizeArgFromRebuild();
bool IsUsedPlacedHolder(llvm::Value* PlaceHolderToCheck);
llvm::Argument* GetArgumentFromRebuild(llvm::Value* pPlaceHolderArg);
llvm::Argument* GetArgumentFromRebuild(llvm::LoadInst* pPlaceHolderArg);
std::vector<llvm::LoadInst*> GetPlaceholderVec();
llvm::Value* AddArgument(llvm::StringRef argName, llvm::Type* argType);
uint32_t GetArgumentsSize();
llvm::Function* RebuildFunction();
bool NeedToRebuild();
};
|