23#define DEBUG_TYPE "ctor_utils"
33 if (!CtorsToRemove.
test(
I))
63static std::vector<std::pair<uint32_t, Function *>>
66 std::vector<std::pair<uint32_t, Function *>> Result;
70 Result.emplace_back(cast<ConstantInt>(CS->
getOperand(0))->getZExtValue(),
94 if (isa<ConstantAggregateZero>(V))
97 if (isa<ConstantPointerNull>(CS->
getOperand(1)))
102 if (!
F ||
F->arg_size() != 0)
116 std::vector<std::pair<uint32_t, Function *>> Ctors =
121 bool MadeChange =
false;
124 std::vector<size_t> CtorsByPriority(Ctors.size());
125 std::iota(CtorsByPriority.begin(), CtorsByPriority.end(), 0);
127 return Ctors[
LHS].first < Ctors[
RHS].first;
129 for (
unsigned CtorIndex : CtorsByPriority) {
130 const uint32_t Priority = Ctors[CtorIndex].first;
138 if (ShouldRemove(Priority,
F)) {
139 Ctors[CtorIndex].second =
nullptr;
140 CtorsToRemove.
set(CtorIndex);
This file implements the BitVector class.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static void removeGlobalCtors(GlobalVariable *GCL, const BitVector &CtorsToRemove)
Given a specified llvm.global_ctors list, remove the listed elements.
static std::vector< std::pair< uint32_t, Function * > > parseGlobalCtors(GlobalVariable *GV)
Given a llvm.global_ctors list that we can understand, return a list of the functions and null termin...
static GlobalVariable * findGlobalCtors(Module &M)
Find the llvm.global_ctors list.
Module.h This file contains the declarations for the Module class.
Type * getElementType() const
bool test(unsigned Idx) const
ConstantArray - Constant Array Declarations.
static Constant * get(ArrayType *T, ArrayRef< Constant * > V)
ArrayType * getType() const
Specialize the getType() method to always return an ArrayType, which reduces the amount of casting ne...
This is an important base class in LLVM.
LinkageTypes getLinkage() const
ThreadLocalMode getThreadLocalMode() const
Module * getParent()
Get the module that this global value is contained inside of...
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
void setInitializer(Constant *InitVal)
setInitializer - Sets the initializer for this global variable, removing any existing initializer if ...
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
bool hasUniqueInitializer() const
hasUniqueInitializer - Whether the global variable has an initializer, and any changes made to the in...
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
A Module instance is used to store all the information related to an LLVM module.
void insertGlobalVariable(GlobalVariable *GV)
Insert global variable GV at the end of the global variable list and take ownership.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
Type * getType() const
All values are typed, get the type of this value.
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
void takeName(Value *V)
Transfer the name from V to this value.
An efficient, type-erasing, non-owning reference to a callable.
self_iterator getIterator()
This is an optimization pass for GlobalISel generic memory operations.
void stable_sort(R &&Range)
bool optimizeGlobalCtorsList(Module &M, function_ref< bool(uint32_t, Function *)> ShouldRemove)
Call "ShouldRemove" for every entry in M's global_ctor list and remove the entries for which it retur...
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.