bool OnlyUsedByDbgInfoIntrinsics(Instruction *I,
SmallVectorImpl<DbgInfoIntrinsic *> *DbgInUses = 0);
-/// UserIsDebugInfo - Return true if U is a constant expr used by
-/// llvm.dbg.variable or llvm.dbg.global_variable
-bool UserIsDebugInfo(User *U);
-
-/// RemoveDbgInfoUser - Remove an User which is representing debug info.
-void RemoveDbgInfoUser(User *U);
-
} // End llvm namespace
#endif
return true;
}
-/// UserIsDebugInfo - Return true if U is a constant expr used by
-/// llvm.dbg.variable or llvm.dbg.global_variable
-bool llvm::UserIsDebugInfo(User *U) {
- ConstantExpr *CE = dyn_cast<ConstantExpr>(U);
-
- if (!CE || CE->getNumUses() != 1)
- return false;
-
- Constant *Init = dyn_cast<Constant>(CE->use_back());
- if (!Init || Init->getNumUses() != 1)
- return false;
-
- GlobalVariable *GV = dyn_cast<GlobalVariable>(Init->use_back());
- if (!GV || !GV->hasInitializer() || GV->getInitializer() != Init)
- return false;
-
- DIVariable DV(GV);
- if (!DV.isNull())
- return true; // User is llvm.dbg.variable
-
- DIGlobalVariable DGV(GV);
- if (!DGV.isNull())
- return true; // User is llvm.dbg.global_variable
-
- return false;
-}
-
-/// RemoveDbgInfoUser - Remove an User which is representing debug info.
-void llvm::RemoveDbgInfoUser(User *U) {
- assert (UserIsDebugInfo(U) && "Unexpected User!");
- ConstantExpr *CE = cast<ConstantExpr>(U);
- while (!CE->use_empty()) {
- Constant *C = cast<Constant>(CE->use_back());
- while (!C->use_empty()) {
- GlobalVariable *GV = cast<GlobalVariable>(C->use_back());
- GV->eraseFromParent();
- }
- C->destroyConstant();
- }
- CE->destroyConstant();
-}