44 cl::desc(
"Removes debug compile units which reference "
45 "to non-existing global constants"));
57 assert(
C->use_empty() &&
"Constant is not dead!");
63 if (!GV->hasLocalLinkage())
return;
64 GV->eraseFromParent();
84 Value *V = VN.getValue();
86 if (!PreserveDbgInfo || !V->getName().starts_with(
"llvm.dbg"))
89 for (
Value *V : ToStrip)
96 StructTypes.
run(M,
false);
99 if (STy->isLiteral() || STy->getName().empty())
continue;
101 if (PreserveDbgInfo && STy->getName().starts_with(
"llvm.dbg"))
111 if (!LLVMUsed)
return;
112 UsedValues.
insert(LLVMUsed);
127 findUsedValues(M.getGlobalVariable(
"llvm.compiler.used"), llvmUsedValues);
130 if (GV.hasLocalLinkage() && !llvmUsedValues.
contains(&GV))
131 if (!PreserveDbgInfo || !GV.getName().starts_with(
"llvm.dbg"))
136 if (
I.hasLocalLinkage() && !llvmUsedValues.
contains(&
I))
137 if (!PreserveDbgInfo || !
I.getName().starts_with(
"llvm.dbg"))
139 if (
auto *Symtab =
I.getValueSymbolTable())
152 std::vector<Constant*> DeadConstants;
159 assert(CI->
use_empty() &&
"llvm.dbg intrinsic should have void result");
163 DeadConstants.push_back(
C);
169 DeadConstants.push_back(
C);
174 while (!DeadConstants.empty()) {
176 DeadConstants.pop_back();
178 if (GV->hasLocalLinkage())
205 std::set<DIGlobalVariableExpression *> LiveGVs;
208 GV.getDebugInfo(GVEs);
209 for (
auto *GVE : GVEs)
213 std::set<DICompileUnit *> LiveCUs;
215 for (
const Function &
F : M.functions()) {
222 LiveCUs.insert(FoundCUs.begin(), FoundCUs.end());
224 bool HasDeadCUs =
false;
227 bool GlobalVariableChange =
false;
228 for (
auto *DIG : DIC->getGlobalVariables()) {
229 if (DIG->getExpression() && DIG->getExpression()->isConstant() &&
234 if (!VisitedSet.
insert(DIG).second)
238 if (LiveGVs.count(DIG))
241 GlobalVariableChange =
true;
244 if (!LiveGlobalVariables.
empty())
246 else if (!LiveCUs.count(DIC))
251 if (GlobalVariableChange) {
252 DIC->replaceGlobalVariables(
MDTuple::get(
C, LiveGlobalVariables));
257 LiveGlobalVariables.
clear();
262 NamedMDNode *NMD = M.getOrInsertNamedMetadata(
"llvm.dbg.cu");
264 if (!LiveCUs.empty()) {
313 for (
Metadata *Edge : CGProf->operands()) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Expand Atomic instructions
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
static bool stripDeadDebugInfoImpl(Module &M)
static bool stripDebugDeclareImpl(Module &M)
static bool OnlyUsedBy(Value *V, Value *Usr)
OnlyUsedBy - Return true if V is only used by Usr.
static cl::opt< bool > StripGlobalConstants("strip-global-constants", cl::init(false), cl::Hidden, cl::desc("Removes debug compile units which reference " "to non-existing global constants"))
static void findUsedValues(GlobalVariable *LLVMUsed, SmallPtrSetImpl< const GlobalValue * > &UsedValues)
Find values that are marked as llvm.used.
static void StripSymtab(ValueSymbolTable &ST, bool PreserveDbgInfo)
static void StripTypeNames(Module &M, bool PreserveDbgInfo)
static bool StripSymbolNames(Module &M, bool PreserveDbgInfo)
StripSymbolNames - Strip symbol names.
static void RemoveDeadConstant(Constant *C)
Represents analyses that only rely on functions' control flow.
Value * getArgOperand(unsigned i) const
This class represents a function call, abstracting a target machine's calling convention.
ConstantArray - Constant Array Declarations.
This is an important base class in LLVM.
Utility to find all debug info in a module.
LLVM_ABI void processInstruction(const Module &M, const Instruction &I)
Process a single instruction and collect debug info anchors.
LLVM_ABI void processSubprogram(DISubprogram *SP)
Process subprogram.
iterator_range< compile_unit_iterator > compile_units() const
Implements a dense probed hash-table based set.
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
This is an important class for using LLVM in a threaded context.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a distinct node.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
A Module instance is used to store all the information related to an LLVM module.
@ Append
Appends the two values, which are required to be metadata nodes.
LLVM_ABI void clearOperands()
Drop all references to this node's operands.
LLVM_ABI void addOperand(MDNode *M)
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Class to represent struct types.
TypeFinder - Walk over a module, identifying all of the types that are used by the module.
void run(const Module &M, bool onlyNamed)
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
This class provides a symbol table of name/value pairs.
LLVM Value Representation.
iterator_range< user_iterator > users()
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
std::pair< iterator, bool > insert(const ValueT &V)
@ C
The default llvm calling convention, compatible with C.
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
StringMapEntry< Value * > ValueName
LLVM_ABI bool RecursivelyDeleteTriviallyDeadInstructions(Value *V, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
If the specified value is a trivially dead instruction, delete it.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto cast_or_null(const Y &Val)
auto dyn_cast_or_null(const Y &Val)
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)