50 if (!V->isUsedByMetadata())
60 for (
User *U : MDV->users())
61 if (
auto *DDI = dyn_cast<DbgDeclareInst>(U))
69 if (!V->isUsedByMetadata())
77 if (DVR->getType() == DbgVariableRecord::LocationType::Declare)
86 if (!V->isUsedByMetadata())
94 if (DVR->isValueOfVariable())
100template <
typename IntrinsicT,
bool DbgAssignAndValuesOnly>
106 if (!V->isUsedByMetadata())
119 auto AppendUsers = [&Ctx, &EncounteredIntrinsics,
120 &EncounteredDbgVariableRecords, &Result,
123 for (
User *U : MDV->users())
124 if (IntrinsicT *DVI = dyn_cast<IntrinsicT>(U))
125 if (EncounteredIntrinsics.
insert(DVI).second)
126 Result.push_back(DVI);
128 if (!DbgVariableRecords)
133 if (!DbgAssignAndValuesOnly || DVR->isDbgValue() || DVR->isDbgAssign())
134 if (EncounteredDbgVariableRecords.
insert(DVR).second)
142 for (
Metadata *AL : L->getAllArgListUsers()) {
144 if (!DbgVariableRecords)
148 if (!DbgAssignAndValuesOnly || DVR->isDbgValue() || DVR->isDbgAssign())
149 if (EncounteredDbgVariableRecords.
insert(DVR).second)
159 DbgValues, V, DbgVariableRecords);
166 DbgUsers, V, DbgVariableRecords);
170 if (
auto *LocalScope = dyn_cast_or_null<DILocalScope>(Scope))
184 return DILocation::get(DII->
getContext(), 0, 0, Scope, InlinedAt);
196 return DILocation::get(DVR->
getContext(), 0, 0, Scope, InlinedAt);
213 for (
auto *
CU : M.debug_compile_units())
214 processCompileUnit(
CU);
215 for (
auto &
F : M.functions()) {
216 if (
auto *SP = cast_or_null<DISubprogram>(
F.getSubprogram()))
227 if (!addCompileUnit(
CU))
229 for (
auto *DIG :
CU->getGlobalVariables()) {
230 if (!addGlobalVariable(DIG))
232 auto *GV = DIG->getVariable();
233 processScope(GV->getScope());
234 processType(GV->getType());
236 for (
auto *ET :
CU->getEnumTypes())
238 for (
auto *RT :
CU->getRetainedTypes())
239 if (
auto *
T = dyn_cast<DIType>(RT))
243 for (
auto *
Import :
CU->getImportedEntities()) {
244 auto *Entity =
Import->getEntity();
245 if (
auto *
T = dyn_cast<DIType>(Entity))
247 else if (
auto *SP = dyn_cast<DISubprogram>(Entity))
249 else if (
auto *NS = dyn_cast<DINamespace>(Entity))
250 processScope(NS->getScope());
251 else if (
auto *M = dyn_cast<DIModule>(Entity))
252 processScope(M->getScope());
258 if (
auto *DVI = dyn_cast<DbgVariableIntrinsic>(&
I))
261 if (
auto DbgLoc =
I.getDebugLoc())
264 for (
const DbgRecord &DPR :
I.getDbgRecordRange())
271 processScope(Loc->getScope());
281void DebugInfoFinder::processType(
DIType *DT) {
284 processScope(DT->getScope());
285 if (
auto *ST = dyn_cast<DISubroutineType>(DT)) {
290 if (
auto *DCT = dyn_cast<DICompositeType>(DT)) {
291 processType(DCT->getBaseType());
293 if (
auto *
T = dyn_cast<DIType>(
D))
295 else if (
auto *SP = dyn_cast<DISubprogram>(
D))
300 if (
auto *DDT = dyn_cast<DIDerivedType>(DT)) {
301 processType(DDT->getBaseType());
305void DebugInfoFinder::processScope(
DIScope *Scope) {
308 if (
auto *Ty = dyn_cast<DIType>(Scope)) {
312 if (
auto *
CU = dyn_cast<DICompileUnit>(Scope)) {
316 if (
auto *SP = dyn_cast<DISubprogram>(Scope)) {
320 if (!addScope(Scope))
322 if (
auto *LB = dyn_cast<DILexicalBlockBase>(Scope)) {
323 processScope(LB->getScope());
324 }
else if (
auto *NS = dyn_cast<DINamespace>(Scope)) {
325 processScope(NS->getScope());
326 }
else if (
auto *M = dyn_cast<DIModule>(Scope)) {
327 processScope(
M->getScope());
332 if (!addSubprogram(SP))
343 processCompileUnit(SP->getUnit());
344 processType(SP->getType());
345 for (
auto *Element : SP->getTemplateParams()) {
346 if (
auto *TType = dyn_cast<DITemplateTypeParameter>(Element)) {
347 processType(TType->getType());
348 }
else if (
auto *TVal = dyn_cast<DITemplateValueParameter>(Element)) {
349 processType(TVal->getType());
356 if (!NodesSeen.insert(DV).second)
362bool DebugInfoFinder::addType(
DIType *DT) {
366 if (!NodesSeen.insert(DT).second)
369 TYs.push_back(
const_cast<DIType *
>(DT));
376 if (!NodesSeen.insert(
CU).second)
384 if (!NodesSeen.insert(DIG).second)
395 if (!NodesSeen.insert(SP).second)
402bool DebugInfoFinder::addScope(
DIScope *Scope) {
407 if (
Scope->getNumOperands() == 0)
409 if (!NodesSeen.insert(Scope).second)
411 Scopes.push_back(Scope);
418 "Loop ID needs at least one operand");
420 "Loop ID should refer to itself");
429 else if (
Metadata *NewMD = Updater(MD))
441 MDNode *OrigLoopID =
I.getMetadata(LLVMContext::MD_loop);
445 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
453 MDNode *
N = dyn_cast_or_null<MDNode>(MD);
456 if (isa<DILocation>(
N) || Reachable.
count(
N))
460 for (
auto &OpIt :
N->operands()) {
468 return Reachable.
count(
N);
475 MDNode *
N = dyn_cast_or_null<MDNode>(MD);
478 if (isa<DILocation>(
N) || AllDILocation.
count(
N))
480 if (!DIReachable.
count(
N))
484 for (
auto &OpIt :
N->operands()) {
499 if (isa<DILocation>(MD) || AllDILocation.
count(MD))
502 if (!DIReachable.
count(MD))
505 MDNode *
N = dyn_cast_or_null<MDNode>(MD);
510 bool HasSelfRef =
false;
511 for (
unsigned i = 0; i <
N->getNumOperands(); ++i) {
514 Args.push_back(
nullptr);
515 }
else if (
A == MD) {
516 assert(i == 0 &&
"expected i==0 for self-reference");
518 Args.push_back(
nullptr);
521 Args.push_back(NewArg);
524 if (Args.empty() || (HasSelfRef && Args.size() == 1))
535 assert(!
N->operands().empty() &&
"Missing self reference?");
546 [&Visited, &DILocationReachable](
const MDOperand &
Op) {
547 return isDILocationReachable(
548 Visited, DILocationReachable, Op.get());
556 [&Visited, &AllDILocation,
558 return isAllDILocation(Visited, AllDILocation,
559 DILocationReachable, Op.get());
570 bool Changed =
false;
571 if (
F.hasMetadata(LLVMContext::MD_dbg)) {
573 F.setSubprogram(
nullptr);
579 if (isa<DbgInfoIntrinsic>(&
I)) {
584 if (
I.getDebugLoc()) {
588 if (
auto *LoopID =
I.getMetadata(LLVMContext::MD_loop)) {
589 auto *NewLoopID = LoopIDsMap.
lookup(LoopID);
592 if (NewLoopID != LoopID)
593 I.setMetadata(LLVMContext::MD_loop, NewLoopID);
596 if (
I.hasMetadataOtherThanDebugLoc()) {
598 I.setMetadata(
"heapallocsite",
nullptr);
600 I.setMetadata(LLVMContext::MD_DIAssignID,
nullptr);
609 bool Changed =
false;
614 if (NMD.getName().starts_with(
"llvm.dbg.") ||
615 NMD.getName() ==
"llvm.gcov") {
616 NMD.eraseFromParent();
624 for (
auto &GV : M.globals()) {
625 Changed |= GV.eraseMetadata(LLVMContext::MD_dbg);
629 Materializer->setStripDebugInfo();
637class DebugTypeInfoRemoval {
642 MDNode *EmptySubroutineType;
666 auto Replacement = Replacements.find(M);
667 if (Replacement != Replacements.end())
668 return Replacement->second;
676 void traverseAndRemap(
MDNode *
N) { traverse(
N); }
681 auto *FileAndScope = cast_or_null<DIFile>(map(MDS->
getFile()));
684 auto *
Type = cast_or_null<DISubroutineType>(map(MDS->getType()));
686 cast_or_null<DIType>(map(MDS->getContainingType()));
687 auto *Unit = cast_or_null<DICompileUnit>(map(MDS->getUnit()));
688 auto Variables =
nullptr;
689 auto TemplateParams =
nullptr;
692 auto distinctMDSubprogram = [&]() {
693 return DISubprogram::getDistinct(
695 FileAndScope, MDS->getLine(),
Type, MDS->getScopeLine(),
696 ContainingType, MDS->getVirtualIndex(), MDS->getThisAdjustment(),
697 MDS->getFlags(), MDS->getSPFlags(), Unit, TemplateParams, Declaration,
702 return distinctMDSubprogram();
704 auto *NewMDS = DISubprogram::get(
706 FileAndScope, MDS->getLine(),
Type, MDS->getScopeLine(), ContainingType,
707 MDS->getVirtualIndex(), MDS->getThisAdjustment(), MDS->getFlags(),
708 MDS->getSPFlags(), Unit, TemplateParams, Declaration, Variables);
710 StringRef OldLinkageName = MDS->getLinkageName();
713 auto OrigLinkage = NewToLinkageName.find(NewMDS);
714 if (OrigLinkage != NewToLinkageName.end()) {
715 if (OrigLinkage->second == OldLinkageName)
721 return distinctMDSubprogram();
724 NewToLinkageName.insert({NewMDS, MDS->getLinkageName()});
734 auto *
File = cast_or_null<DIFile>(map(
CU->getFile()));
736 MDTuple *RetainedTypes =
nullptr;
737 MDTuple *GlobalVariables =
nullptr;
738 MDTuple *ImportedEntities =
nullptr;
739 return DICompileUnit::getDistinct(
740 CU->getContext(),
CU->getSourceLanguage(), File,
CU->getProducer(),
741 CU->isOptimized(),
CU->getFlags(),
CU->getRuntimeVersion(),
743 RetainedTypes, GlobalVariables, ImportedEntities,
CU->getMacros(),
744 CU->getDWOId(),
CU->getSplitDebugInlining(),
745 CU->getDebugInfoForProfiling(),
CU->getNameTableKind(),
746 CU->getRangesBaseAddress(),
CU->getSysRoot(),
CU->getSDK());
750 auto *
Scope = map(MLD->getScope());
751 auto *InlinedAt = map(MLD->getInlinedAt());
753 return DILocation::getDistinct(MLD->
getContext(), MLD->getLine(),
754 MLD->getColumn(), Scope, InlinedAt);
755 return DILocation::get(MLD->
getContext(), MLD->getLine(), MLD->getColumn(),
763 for (
auto &
I :
N->operands())
772 if (Replacements.count(
N))
778 if (
auto *MDSub = dyn_cast<DISubprogram>(
N)) {
779 remap(MDSub->getUnit());
780 return getReplacementSubprogram(MDSub);
782 if (isa<DISubroutineType>(
N))
783 return EmptySubroutineType;
784 if (
auto *
CU = dyn_cast<DICompileUnit>(
N))
785 return getReplacementCU(
CU);
788 if (
auto *MDLB = dyn_cast<DILexicalBlockBase>(
N))
790 return mapNode(MDLB->getScope());
791 if (
auto *MLD = dyn_cast<DILocation>(
N))
792 return getReplacementMDLocation(MLD);
799 return getReplacementMDNode(
N);
814void DebugTypeInfoRemoval::traverse(
MDNode *
N) {
815 if (!
N || Replacements.count(
N))
821 if (
auto *MDS = dyn_cast<DISubprogram>(Parent))
822 return Child == MDS->getRetainedNodes().
get();
831 while (!ToVisit.
empty()) {
832 auto *
N = ToVisit.
back();
833 if (!Opened.
insert(
N).second) {
839 for (
auto &
I :
N->operands())
840 if (
auto *MDN = dyn_cast_or_null<MDNode>(
I))
841 if (!Opened.
count(MDN) && !Replacements.count(MDN) && !
prune(
N, MDN) &&
842 !isa<DICompileUnit>(MDN))
848 bool Changed =
false;
852 if (
auto *DbgVal = M.getFunction(
Name)) {
853 while (!DbgVal->use_empty())
854 cast<Instruction>(DbgVal->user_back())->eraseFromParent();
855 DbgVal->eraseFromParent();
859 RemoveUses(
"llvm.dbg.declare");
860 RemoveUses(
"llvm.dbg.label");
861 RemoveUses(
"llvm.dbg.value");
864 for (
auto NMI = M.named_metadata_begin(), NME = M.named_metadata_end();
869 if (NMD->
getName() ==
"llvm.dbg.cu")
874 for (
auto &GV : M.globals())
875 GV.eraseMetadata(LLVMContext::MD_dbg);
877 DebugTypeInfoRemoval Mapper(M.getContext());
881 Mapper.traverseAndRemap(Node);
882 auto *NewNode = Mapper.mapNode(Node);
883 Changed |= Node != NewNode;
891 if (
auto *SP =
F.getSubprogram()) {
892 Mapper.traverseAndRemap(SP);
893 auto *NewSP = cast<DISubprogram>(Mapper.mapNode(SP));
894 Changed |= SP != NewSP;
895 F.setSubprogram(NewSP);
900 auto *Scope =
DL.getScope();
901 MDNode *InlinedAt =
DL.getInlinedAt();
902 Scope = remap(Scope);
903 InlinedAt = remap(InlinedAt);
909 I.setDebugLoc(remapDebugLoc(
I.getDebugLoc()));
913 if (
auto *Loc = dyn_cast_or_null<DILocation>(MD))
914 return remapDebugLoc(Loc).
get();
919 if (
I.hasMetadataOtherThanDebugLoc())
920 I.setMetadata(
"heapallocsite",
nullptr);
930 for (
auto &NMD : M.named_metadata()) {
947 if (
auto *Val = mdconst::dyn_extract_or_null<ConstantInt>(
948 M.getModuleFlag(
"Debug Info Version")))
949 return Val->getZExtValue();
965 if (
auto *MD =
I->getMetadata(LLVMContext::MD_DIAssignID))
968 "Merging with instruction from another function not allowed");
972 if (
auto *MD =
getMetadata(LLVMContext::MD_DIAssignID))
979 for (
auto It = std::next(IDs.
begin()),
End = IDs.
end(); It !=
End; ++It) {
995 bool MayLowerToCall =
false;
996 if (isa<CallBase>(
this)) {
997 auto *
II = dyn_cast<IntrinsicInst>(
this);
1002 if (!MayLowerToCall) {
1031#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \
1032 case LLVMDWARFSourceLanguage##NAME: \
1034#include "llvm/BinaryFormat/Dwarf.def"
1035#undef HANDLE_DW_LANG
1041 return (DIT *)(
Ref ? unwrap<MDNode>(
Ref) :
nullptr);
1082 unwrap(Builder)->finalize();
1087 unwrap(Builder)->finalizeSubprogram(unwrapDI<DISubprogram>(subprogram));
1093 LLVMBool isOptimized,
const char *Flags,
size_t FlagsLen,
1094 unsigned RuntimeVer,
const char *SplitName,
size_t SplitNameLen,
1096 LLVMBool DebugInfoForProfiling,
const char *SysRoot,
size_t SysRootLen,
1097 const char *SDK,
size_t SDKLen) {
1098 auto File = unwrapDI<DIFile>(FileRef);
1100 return wrap(
unwrap(Builder)->createCompileUnit(
1103 RuntimeVer,
StringRef(SplitName, SplitNameLen),
1105 SplitDebugInlining, DebugInfoForProfiling,
1112 size_t FilenameLen,
const char *Directory,
1113 size_t DirectoryLen) {
1120 const char *
Name,
size_t NameLen,
1121 const char *ConfigMacros,
size_t ConfigMacrosLen,
1122 const char *IncludePath,
size_t IncludePathLen,
1123 const char *APINotesFile,
size_t APINotesFileLen) {
1126 StringRef(ConfigMacros, ConfigMacrosLen),
1128 StringRef(APINotesFile, APINotesFileLen)));
1133 const char *
Name,
size_t NameLen,
1135 return wrap(
unwrap(Builder)->createNameSpace(
1136 unwrapDI<DIScope>(ParentScope),
StringRef(
Name, NameLen), ExportSymbols));
1141 size_t NameLen,
const char *
LinkageName,
size_t LinkageNameLen,
1146 unwrapDI<DIScope>(Scope), {
Name, NameLen}, {
LinkageName, LinkageNameLen},
1147 unwrapDI<DIFile>(File), LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine,
1157 return wrap(
unwrap(Builder)->createLexicalBlock(unwrapDI<DIScope>(Scope),
1158 unwrapDI<DIFile>(File),
1166 unsigned Discriminator) {
1167 return wrap(
unwrap(Builder)->createLexicalBlockFile(unwrapDI<DIScope>(Scope),
1168 unwrapDI<DIFile>(File),
1179 unwrapDI<DINamespace>(NS),
1180 unwrapDI<DIFile>(File),
1190 ?
unwrap(Builder)->getOrCreateArray({
unwrap(Elements), NumElements})
1193 unwrapDI<DIScope>(Scope), unwrapDI<DIImportedEntity>(ImportedEntity),
1194 unwrapDI<DIFile>(File), Line, Elts));
1200 unsigned NumElements) {
1203 ?
unwrap(Builder)->getOrCreateArray({
unwrap(Elements), NumElements})
1206 unwrapDI<DIScope>(Scope), unwrapDI<DIModule>(M), unwrapDI<DIFile>(File),
1216 ?
unwrap(Builder)->getOrCreateArray({
unwrap(Elements), NumElements})
1218 return wrap(
unwrap(Builder)->createImportedDeclaration(
1219 unwrapDI<DIScope>(Scope), unwrapDI<DINode>(Decl), unwrapDI<DIFile>(File),
1220 Line, {
Name, NameLen}, Elts));
1232 return unwrapDI<DILocation>(Location)->getLine();
1236 return unwrapDI<DILocation>(Location)->getColumn();
1240 return wrap(unwrapDI<DILocation>(Location)->getScope());
1244 return wrap(unwrapDI<DILocation>(Location)->getInlinedAt());
1248 return wrap(unwrapDI<DIScope>(Scope)->getFile());
1252 auto Dir = unwrapDI<DIFile>(File)->getDirectory();
1258 auto Name = unwrapDI<DIFile>(File)->getFilename();
1264 if (
auto Src = unwrapDI<DIFile>(File)->getSource()) {
1276 const char *
Name,
size_t NameLen,
1277 const char *
Value,
size_t ValueLen) {
1279 unwrap(Builder)->createMacro(unwrapDI<DIMacroFile>(ParentMacroFile), Line,
1288 return wrap(
unwrap(Builder)->createTempMacroFile(
1289 unwrapDI<DIMacroFile>(ParentMacroFile), Line, unwrapDI<DIFile>(File)));
1293 const char *
Name,
size_t NameLen,
1305auto Elts =
unwrap(Builder)->getOrCreateArray({
unwrap(Elements),
1307return wrap(
unwrap(Builder)->createEnumerationType(
1308 unwrapDI<DIScope>(Scope), {
Name, NameLen}, unwrapDI<DIFile>(File),
1309 LineNumber, SizeInBits, AlignInBits, Elts, unwrapDI<DIType>(ClassTy)));
1316 LLVMMetadataRef *Elements,
unsigned NumElements,
unsigned RunTimeLang,
1317 const char *UniqueId,
size_t UniqueIdLen) {
1318 auto Elts =
unwrap(Builder)->getOrCreateArray({
unwrap(Elements),
1320 return wrap(
unwrap(Builder)->createUnionType(
1321 unwrapDI<DIScope>(Scope), {
Name, NameLen}, unwrapDI<DIFile>(File),
1323 Elts, RunTimeLang, {UniqueId, UniqueIdLen}));
1331 unsigned NumSubscripts) {
1332 auto Subs =
unwrap(Builder)->getOrCreateArray({
unwrap(Subscripts),
1335 unwrapDI<DIType>(Ty), Subs));
1342 unsigned NumSubscripts) {
1343 auto Subs =
unwrap(Builder)->getOrCreateArray({
unwrap(Subscripts),
1346 unwrapDI<DIType>(Ty), Subs));
1351 size_t NameLen,
uint64_t SizeInBits,
1355 SizeInBits, Encoding,
1362 const char *
Name,
size_t NameLen) {
1363 return wrap(
unwrap(Builder)->createPointerType(
1364 unwrapDI<DIType>(PointeeTy), SizeInBits, AlignInBits,
AddressSpace,
1373 unsigned NumElements,
unsigned RunTimeLang,
LLVMMetadataRef VTableHolder,
1374 const char *UniqueId,
size_t UniqueIdLen) {
1375 auto Elts =
unwrap(Builder)->getOrCreateArray({
unwrap(Elements),
1377 return wrap(
unwrap(Builder)->createStructType(
1378 unwrapDI<DIScope>(Scope), {
Name, NameLen}, unwrapDI<DIFile>(File),
1380 unwrapDI<DIType>(DerivedFrom), Elts, RunTimeLang,
1381 unwrapDI<DIType>(VTableHolder), {UniqueId, UniqueIdLen}));
1389 return wrap(
unwrap(Builder)->createMemberType(unwrapDI<DIScope>(Scope),
1390 {
Name, NameLen}, unwrapDI<DIFile>(File), LineNo, SizeInBits, AlignInBits,
1397 return wrap(
unwrap(Builder)->createUnspecifiedType({
Name, NameLen}));
1405 return wrap(
unwrap(Builder)->createStaticMemberType(
1406 unwrapDI<DIScope>(Scope), {
Name, NameLen}, unwrapDI<DIFile>(File),
1408 unwrap<Constant>(ConstantVal), DW_TAG_member, AlignInBits));
1413 const char *
Name,
size_t NameLen,
1419 {
Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1420 SizeInBits, AlignInBits, OffsetInBits,
1422 unwrapDI<MDNode>(PropertyNode)));
1427 const char *
Name,
size_t NameLen,
1429 const char *GetterName,
size_t GetterNameLen,
1430 const char *SetterName,
size_t SetterNameLen,
1431 unsigned PropertyAttributes,
1433 return wrap(
unwrap(Builder)->createObjCProperty(
1434 {
Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1435 {GetterName, GetterNameLen}, {SetterName, SetterNameLen},
1436 PropertyAttributes, unwrapDI<DIType>(Ty)));
1442 return wrap(
unwrap(Builder)->createObjectPointerType(unwrapDI<DIType>(
Type),
1448 const char *
Name,
size_t NameLen,
1452 unwrapDI<DIType>(
Type), {
Name, NameLen}, unwrapDI<DIFile>(File), LineNo,
1453 unwrapDI<DIScope>(Scope), AlignInBits));
1461 return wrap(
unwrap(Builder)->createInheritance(
1462 unwrapDI<DIType>(Ty), unwrapDI<DIType>(
BaseTy),
1471 const char *UniqueIdentifier,
size_t UniqueIdentifierLen) {
1472 return wrap(
unwrap(Builder)->createForwardDecl(
1473 Tag, {
Name, NameLen}, unwrapDI<DIScope>(Scope),
1474 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1475 AlignInBits, {UniqueIdentifier, UniqueIdentifierLen}));
1484 size_t UniqueIdentifierLen) {
1485 return wrap(
unwrap(Builder)->createReplaceableCompositeType(
1486 Tag, {
Name, NameLen}, unwrapDI<DIScope>(Scope),
1487 unwrapDI<DIFile>(File), Line, RuntimeLang, SizeInBits,
1489 {UniqueIdentifier, UniqueIdentifierLen}));
1496 unwrapDI<DIType>(
Type)));
1503 unwrapDI<DIType>(
Type)));
1508 return wrap(
unwrap(Builder)->createNullPtrType());
1518 return wrap(
unwrap(Builder)->createMemberPointerType(
1519 unwrapDI<DIType>(PointeeType),
1520 unwrapDI<DIType>(ClassType), AlignInBits, SizeInBits,
1527 const char *
Name,
size_t NameLen,
1533 return wrap(
unwrap(Builder)->createBitFieldMemberType(
1534 unwrapDI<DIScope>(Scope), {
Name, NameLen},
1535 unwrapDI<DIFile>(File), LineNumber,
1536 SizeInBits, OffsetInBits, StorageOffsetInBits,
1547 const char *UniqueIdentifier,
size_t UniqueIdentifierLen) {
1548 auto Elts =
unwrap(Builder)->getOrCreateArray({
unwrap(Elements),
1550 return wrap(
unwrap(Builder)->createClassType(
1551 unwrapDI<DIScope>(Scope), {
Name, NameLen}, unwrapDI<DIFile>(File),
1552 LineNumber, SizeInBits, AlignInBits, OffsetInBits,
1554 0, unwrapDI<DIType>(VTableHolder),
1555 unwrapDI<MDNode>(TemplateParamsNode),
1556 {UniqueIdentifier, UniqueIdentifierLen}));
1562 return wrap(
unwrap(Builder)->createArtificialType(unwrapDI<DIType>(
Type)));
1566 return unwrapDI<DINode>(MD)->getTag();
1570 StringRef Str = unwrapDI<DIType>(DType)->getName();
1576 return unwrapDI<DIType>(DType)->getSizeInBits();
1580 return unwrapDI<DIType>(DType)->getOffsetInBits();
1584 return unwrapDI<DIType>(DType)->getAlignInBits();
1588 return unwrapDI<DIType>(DType)->getLine();
1606 unsigned NumParameterTypes,
1608 auto Elts =
unwrap(Builder)->getOrCreateTypeArray({
unwrap(ParameterTypes),
1609 NumParameterTypes});
1610 return wrap(
unwrap(Builder)->createSubroutineType(
1628 size_t NameLen,
const char *Linkage,
size_t LinkLen,
LLVMMetadataRef File,
1631 return wrap(
unwrap(Builder)->createGlobalVariableExpression(
1632 unwrapDI<DIScope>(Scope), {
Name, NameLen}, {Linkage, LinkLen},
1633 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1634 true, unwrap<DIExpression>(Expr), unwrapDI<MDNode>(Decl),
1635 nullptr, AlignInBits));
1639 return wrap(unwrapDI<DIGlobalVariableExpression>(GVE)->getVariable());
1644 return wrap(unwrapDI<DIGlobalVariableExpression>(GVE)->getExpression());
1648 return wrap(unwrapDI<DIVariable>(Var)->getFile());
1652 return wrap(unwrapDI<DIVariable>(Var)->getScope());
1656 return unwrapDI<DIVariable>(Var)->getLine();
1671 auto *
Node = unwrapDI<MDNode>(TargetMetadata);
1672 Node->replaceAllUsesWith(
unwrap(Replacement));
1678 size_t NameLen,
const char *Linkage,
size_t LnkLen,
LLVMMetadataRef File,
1681 return wrap(
unwrap(Builder)->createTempGlobalVariableFwdDecl(
1682 unwrapDI<DIScope>(Scope), {
Name, NameLen}, {Linkage, LnkLen},
1683 unwrapDI<DIFile>(File), LineNo, unwrapDI<DIType>(Ty), LocalToUnit,
1684 unwrapDI<MDNode>(Decl),
nullptr, AlignInBits));
1691 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1692 unwrap<DIExpression>(Expr), unwrap<DILocation>(
DL),
1693 unwrap<Instruction>(Instr));
1699 assert(isa<DbgRecord *>(DbgInst) &&
1700 "Function unexpectedly in old debug info format");
1701 return wrap(cast<DbgRecord *>(DbgInst));
1708 unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
1709 unwrap<DIExpression>(Expr), unwrap<DILocation>(
DL),
unwrap(
Block));
1715 assert(isa<DbgRecord *>(DbgInst) &&
1716 "Function unexpectedly in old debug info format");
1717 return wrap(cast<DbgRecord *>(DbgInst));
1724 unwrap(Val), unwrap<DILocalVariable>(VarInfo), unwrap<DIExpression>(Expr),
1725 unwrap<DILocation>(
DebugLoc), unwrap<Instruction>(Instr));
1731 assert(isa<DbgRecord *>(DbgInst) &&
1732 "Function unexpectedly in old debug info format");
1733 return wrap(cast<DbgRecord *>(DbgInst));
1740 unwrap(Val), unwrap<DILocalVariable>(VarInfo), unwrap<DIExpression>(Expr),
1747 assert(isa<DbgRecord *>(DbgInst) &&
1748 "Function unexpectedly in old debug info format");
1749 return wrap(cast<DbgRecord *>(DbgInst));
1756 return wrap(
unwrap(Builder)->createAutoVariable(
1757 unwrap<DIScope>(Scope), {
Name, NameLen}, unwrap<DIFile>(File),
1758 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1764 size_t NameLen,
unsigned ArgNo,
LLVMMetadataRef File,
unsigned LineNo,
1766 return wrap(
unwrap(Builder)->createParameterVariable(
1767 unwrap<DIScope>(Scope), {
Name, NameLen}, ArgNo, unwrap<DIFile>(File),
1768 LineNo, unwrap<DIType>(Ty), AlwaysPreserve,
1773 int64_t
Lo, int64_t Count) {
1774 return wrap(
unwrap(Builder)->getOrCreateSubrange(
Lo, Count));
1789 unwrap<Function>(Func)->setSubprogram(unwrap<DISubprogram>(SP));
1793 return unwrapDI<DISubprogram>(Subprogram)->getLine();
1802 unwrap<Instruction>(Inst)->setDebugLoc(
DebugLoc(unwrap<MDNode>(Loc)));
1804 unwrap<Instruction>(Inst)->setDebugLoc(
DebugLoc());
1813 unwrapDI<DIFile>(File), LineNo, AlwaysPreserve));
1820 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
1821 unwrap<Instruction>(InsertBefore));
1827 assert(isa<DbgRecord *>(DbgInst) &&
1828 "Function unexpectedly in old debug info format");
1829 return wrap(cast<DbgRecord *>(DbgInst));
1836 unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location),
1843 assert(isa<DbgRecord *>(DbgInst) &&
1844 "Function unexpectedly in old debug info format");
1845 return wrap(cast<DbgRecord *>(DbgInst));
1850#define HANDLE_METADATA_LEAF(CLASS) \
1851 case Metadata::CLASS##Kind: \
1852 return (LLVMMetadataKind)LLVM##CLASS##MetadataKind;
1853#include "llvm/IR/Metadata.def"
1860 assert(
ID &&
"Expected non-null ID");
1864 auto MapIt = Map.find(
ID);
1865 if (MapIt == Map.end())
1868 return make_range(MapIt->second.begin(), MapIt->second.end());
1872 assert(
ID &&
"Expected non-null ID");
1882 return make_range(IDAsValue->user_begin(), IDAsValue->user_end());
1891 for (
auto *DAI : ToDelete)
1892 DAI->eraseFromParent();
1893 for (
auto *DVR : DVRAssigns)
1894 DVR->eraseFromParent();
1904 for (
auto *
I : InstVec)
1905 I->setMetadata(LLVMContext::MD_DIAssignID, New);
1916 if (DVR.isDbgAssign())
1918 if (
auto *DAI = dyn_cast<DbgAssignIntrinsic>(&
I))
1921 I.setMetadata(LLVMContext::MD_DIAssignID,
nullptr);
1924 for (
auto *DAI : ToDelete)
1925 DAI->eraseFromParent();
1926 for (
auto *DVR : DPToDelete)
1927 DVR->eraseFromParent();
1932template <
typename T>
1935 uint64_t SliceSizeInBits,
const T *AssignRecord,
1936 std::optional<DIExpression::FragmentInfo> &Result) {
1938 if (AssignRecord->isKillAddress())
1941 int64_t AddrOffsetInBits;
1943 int64_t AddrOffsetInBytes;
1946 if (!AssignRecord->getAddressExpression()->extractLeadingOffset(
1947 AddrOffsetInBytes, PostOffsetOps))
1949 AddrOffsetInBits = AddrOffsetInBytes * 8;
1952 Value *
Addr = AssignRecord->getAddress();
1954 int64_t BitExtractOffsetInBits = 0;
1956 AssignRecord->getFragmentOrEntireVariable();
1958 int64_t OffsetFromLocationInBits;
1960 DL, Dest, SliceOffsetInBits, SliceSizeInBits,
Addr, AddrOffsetInBits,
1961 BitExtractOffsetInBits, VarFrag, Result, OffsetFromLocationInBits);
1969 std::optional<DIExpression::FragmentInfo> &Result) {
1971 SliceSizeInBits, DbgAssign, Result);
1979 std::optional<DIExpression::FragmentInfo> &Result) {
1981 SliceSizeInBits, DVRAssign, Result);
1989 auto GetNewID = [&Map](
Metadata *Old) {
1999 if (DVR.isDbgAssign())
2000 DVR.setAssignId(GetNewID(DVR.getAssignID()));
2002 if (
auto *
ID =
I.getMetadata(LLVMContext::MD_DIAssignID))
2003 I.setMetadata(LLVMContext::MD_DIAssignID, GetNewID(
ID));
2004 else if (
auto *DAI = dyn_cast<DbgAssignIntrinsic>(&
I))
2005 DAI->setAssignId(GetNewID(DAI->getAssignID()));
2011static std::optional<AssignmentInfo>
2015 return std::nullopt;
2016 APInt GEPOffset(
DL.getIndexTypeSizeInBits(StoreDest->
getType()), 0);
2018 DL, GEPOffset,
true);
2021 return std::nullopt;
2026 return std::nullopt;
2027 if (
const auto *Alloca = dyn_cast<AllocaInst>(
Base))
2029 return std::nullopt;
2034 const Value *StoreDest =
I->getRawDest();
2036 auto *ConstLengthInBytes = dyn_cast<ConstantInt>(
I->getLength());
2037 if (!ConstLengthInBytes)
2039 return std::nullopt;
2040 uint64_t SizeInBits = 8 * ConstLengthInBytes->getZExtValue();
2046 TypeSize SizeInBits =
DL.getTypeSizeInBits(SI->getValueOperand()->getType());
2060 auto *
ID = StoreLikeInst.
getMetadata(LLVMContext::MD_DIAssignID);
2061 assert(
ID &&
"Store instruction must have DIAssignID metadata");
2067 uint64_t FragStartBit = StoreStartBit;
2070 bool StoreToWholeVariable =
Info.StoreToWholeAlloca;
2079 FragEndBit = std::min(FragEndBit, VarEndBit);
2082 if (FragStartBit >= FragEndBit)
2085 StoreToWholeVariable = FragStartBit <= VarStartBit && FragEndBit >= *
Size;
2089 if (!StoreToWholeVariable) {
2091 FragEndBit - FragStartBit);
2092 assert(R.has_value() &&
"failed to create fragment expression");
2096 if (StoreLikeInst.
getParent()->IsNewDbgInfoFormat) {
2098 &StoreLikeInst, Val, VarRec.
Var, Expr, Dest, AddrExpr, VarRec.
DL);
2100 LLVM_DEBUG(
if (Assign)
errs() <<
" > INSERT: " << *Assign <<
"\n");
2104 AddrExpr, VarRec.
DL);
2107 if (const auto *Record = dyn_cast<DbgRecord *>(Assign))
2108 errs() <<
" > INSERT: " << *Record <<
"\n";
2110 errs() <<
" > INSERT: " << *cast<Instruction *>(Assign) <<
"\n";
2115#define DEBUG_TYPE "assignment-tracking"
2124 auto &Ctx = Start->getContext();
2125 auto &
Module = *Start->getModule();
2133 for (
auto BBI = Start; BBI !=
End; ++BBI) {
2136 std::optional<AssignmentInfo>
Info;
2137 Value *ValueComponent =
nullptr;
2138 Value *DestComponent =
nullptr;
2139 if (
auto *AI = dyn_cast<AllocaInst>(&
I)) {
2144 ValueComponent = Undef;
2146 }
else if (
auto *SI = dyn_cast<StoreInst>(&
I)) {
2148 ValueComponent = SI->getValueOperand();
2149 DestComponent = SI->getPointerOperand();
2150 }
else if (
auto *
MI = dyn_cast<MemTransferInst>(&
I)) {
2153 ValueComponent = Undef;
2154 DestComponent =
MI->getOperand(0);
2155 }
else if (
auto *
MI = dyn_cast<MemSetInst>(&
I)) {
2159 auto *ConstValue = dyn_cast<ConstantInt>(
MI->getOperand(1));
2160 if (ConstValue && ConstValue->isZero())
2161 ValueComponent = ConstValue;
2163 ValueComponent = Undef;
2164 DestComponent =
MI->getOperand(0);
2170 assert(ValueComponent && DestComponent);
2174 if (!
Info.has_value()) {
2177 <<
" | SKIP: Untrackable store (e.g. through non-const gep)\n");
2183 auto LocalIt = Vars.
find(
Info->Base);
2184 if (LocalIt == Vars.
end()) {
2187 <<
" | SKIP: Base address not associated with local variable\n");
2192 cast_or_null<DIAssignID>(
I.getMetadata(LLVMContext::MD_DIAssignID));
2195 I.setMetadata(LLVMContext::MD_DIAssignID,
ID);
2198 for (
const VarRecord &R : LocalIt->second)
2204bool AssignmentTrackingPass::runOnFunction(
Function &
F) {
2206 if (
F.hasFnAttribute(Attribute::OptimizeNone))
2209 bool Changed =
false;
2210 auto *
DL = &
F.getDataLayout();
2219 auto ProcessDeclare = [&](
auto *Declare,
auto &DeclareList) {
2223 if (Declare->getExpression()->getNumElements() != 0)
2225 if (!Declare->getAddress())
2228 dyn_cast<AllocaInst>(Declare->getAddress()->stripPointerCasts())) {
2230 if (!Alloca->isStaticAlloca())
2233 if (
auto Sz = Alloca->getAllocationSize(*
DL); Sz && Sz->isScalable())
2235 DeclareList[Alloca].
insert(Declare);
2239 for (
auto &BB :
F) {
2240 for (
auto &
I : BB) {
2242 if (DVR.isDbgDeclare())
2243 ProcessDeclare(&DVR, DVRDeclares);
2246 ProcessDeclare(DDI, DbgDeclares);
2262 auto DeleteSubsumedDeclare = [&](
const auto &
Markers,
auto &Declares) {
2264 for (
auto *Declare : Declares) {
2278 Declare->eraseFromParent();
2282 for (
auto &
P : DbgDeclares)
2284 for (
auto &
P : DVRDeclares)
2290 "debug-info-assignment-tracking";
2300 return Value && !cast<ConstantAsMetadata>(
Value)->getValue()->isZeroValue();
2309 if (!runOnFunction(
F))
2326 bool Changed =
false;
2328 Changed |= runOnFunction(
F);
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
Analysis containing CSE Info
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static DISubprogram * getSubprogram(bool IsDistinct, Ts &&...Args)
static DIImportedEntity * createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope *Context, Metadata *NS, DIFile *File, unsigned Line, StringRef Name, DINodeArray Elements, SmallVectorImpl< TrackingMDNodeRef > &ImportedModules)
static void setAssignmentTrackingModuleFlag(Module &M)
static DISubprogram::DISPFlags pack_into_DISPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized)
static Metadata * stripLoopMDLoc(const SmallPtrSetImpl< Metadata * > &AllDILocation, const SmallPtrSetImpl< Metadata * > &DIReachable, Metadata *MD)
static MDNode * updateLoopMetadataDebugLocationsImpl(MDNode *OrigLoopID, function_ref< Metadata *(Metadata *)> Updater)
static MDNode * stripDebugLocFromLoopID(MDNode *N)
bool calculateFragmentIntersectImpl(const DataLayout &DL, const Value *Dest, uint64_t SliceOffsetInBits, uint64_t SliceSizeInBits, const T *AssignRecord, std::optional< DIExpression::FragmentInfo > &Result)
FIXME: Remove this wrapper function and call DIExpression::calculateFragmentIntersect directly.
static const char * AssignmentTrackingModuleFlag
static DINode::DIFlags map_from_llvmDIFlags(LLVMDIFlags Flags)
static unsigned map_from_llvmDWARFsourcelanguage(LLVMDWARFSourceLanguage lang)
static void emitDbgAssign(AssignmentInfo Info, Value *Val, Value *Dest, Instruction &StoreLikeInst, const VarRecord &VarRec, DIBuilder &DIB)
Returns nullptr if the assignment shouldn't be attributed to this variable.
static LLVMDIFlags map_to_llvmDIFlags(DINode::DIFlags Flags)
static void findDbgIntrinsics(SmallVectorImpl< IntrinsicT * > &Result, Value *V, SmallVectorImpl< DbgVariableRecord * > *DbgVariableRecords)
static bool getAssignmentTrackingModuleFlag(const Module &M)
static bool isAllDILocation(SmallPtrSetImpl< Metadata * > &Visited, SmallPtrSetImpl< Metadata * > &AllDILocation, const SmallPtrSetImpl< Metadata * > &DIReachable, Metadata *MD)
static bool isDILocationReachable(SmallPtrSetImpl< Metadata * > &Visited, SmallPtrSetImpl< Metadata * > &Reachable, Metadata *MD)
Return true if a node is a DILocation or if a DILocation is indirectly referenced by one of the node'...
DIT * unwrapDI(LLVMMetadataRef Ref)
static std::optional< AssignmentInfo > getAssignmentInfoImpl(const DataLayout &DL, const Value *StoreDest, TypeSize SizeInBits)
Collect constant properies (base, size, offset) of StoreDest.
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
static DebugLoc getDebugLoc(MachineBasicBlock::instr_iterator FirstMI, MachineBasicBlock::instr_iterator LastMI)
Return the first found DebugLoc that has a DILocation, given a range of instructions.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
static uint32_t getFlags(const Symbol *Sym)
Class for arbitrary precision integers.
bool isNegative() const
Determine sign of this APInt.
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
an instruction to allocate memory on the stack
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
A container for analyses that lazily runs them and caches their results.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
LLVM Basic Block Representation.
Represents analyses that only rely on functions' control flow.
List of ValueAsMetadata, to be used as an argument to a dbg.value intrinsic.
SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
static DIAssignID * getDistinct(LLVMContext &Context)
DbgInstPtr insertDbgAssign(Instruction *LinkedInstr, Value *Val, DILocalVariable *SrcVar, DIExpression *ValExpr, Value *Addr, DIExpression *AddrExpr, const DILocation *DL)
Insert a new llvm.dbg.assign intrinsic call.
static bool calculateFragmentIntersect(const DataLayout &DL, const Value *SliceStart, uint64_t SliceOffsetInBits, uint64_t SliceSizeInBits, const Value *DbgPtr, int64_t DbgPtrOffsetInBits, int64_t DbgExtractOffsetInBits, DIExpression::FragmentInfo VarFrag, std::optional< DIExpression::FragmentInfo > &Result, int64_t &OffsetFromLocationInBits)
Computes a fragment, bit-extract operation if needed, and new constant offset to describe a part of a...
static std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
A pair of DIGlobalVariable and DIExpression.
DISubprogram * getSubprogram() const
Get the subprogram for this scope.
DILocalScope * getScope() const
Get the local scope for this variable.
static DILocation * getMergedLocation(DILocation *LocA, DILocation *LocB)
When two instructions are combined into a single instruction we also need to combine the original loc...
Tagged DWARF-like metadata node.
Base class for scope-like contexts.
StringRef getName() const
DIScope * getScope() const
static DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, unsigned Virtuality=SPFlagNonvirtual, bool IsMainSubprogram=false)
DISPFlags
Debug info subprogram flags.
Type array for a subprogram.
std::optional< uint64_t > getSizeInBits() const
Determines the size of the variable's type.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
This represents the llvm.dbg.assign instruction.
This represents the llvm.dbg.declare instruction.
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
LLVMContext & getContext()
This represents the llvm.dbg.value instruction.
This is the common base class for debug info intrinsics for variables.
Record of a variable value-assignment, aka a non instruction representation of the dbg....
static DbgVariableRecord * createLinkedDVRAssign(Instruction *LinkedInstr, Value *Val, DILocalVariable *Variable, DIExpression *Expression, Value *Address, DIExpression *AddressExpression, const DILocation *DI)
void processInstruction(const Module &M, const Instruction &I)
Process a single instruction and collect debug info anchors.
void processModule(const Module &M)
Process entire module and collect debug info anchors.
void processVariable(const Module &M, const DILocalVariable *DVI)
Process a DILocalVariable.
void processSubprogram(DISubprogram *SP)
Process subprogram.
void processLocation(const Module &M, const DILocation *Loc)
Process debug info location.
void reset()
Clear all lists.
void processDbgRecord(const Module &M, const DbgRecord &DR)
Process a DbgRecord (e.g, treat a DbgVariableRecord like a DbgVariableIntrinsic).
DILocation * get() const
Get the underlying DILocation.
MDNode * getScope() const
DILocation * getInlinedAt() const
Identifies a unique instance of a whole variable (discards/ignores fragment information).
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Implements a dense probed hash-table based set.
BasicBlockListType::iterator iterator
DISubprogram * getSubprogram() const
Get the attached subprogram.
void mergeDIAssignID(ArrayRef< const Instruction * > SourceInstructions)
Merge the DIAssignID metadata from this instruction and those attached to instructions in SourceInstr...
void dropLocation()
Drop the instruction's debug location.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
const Function * getFunction() const
Return the function this instruction belongs to.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
void updateLocationAfterHoist()
Updates the debug location given that the instruction has been hoisted from a block to a predecessor ...
void applyMergedLocation(DILocation *LocA, DILocation *LocB)
Merge 2 debug locations and apply it to the Instruction.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
static bool mayLowerToFunctionCall(Intrinsic::ID IID)
Check if the intrinsic might lower into a regular function call in the course of IR transformations.
DenseMap< DIAssignID *, SmallVector< Instruction *, 1 > > AssignmentIDToInstrs
Map DIAssignID -> Instructions with that attachment.
This is an important class for using LLVM in a threaded context.
LLVMContextImpl *const pImpl
void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
void replaceAllUsesWith(Metadata *MD)
RAUW a temporary.
static void deleteTemporary(MDNode *N)
Deallocate a node created by getTemporary.
const MDOperand & getOperand(unsigned I) const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
unsigned getNumOperands() const
Return number of MDNode operands.
LLVMContext & getContext() const
Tracking metadata reference owned by Metadata.
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
This is the common base class for memset/memcpy/memmove.
A Module instance is used to store all the information related to an LLVM module.
@ Max
Takes the max of the two values, which are required to be integers.
StringRef getName() const
A discriminated union of two or more pointer types, with the discriminator in the low bit of the poin...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
void preserveSet()
Mark an analysis set as preserved.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
void push_back(EltTy NewVal)
static constexpr TypeSize getFixed(ScalarTy ExactSize)
The instances of the Type class are immutable: once they are created, they are never changed.
static IntegerType * getInt1Ty(LLVMContext &C)
static UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
LLVMContext & getContext() const
All values hold a context through their type.
user_iterator_impl< User > user_iterator
std::pair< iterator, bool > insert(const ValueT &V)
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
A range adaptor for a pair of iterators.
LLVMMetadataRef LLVMDIBuilderCreateObjCIVar(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef Ty, LLVMMetadataRef PropertyNode)
Create debugging information entry for Objective-C instance variable.
LLVMMetadataRef LLVMDILocationGetInlinedAt(LLVMMetadataRef Location)
Get the "inline at" location associated with this debug location.
LLVMMetadataRef LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef Builder, LLVMMetadataRef *Data, size_t NumElements)
Create an array of DI Nodes.
LLVMMetadataRef LLVMDIBuilderCreateEnumerationType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef *Elements, unsigned NumElements, LLVMMetadataRef ClassTy)
Create debugging information entry for an enumeration.
LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromModule(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef M, LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements, unsigned NumElements)
Create a descriptor for an imported module.
uint64_t LLVMDITypeGetSizeInBits(LLVMMetadataRef DType)
Get the size of this DIType in bits.
LLVMDWARFMacinfoRecordType
Describes the kind of macro declaration used for LLVMDIBuilderCreateMacro.
LLVMMetadataRef LLVMDIBuilderCreateFunction(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, const char *LinkageName, size_t LinkageNameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool IsLocalToUnit, LLVMBool IsDefinition, unsigned ScopeLine, LLVMDIFlags Flags, LLVMBool IsOptimized)
Create a new descriptor for the specified subprogram.
LLVMDbgRecordRef LLVMDIBuilderInsertDeclareRecordAtEnd(LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMBasicBlockRef Block)
Only use in "new debug format" (LLVMIsNewDbgInfoFormat() is true).
LLVMMetadataRef LLVMDIBuilderCreateBitFieldMemberType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint64_t OffsetInBits, uint64_t StorageOffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef Type)
Create debugging information entry for a bit field member.
LLVMMetadataRef LLVMDIGlobalVariableExpressionGetVariable(LLVMMetadataRef GVE)
Retrieves the DIVariable associated with this global variable expression.
LLVMMetadataRef LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef Builder, LLVMMetadataRef Type)
Create a uniqued DIType* clone with FlagArtificial set.
LLVMMetadataRef LLVMDIBuilderCreateObjectPointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef Type, LLVMBool Implicit)
Create a uniqued DIType* clone with FlagObjectPointer.
void LLVMDIBuilderFinalize(LLVMDIBuilderRef Builder)
Construct any deferred debug info descriptors.
LLVMMetadataRef LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Discriminator)
Create a descriptor for a lexical block with a new file attached.
unsigned LLVMDISubprogramGetLine(LLVMMetadataRef Subprogram)
Get the line associated with a given subprogram.
LLVMMetadataRef LLVMDIBuilderCreateUnspecifiedType(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen)
Create a DWARF unspecified type.
LLVMMetadataRef LLVMDIBuilderCreateNameSpace(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope, const char *Name, size_t NameLen, LLVMBool ExportSymbols)
Creates a new descriptor for a namespace with the specified parent scope.
LLVMMetadataRef LLVMDIBuilderCreateDebugLocation(LLVMContextRef Ctx, unsigned Line, unsigned Column, LLVMMetadataRef Scope, LLVMMetadataRef InlinedAt)
Creates a new DebugLocation that describes a source location.
uint32_t LLVMDITypeGetAlignInBits(LLVMMetadataRef DType)
Get the alignment of this DIType in bits.
LLVMMetadataRef LLVMDIGlobalVariableExpressionGetExpression(LLVMMetadataRef GVE)
Retrieves the DIExpression associated with this global variable expression.
LLVMMetadataRef LLVMDIVariableGetScope(LLVMMetadataRef Var)
Get the metadata of the scope associated with a given variable.
LLVMMetadataRef LLVMInstructionGetDebugLoc(LLVMValueRef Inst)
Get the debug location for the given instruction.
LLVMMetadataRef LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef Builder, unsigned Tag, LLVMMetadataRef Type)
Create debugging information entry for a c++ style reference or rvalue reference type.
LLVMMetadataRef LLVMDIBuilderCreateModule(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope, const char *Name, size_t NameLen, const char *ConfigMacros, size_t ConfigMacrosLen, const char *IncludePath, size_t IncludePathLen, const char *APINotesFile, size_t APINotesFileLen)
Creates a new descriptor for a module with the specified parent scope.
LLVMDIBuilderRef LLVMCreateDIBuilderDisallowUnresolved(LLVMModuleRef M)
Construct a builder for a module, and do not allow for unresolved nodes attached to the module.
void LLVMSetSubprogram(LLVMValueRef Func, LLVMMetadataRef SP)
Set the subprogram attached to a function.
LLVMDWARFSourceLanguage
Source languages known by DWARF.
LLVMMetadataRef LLVMDIBuilderGetOrCreateSubrange(LLVMDIBuilderRef Builder, int64_t LowerBound, int64_t Count)
Create a descriptor for a value range.
LLVMDIBuilderRef LLVMCreateDIBuilder(LLVMModuleRef M)
Construct a builder for a module and collect unresolved nodes attached to the module in order to reso...
void LLVMDisposeTemporaryMDNode(LLVMMetadataRef TempNode)
Deallocate a temporary node.
LLVMMetadataRef LLVMDILocationGetScope(LLVMMetadataRef Location)
Get the local scope associated with this debug location.
LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromNamespace(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef NS, LLVMMetadataRef File, unsigned Line)
Create a descriptor for an imported namespace.
LLVMMetadataRef LLVMDIBuilderCreateTempMacroFile(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentMacroFile, unsigned Line, LLVMMetadataRef File)
Create debugging information temporary entry for a macro file.
void LLVMInstructionSetDebugLoc(LLVMValueRef Inst, LLVMMetadataRef Loc)
Set the debug location for the given instruction.
LLVMMetadataRef LLVMDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, int64_t Value, LLVMBool IsUnsigned)
Create debugging information entry for an enumerator.
LLVMMetadataRef LLVMDIBuilderCreateExpression(LLVMDIBuilderRef Builder, uint64_t *Addr, size_t Length)
Create a new descriptor for the specified variable which has a complex address expression for its add...
LLVMMetadataRef LLVMDIBuilderCreateVectorType(LLVMDIBuilderRef Builder, uint64_t Size, uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts, unsigned NumSubscripts)
Create debugging information entry for a vector type.
LLVMMetadataRef LLVMDIBuilderCreateMemberPointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeType, LLVMMetadataRef ClassType, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags)
Create debugging information entry for a pointer to member.
unsigned LLVMDILocationGetColumn(LLVMMetadataRef Location)
Get the column number of this debug location.
LLVMDIFlags
Debug info flags.
LLVMMetadataRef LLVMDIBuilderCreateAutoVariable(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags, uint32_t AlignInBits)
Create a new descriptor for a local auto variable.
LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef Ctx, LLVMMetadataRef *Data, size_t NumElements)
Create a new temporary MDNode.
LLVMDIFlags LLVMDITypeGetFlags(LLVMMetadataRef DType)
Get the flags associated with this DIType.
const char * LLVMDIFileGetDirectory(LLVMMetadataRef File, unsigned *Len)
Get the directory of a given file.
void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef TempTargetMetadata, LLVMMetadataRef Replacement)
Replace all uses of temporary metadata.
const char * LLVMDIFileGetFilename(LLVMMetadataRef File, unsigned *Len)
Get the name of a given file.
LLVMMetadataRef LLVMDIBuilderCreateLabel(LLVMDIBuilderRef Builder, LLVMMetadataRef Context, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMBool AlwaysPreserve)
Create a new descriptor for a label.
unsigned LLVMDebugMetadataVersion(void)
The current debug metadata version number.
unsigned LLVMGetModuleDebugMetadataVersion(LLVMModuleRef Module)
The version of debug metadata that's present in the provided Module.
unsigned LLVMDITypeGetLine(LLVMMetadataRef DType)
Get the source line where this DIType is declared.
LLVMMetadataRef LLVMDIVariableGetFile(LLVMMetadataRef Var)
Get the metadata of the file associated with a given variable.
LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromAlias(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef ImportedEntity, LLVMMetadataRef File, unsigned Line, LLVMMetadataRef *Elements, unsigned NumElements)
Create a descriptor for an imported module that aliases another imported entity descriptor.
LLVMMetadataRef LLVMDIBuilderCreateStaticMemberType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, LLVMMetadataRef Type, LLVMDIFlags Flags, LLVMValueRef ConstantVal, uint32_t AlignInBits)
Create debugging information entry for a C++ static data member.
uint16_t LLVMGetDINodeTag(LLVMMetadataRef MD)
Get the dwarf::Tag of a DINode.
LLVMMetadataRef LLVMDIBuilderCreateGlobalVariableExpression(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, const char *Linkage, size_t LinkLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit, LLVMMetadataRef Expr, LLVMMetadataRef Decl, uint32_t AlignInBits)
Create a new descriptor for the specified variable.
LLVMMetadataRef LLVMDIBuilderCreateTempGlobalVariableFwdDecl(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, const char *Linkage, size_t LnkLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit, LLVMMetadataRef Decl, uint32_t AlignInBits)
Create a new descriptor for the specified global variable that is temporary and meant to be RAUWed.
LLVMMetadataRef LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef Builder, unsigned Tag, LLVMMetadataRef Type)
Create debugging information entry for a qualified type, e.g.
LLVMMetadataKind LLVMGetMetadataKind(LLVMMetadataRef Metadata)
Obtain the enumerated type of a Metadata instance.
LLVMMetadataRef LLVMDIBuilderCreateUnionType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang, const char *UniqueId, size_t UniqueIdLen)
Create debugging information entry for a union.
LLVMMetadataRef LLVMDIBuilderCreateForwardDecl(LLVMDIBuilderRef Builder, unsigned Tag, const char *Name, size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits, const char *UniqueIdentifier, size_t UniqueIdentifierLen)
Create a permanent forward-declared type.
LLVMMetadataRef LLVMDIBuilderCreateParameterVariable(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, unsigned ArgNo, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags)
Create a new descriptor for a function parameter variable.
LLVMMetadataRef LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder, LLVMMetadataRef File, LLVMMetadataRef *ParameterTypes, unsigned NumParameterTypes, LLVMDIFlags Flags)
Create subroutine type.
LLVMMetadataRef LLVMDIBuilderCreateObjCProperty(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, const char *GetterName, size_t GetterNameLen, const char *SetterName, size_t SetterNameLen, unsigned PropertyAttributes, LLVMMetadataRef Ty)
Create debugging information entry for Objective-C property.
LLVMMetadataRef LLVMDIBuilderCreateMacro(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentMacroFile, unsigned Line, LLVMDWARFMacinfoRecordType RecordType, const char *Name, size_t NameLen, const char *Value, size_t ValueLen)
Create debugging information entry for a macro.
LLVMDWARFEmissionKind
The amount of debug information to emit.
LLVMDbgRecordRef LLVMDIBuilderInsertLabelAtEnd(LLVMDIBuilderRef Builder, LLVMMetadataRef LabelInfo, LLVMMetadataRef Location, LLVMBasicBlockRef InsertAtEnd)
Insert a new llvm.dbg.label intrinsic call.
LLVMMetadataRef LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef Builder, uint64_t Size, uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts, unsigned NumSubscripts)
Create debugging information entry for an array.
LLVMDbgRecordRef LLVMDIBuilderInsertDbgValueRecordAtEnd(LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMBasicBlockRef Block)
Only use in "new debug format" (LLVMIsNewDbgInfoFormat() is true).
LLVMMetadataRef LLVMDIScopeGetFile(LLVMMetadataRef Scope)
Get the metadata of the file associated with a given scope.
void LLVMDIBuilderFinalizeSubprogram(LLVMDIBuilderRef Builder, LLVMMetadataRef Subprogram)
Finalize a specific subprogram.
LLVMMetadataRef LLVMDIBuilderCreateConstantValueExpression(LLVMDIBuilderRef Builder, uint64_t Value)
Create a new descriptor for the specified variable that does not have an address, but does have a con...
LLVMMetadataRef LLVMDIBuilderCreateClassType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements, unsigned NumElements, LLVMMetadataRef VTableHolder, LLVMMetadataRef TemplateParamsNode, const char *UniqueIdentifier, size_t UniqueIdentifierLen)
Create debugging information entry for a class.
LLVMMetadataRef LLVMDIBuilderCreateMemberType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef Ty)
Create debugging information entry for a member.
unsigned LLVMDILocationGetLine(LLVMMetadataRef Location)
Get the line number of this debug location.
LLVMMetadataRef LLVMDIBuilderCreateNullPtrType(LLVMDIBuilderRef Builder)
Create C++11 nullptr type.
LLVMMetadataRef LLVMDIBuilderCreateInheritance(LLVMDIBuilderRef Builder, LLVMMetadataRef Ty, LLVMMetadataRef BaseTy, uint64_t BaseOffset, uint32_t VBPtrOffset, LLVMDIFlags Flags)
Create debugging information entry to establish inheritance relationship between two types.
LLVMMetadataRef LLVMDIBuilderCreateCompileUnit(LLVMDIBuilderRef Builder, LLVMDWARFSourceLanguage Lang, LLVMMetadataRef FileRef, const char *Producer, size_t ProducerLen, LLVMBool isOptimized, const char *Flags, size_t FlagsLen, unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen, LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining, LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen, const char *SDK, size_t SDKLen)
A CompileUnit provides an anchor for all debugging information generated during this instance of comp...
LLVMBool LLVMStripModuleDebugInfo(LLVMModuleRef Module)
Strip debug info in the module if it exists.
LLVMDbgRecordRef LLVMDIBuilderInsertDeclareRecordBefore(LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMValueRef Instr)
Only use in "new debug format" (LLVMIsNewDbgInfoFormat() is true).
LLVMDbgRecordRef LLVMDIBuilderInsertLabelBefore(LLVMDIBuilderRef Builder, LLVMMetadataRef LabelInfo, LLVMMetadataRef Location, LLVMValueRef InsertBefore)
Insert a new llvm.dbg.label intrinsic call.
LLVMMetadataRef LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, uint64_t SizeInBits, LLVMDWARFTypeEncoding Encoding, LLVMDIFlags Flags)
Create debugging information entry for a basic type.
unsigned LLVMDIVariableGetLine(LLVMMetadataRef Var)
Get the source line where this DIVariable is declared.
LLVMDbgRecordRef LLVMDIBuilderInsertDbgValueRecordBefore(LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMValueRef Instr)
Only use in "new debug format" (LLVMIsNewDbgInfoFormat() is true).
unsigned LLVMDWARFTypeEncoding
An LLVM DWARF type encoding.
LLVMMetadataRef LLVMDIBuilderCreateLexicalBlock(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned Column)
Create a descriptor for a lexical block with the specified parent context.
LLVMMetadataRef LLVMDIBuilderGetOrCreateTypeArray(LLVMDIBuilderRef Builder, LLVMMetadataRef *Data, size_t NumElements)
Create a type array.
LLVMMetadataRef LLVMDIBuilderCreateReplaceableCompositeType(LLVMDIBuilderRef Builder, unsigned Tag, const char *Name, size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, const char *UniqueIdentifier, size_t UniqueIdentifierLen)
Create a temporary forward-declared type.
const char * LLVMDIFileGetSource(LLVMMetadataRef File, unsigned *Len)
Get the source of a given file.
uint64_t LLVMDITypeGetOffsetInBits(LLVMMetadataRef DType)
Get the offset of this DIType in bits.
LLVMMetadataRef LLVMDIBuilderCreateImportedDeclaration(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef Decl, LLVMMetadataRef File, unsigned Line, const char *Name, size_t NameLen, LLVMMetadataRef *Elements, unsigned NumElements)
Create a descriptor for an imported function, type, or variable.
LLVMMetadataRef LLVMDIBuilderCreateFile(LLVMDIBuilderRef Builder, const char *Filename, size_t FilenameLen, const char *Directory, size_t DirectoryLen)
Create a file descriptor to hold debugging information for a file.
const char * LLVMDITypeGetName(LLVMMetadataRef DType, size_t *Length)
Get the name of this DIType.
unsigned LLVMMetadataKind
LLVMMetadataRef LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Builder, LLVMMetadataRef Type, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Scope, uint32_t AlignInBits)
Create debugging information entry for a typedef.
LLVMMetadataRef LLVMDIBuilderCreateStructType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang, LLVMMetadataRef VTableHolder, const char *UniqueId, size_t UniqueIdLen)
Create debugging information entry for a struct.
void LLVMDisposeDIBuilder(LLVMDIBuilderRef Builder)
Deallocates the DIBuilder and everything it owns.
LLVMMetadataRef LLVMDIBuilderCreatePointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy, uint64_t SizeInBits, uint32_t AlignInBits, unsigned AddressSpace, const char *Name, size_t NameLen)
Create debugging information entry for a pointer.
LLVMMetadataRef LLVMGetSubprogram(LLVMValueRef Func)
Get the metadata of the subprogram attached to a function.
@ LLVMGenericDINodeMetadataKind
struct LLVMOpaqueValue * LLVMValueRef
Represents an individual value in LLVM IR.
struct LLVMOpaqueDbgRecord * LLVMDbgRecordRef
struct LLVMOpaqueContext * LLVMContextRef
The top-level container for all LLVM global data.
struct LLVMOpaqueBasicBlock * LLVMBasicBlockRef
Represents a basic block of instructions in LLVM IR.
struct LLVMOpaqueMetadata * LLVMMetadataRef
Represents an LLVM Metadata.
struct LLVMOpaqueModule * LLVMModuleRef
The top-level container for all other LLVM Intermediate Representation (IR) objects.
struct LLVMOpaqueDIBuilder * LLVMDIBuilderRef
Represents an LLVM debug info builder.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Assignment Tracking (at).
void deleteAll(Function *F)
Remove all Assignment Tracking related intrinsics and metadata from F.
AssignmentInstRange getAssignmentInsts(DIAssignID *ID)
Return a range of instructions (typically just one) that have ID as an attachment.
AssignmentMarkerRange getAssignmentMarkers(DIAssignID *ID)
Return a range of dbg.assign intrinsics which use \ID as an operand.
void trackAssignments(Function::iterator Start, Function::iterator End, const StorageToVarsMap &Vars, const DataLayout &DL, bool DebugPrints=false)
Track assignments to Vars between Start and End.
void remapAssignID(DenseMap< DIAssignID *, DIAssignID * > &Map, Instruction &I)
Replace DIAssignID uses and attachments with IDs from Map.
SmallVector< DbgVariableRecord * > getDVRAssignmentMarkers(const Instruction *Inst)
void deleteAssignmentMarkers(const Instruction *Inst)
Delete the llvm.dbg.assign intrinsics linked to Inst.
std::optional< AssignmentInfo > getAssignmentInfo(const DataLayout &DL, const MemIntrinsic *I)
bool calculateFragmentIntersect(const DataLayout &DL, const Value *Dest, uint64_t SliceOffsetInBits, uint64_t SliceSizeInBits, const DbgAssignIntrinsic *DbgAssign, std::optional< DIExpression::FragmentInfo > &Result)
Calculate the fragment of the variable in DAI covered from (Dest + SliceOffsetInBits) to to (Dest + S...
void RAUW(DIAssignID *Old, DIAssignID *New)
Replace all uses (and attachments) of Old with New.
Calculates the starting offsets for various sections within the .debug_names section.
void prune(LinkGraph &G)
Removes dead symbols/blocks/addressables.
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
TinyPtrVector< DbgDeclareInst * > findDbgDeclares(Value *V)
Finds dbg.declare intrinsics declaring local variables as living in the memory that 'V' points to.
bool stripDebugInfo(Function &F)
void findDbgUsers(SmallVectorImpl< DbgVariableIntrinsic * > &DbgInsts, Value *V, SmallVectorImpl< DbgVariableRecord * > *DbgVariableRecords=nullptr)
Finds the debug info intrinsics describing a value.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
@ Import
Import information from summary.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
void findDbgValues(SmallVectorImpl< DbgValueInst * > &DbgValues, Value *V, SmallVectorImpl< DbgVariableRecord * > *DbgVariableRecords=nullptr)
Finds the llvm.dbg.value intrinsics describing a value.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
bool stripNonLineTableDebugInfo(Module &M)
Downgrade the debug info in a module to contain only line table information.
DebugLoc getDebugValueLoc(DbgVariableIntrinsic *DII)
Produce a DebugLoc to use for each dbg.declare that is promoted to a dbg.value.
TinyPtrVector< DbgVariableRecord * > findDVRValues(Value *V)
As above, for DVRValues.
unsigned getDebugMetadataVersionFromModule(const Module &M)
Return Debug Info Metadata Version by checking module flags.
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
@ Ref
The access may reference the value stored in memory.
Attribute unwrap(LLVMAttributeRef Attr)
bool isAssignmentTrackingEnabled(const Module &M)
Return true if assignment tracking is enabled for module M.
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
LLVMAttributeRef wrap(Attribute Attr)
TinyPtrVector< DbgVariableRecord * > findDVRDeclares(Value *V)
As above, for DVRDeclares.
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
void updateLoopMetadataDebugLocations(Instruction &I, function_ref< Metadata *(Metadata *)> Updater)
Update the debug locations contained within the MD_loop metadata attached to the instruction I,...
DISubprogram * getDISubprogram(const MDNode *Scope)
Find subprogram that is enclosing this scope.
Helper object to track which of three possible relocation mechanisms are used for a particular value ...
Describes properties of a store that has a static size and offset into a some base storage.
Helper struct for trackAssignments, below.