LLVM 20.0.0git
|
#include "llvm/Transforms/IPO/MergeFunctions.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/StructuralHash.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/IR/ValueHandle.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/Utils/FunctionComparator.h"
#include "llvm/Transforms/Utils/ModuleUtils.h"
#include <algorithm>
#include <cassert>
#include <iterator>
#include <set>
#include <utility>
#include <vector>
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "mergefunc" |
Functions | |
STATISTIC (NumFunctionsMerged, "Number of functions merged") | |
STATISTIC (NumThunksWritten, "Number of thunks generated") | |
STATISTIC (NumAliasesWritten, "Number of aliases generated") | |
STATISTIC (NumDoubleWeak, "Number of new functions created") | |
static bool | hasDistinctMetadataIntrinsic (const Function &F) |
Check whether F has an intrinsic which references distinct metadata as an operand. | |
static bool | isEligibleForMerging (Function &F) |
Check whether F is eligible for function merging. | |
static Value * | createCast (IRBuilder<> &Builder, Value *V, Type *DestTy) |
static bool | canCreateThunkFor (Function *F) |
Whether this function may be replaced by a forwarding thunk. | |
static void | copyMetadataIfPresent (Function *From, Function *To, StringRef Kind) |
Copy all metadata of a specific kind from one function to another. | |
static bool | canCreateAliasFor (Function *F) |
static bool | isFuncOrderCorrect (const Function *F, const Function *G) |
Variables | |
static cl::opt< unsigned > | NumFunctionsForVerificationCheck ("mergefunc-verify", cl::desc("How many functions in a module could be used for " "MergeFunctions to pass a basic correctness check. " "'0' disables this check. Works only with '-debug' key."), cl::init(0), cl::Hidden) |
static cl::opt< bool > | MergeFunctionsPDI ("mergefunc-preserve-debug-info", cl::Hidden, cl::init(false), cl::desc("Preserve debug info in thunk when mergefunc " "transformations are made.")) |
static cl::opt< bool > | MergeFunctionsAliases ("mergefunc-use-aliases", cl::Hidden, cl::init(false), cl::desc("Allow mergefunc to create aliases")) |
#define DEBUG_TYPE "mergefunc" |
Definition at line 132 of file MergeFunctions.cpp.
Definition at line 817 of file MergeFunctions.cpp.
References assert(), F, and MergeFunctionsAliases.
Whether this function may be replaced by a forwarding thunk.
Definition at line 699 of file MergeFunctions.cpp.
References llvm::dbgs(), F, and LLVM_DEBUG.
Copy all metadata of a specific kind from one function to another.
Definition at line 716 of file MergeFunctions.cpp.
References llvm::GlobalObject::addMetadata(), and From.
Definition at line 489 of file MergeFunctions.cpp.
References assert(), llvm::IRBuilderBase::CreateBitCast(), createCast(), llvm::IRBuilderBase::CreateExtractValue(), llvm::IRBuilderBase::CreateInsertValue(), llvm::IRBuilderBase::CreateIntToPtr(), llvm::IRBuilderBase::CreatePtrToInt(), llvm::PoisonValue::get(), llvm::Type::getStructElementType(), llvm::Type::getStructNumElements(), I, llvm::Type::isIntegerTy(), llvm::Type::isPointerTy(), and llvm::Type::isStructTy().
Referenced by createCast().
Check whether F
has an intrinsic which references distinct metadata as an operand.
The most common instance of this would be CFI checks for function-local types.
Definition at line 388 of file MergeFunctions.cpp.
Referenced by isEligibleForMerging().
Check whether F
is eligible for function merging.
Definition at line 408 of file MergeFunctions.cpp.
References F, and hasDistinctMetadataIntrinsic().
Definition at line 961 of file MergeFunctions.cpp.
STATISTIC | ( | NumAliasesWritten | , |
"Number of aliases generated" | |||
) |
STATISTIC | ( | NumDoubleWeak | , |
"Number of new functions created" | |||
) |
STATISTIC | ( | NumFunctionsMerged | , |
"Number of functions merged" | |||
) |
STATISTIC | ( | NumThunksWritten | , |
"Number of thunks generated" | |||
) |
|
static |
Referenced by canCreateAliasFor().
|
static |
|
static |