23#define DEBUG_TYPE "ctor_utils"
33 if (!CtorsToRemove.
test(
I))
57 if (V->getType() != GCL->
getType())
66static std::vector<std::pair<uint32_t, Function *>>
69 std::vector<std::pair<uint32_t, Function *>> Result;
73 Result.emplace_back(cast<ConstantInt>(CS->
getOperand(0))->getZExtValue(),
97 if (isa<ConstantAggregateZero>(V))
100 if (isa<ConstantPointerNull>(CS->
getOperand(1)))
105 if (!
F ||
F->arg_size() != 0)
119 std::vector<std::pair<uint32_t, Function *>> Ctors =
124 bool MadeChange =
false;
127 std::vector<size_t> CtorsByPriority(Ctors.size());
128 std::iota(CtorsByPriority.begin(), CtorsByPriority.end(), 0);
130 return Ctors[
LHS].first < Ctors[
RHS].first;
132 for (
unsigned CtorIndex : CtorsByPriority) {
133 const uint32_t Priority = Ctors[CtorIndex].first;
141 if (ShouldRemove(Priority,
F)) {
142 Ctors[CtorIndex].second =
nullptr;
143 CtorsToRemove.
set(CtorIndex);
This file implements the BitVector class.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
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...
static Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
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...
PointerType * getType() const
Global values are always pointers.
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.