Skip to content

Commit 53855f0

Browse files
committed
Verifier: Check operands of MDType subclasses and MDCompileUnit
Add verify checks for `MDType` subclasses and for `MDCompileUnit`. These new checks don't yet incorporate everything from `Verify()`, but at least they sanity check the operands. Also downcast accessors as possible. A lot of these accessors can't be downcast as far as we'd like because of arrays of typed objects (stored in a generic `MDTuple`) and `MDString`-based type references. Eventually I'll port over `DIRef<>` and `DITypedArray<>` from `DebugInfo.h` to clean those up as well. Updated bitrotted testcases separately in r233415 and r233443 to reduce churn on the off-chance this needs to be reverted. llvm-svn: 233446
1 parent d9ccfb9 commit 53855f0

File tree

7 files changed

+278
-154
lines changed

7 files changed

+278
-154
lines changed

llvm/include/llvm/IR/DIBuilder.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ namespace llvm {
5757
Module &M;
5858
LLVMContext &VMContext;
5959

60-
MDNode *TempEnumTypes;
61-
MDNode *TempRetainTypes;
62-
MDNode *TempSubprograms;
63-
MDNode *TempGVs;
64-
MDNode *TempImportedModules;
60+
MDTuple *TempEnumTypes;
61+
MDTuple *TempRetainTypes;
62+
MDTuple *TempSubprograms;
63+
MDTuple *TempGVs;
64+
MDTuple *TempImportedModules;
6565

6666
Function *DeclareFn; // llvm.dbg.declare
6767
Function *ValueFn; // llvm.dbg.value

llvm/include/llvm/IR/DebugInfoMetadata.h

Lines changed: 62 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -282,13 +282,16 @@ class MDScope : public DebugNode {
282282
~MDScope() {}
283283

284284
public:
285-
/// \brief Return the underlying file.
285+
// FIXME: Downcast to MDFile once we've verified all subclasses.
286+
Metadata *getFile() const { return getRawFile(); }
287+
288+
/// \brief Return the raw underlying file.
286289
///
287290
/// An \a MDFile is an \a MDScope, but it doesn't point at a separate file
288291
/// (it\em is the file). If \c this is an \a MDFile, we need to return \c
289292
/// this. Otherwise, return the first operand, which is where all other
290293
/// subclasses store their file pointer.
291-
Metadata *getFile() const {
294+
Metadata *getRawFile() const {
292295
return isa<MDFile>(this) ? const_cast<MDScope *>(this)
293296
: static_cast<Metadata *>(getOperand(0));
294297
}
@@ -390,9 +393,14 @@ class MDType : public MDScope {
390393
uint64_t getOffsetInBits() const { return OffsetInBits; }
391394
unsigned getFlags() const { return Flags; }
392395

393-
Metadata *getScope() const { return getOperand(1); }
396+
// FIXME: Remove this once MDScope::getFile() does the same.
397+
MDFile *getFile() const { return cast_or_null<MDFile>(getRawFile()); }
398+
399+
Metadata *getScope() const { return getRawScope(); }
394400
StringRef getName() const { return getStringOperand(2); }
395401

402+
403+
Metadata *getRawScope() const { return getOperand(1); }
396404
MDString *getRawName() const { return getOperandAs<MDString>(2); }
397405

398406
void setFlags(unsigned NewFlags) {
@@ -483,7 +491,8 @@ class MDDerivedTypeBase : public MDType {
483491
~MDDerivedTypeBase() {}
484492

485493
public:
486-
Metadata *getBaseType() const { return getOperand(3); }
494+
Metadata *getBaseType() const { return getRawBaseType(); }
495+
Metadata *getRawBaseType() const { return getOperand(3); }
487496

488497
static bool classof(const Metadata *MD) {
489498
return MD->getMetadataID() == MDDerivedTypeKind ||
@@ -510,7 +519,7 @@ class MDDerivedType : public MDDerivedTypeBase {
510519
~MDDerivedType() {}
511520

512521
static MDDerivedType *getImpl(LLVMContext &Context, unsigned Tag,
513-
StringRef Name, Metadata *File, unsigned Line,
522+
StringRef Name, MDFile *File, unsigned Line,
514523
Metadata *Scope, Metadata *BaseType,
515524
uint64_t SizeInBits, uint64_t AlignInBits,
516525
uint64_t OffsetInBits, unsigned Flags,
@@ -545,7 +554,7 @@ class MDDerivedType : public MDDerivedTypeBase {
545554
(Tag, Name, File, Line, Scope, BaseType, SizeInBits,
546555
AlignInBits, OffsetInBits, Flags, ExtraData))
547556
DEFINE_MDNODE_GET(MDDerivedType,
548-
(unsigned Tag, StringRef Name, Metadata *File,
557+
(unsigned Tag, StringRef Name, MDFile *File,
549558
unsigned Line, Metadata *Scope, Metadata *BaseType,
550559
uint64_t SizeInBits, uint64_t AlignInBits,
551560
uint64_t OffsetInBits, unsigned Flags,
@@ -562,7 +571,8 @@ class MDDerivedType : public MDDerivedTypeBase {
562571
///
563572
/// TODO: Separate out types that need this extra operand: pointer-to-member
564573
/// types and member fields (static members and ivars).
565-
Metadata *getExtraData() const { return getOperand(4); }
574+
Metadata *getExtraData() const { return getRawExtraData(); }
575+
Metadata *getRawExtraData() const { return getOperand(4); }
566576

567577
static bool classof(const Metadata *MD) {
568578
return MD->getMetadataID() == MDDerivedTypeKind;
@@ -587,12 +597,19 @@ class MDCompositeTypeBase : public MDDerivedTypeBase {
587597
~MDCompositeTypeBase() {}
588598

589599
public:
590-
Metadata *getElements() const { return getOperand(4); }
591-
Metadata *getVTableHolder() const { return getOperand(5); }
592-
Metadata *getTemplateParams() const { return getOperand(6); }
600+
MDTuple *getElements() const {
601+
return cast_or_null<MDTuple>(getRawElements());
602+
}
603+
Metadata *getVTableHolder() const { return getRawVTableHolder(); }
604+
MDTuple *getTemplateParams() const {
605+
return cast_or_null<MDTuple>(getRawTemplateParams());
606+
}
593607
StringRef getIdentifier() const { return getStringOperand(7); }
594608
unsigned getRuntimeLang() const { return RuntimeLang; }
595609

610+
Metadata *getRawElements() const { return getOperand(4); }
611+
Metadata *getRawVTableHolder() const { return getOperand(5); }
612+
Metadata *getRawTemplateParams() const { return getOperand(6); }
596613
MDString *getRawIdentifier() const { return getOperandAs<MDString>(7); }
597614

598615
/// \brief Replace operands.
@@ -730,7 +747,8 @@ class MDSubroutineType : public MDCompositeTypeBase {
730747

731748
TempMDSubroutineType clone() const { return cloneImpl(); }
732749

733-
Metadata *getTypeArray() const { return getElements(); }
750+
MDTuple *getTypeArray() const { return getElements(); }
751+
Metadata *getRawTypeArray() const { return getRawElements(); }
734752

735753
static bool classof(const Metadata *MD) {
736754
return MD->getMetadataID() == MDSubroutineTypeKind;
@@ -756,12 +774,12 @@ class MDCompileUnit : public MDScope {
756774
~MDCompileUnit() {}
757775

758776
static MDCompileUnit *
759-
getImpl(LLVMContext &Context, unsigned SourceLanguage, Metadata *File,
777+
getImpl(LLVMContext &Context, unsigned SourceLanguage, MDFile *File,
760778
StringRef Producer, bool IsOptimized, StringRef Flags,
761779
unsigned RuntimeVersion, StringRef SplitDebugFilename,
762-
unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes,
763-
Metadata *Subprograms, Metadata *GlobalVariables,
764-
Metadata *ImportedEntities, StorageType Storage,
780+
unsigned EmissionKind, MDTuple *EnumTypes, MDTuple *RetainedTypes,
781+
MDTuple *Subprograms, MDTuple *GlobalVariables,
782+
MDTuple *ImportedEntities, StorageType Storage,
765783
bool ShouldCreate = true) {
766784
return getImpl(Context, SourceLanguage, File,
767785
getCanonicalMDString(Context, Producer), IsOptimized,
@@ -789,12 +807,12 @@ class MDCompileUnit : public MDScope {
789807

790808
public:
791809
DEFINE_MDNODE_GET(MDCompileUnit,
792-
(unsigned SourceLanguage, Metadata *File,
793-
StringRef Producer, bool IsOptimized, StringRef Flags,
794-
unsigned RuntimeVersion, StringRef SplitDebugFilename,
795-
unsigned EmissionKind, Metadata *EnumTypes,
796-
Metadata *RetainedTypes, Metadata *Subprograms,
797-
Metadata *GlobalVariables, Metadata *ImportedEntities),
810+
(unsigned SourceLanguage, MDFile *File, StringRef Producer,
811+
bool IsOptimized, StringRef Flags, unsigned RuntimeVersion,
812+
StringRef SplitDebugFilename, unsigned EmissionKind,
813+
MDTuple *EnumTypes, MDTuple *RetainedTypes,
814+
MDTuple *Subprograms, MDTuple *GlobalVariables,
815+
MDTuple *ImportedEntities),
798816
(SourceLanguage, File, Producer, IsOptimized, Flags,
799817
RuntimeVersion, SplitDebugFilename, EmissionKind,
800818
EnumTypes, RetainedTypes, Subprograms, GlobalVariables,
@@ -813,24 +831,42 @@ class MDCompileUnit : public MDScope {
813831

814832
TempMDCompileUnit clone() const { return cloneImpl(); }
815833

834+
// FIXME: Remove this once MDScope::getFile() does the same.
835+
MDFile *getFile() const { return cast_or_null<MDFile>(getRawFile()); }
836+
816837
unsigned getSourceLanguage() const { return SourceLanguage; }
817838
bool isOptimized() const { return IsOptimized; }
818839
unsigned getRuntimeVersion() const { return RuntimeVersion; }
819840
unsigned getEmissionKind() const { return EmissionKind; }
820841
StringRef getProducer() const { return getStringOperand(1); }
821842
StringRef getFlags() const { return getStringOperand(2); }
822843
StringRef getSplitDebugFilename() const { return getStringOperand(3); }
823-
Metadata *getEnumTypes() const { return getOperand(4); }
824-
Metadata *getRetainedTypes() const { return getOperand(5); }
825-
Metadata *getSubprograms() const { return getOperand(6); }
826-
Metadata *getGlobalVariables() const { return getOperand(7); }
827-
Metadata *getImportedEntities() const { return getOperand(8); }
844+
MDTuple *getEnumTypes() const {
845+
return cast_or_null<MDTuple>(getRawEnumTypes());
846+
}
847+
MDTuple *getRetainedTypes() const {
848+
return cast_or_null<MDTuple>(getRawRetainedTypes());
849+
}
850+
MDTuple *getSubprograms() const {
851+
return cast_or_null<MDTuple>(getRawSubprograms());
852+
}
853+
MDTuple *getGlobalVariables() const {
854+
return cast_or_null<MDTuple>(getRawGlobalVariables());
855+
}
856+
MDTuple *getImportedEntities() const {
857+
return cast_or_null<MDTuple>(getRawImportedEntities());
858+
}
828859

829860
MDString *getRawProducer() const { return getOperandAs<MDString>(1); }
830861
MDString *getRawFlags() const { return getOperandAs<MDString>(2); }
831862
MDString *getRawSplitDebugFilename() const {
832863
return getOperandAs<MDString>(3);
833864
}
865+
Metadata *getRawEnumTypes() const { return getOperand(4); }
866+
Metadata *getRawRetainedTypes() const { return getOperand(5); }
867+
Metadata *getRawSubprograms() const { return getOperand(6); }
868+
Metadata *getRawGlobalVariables() const { return getOperand(7); }
869+
Metadata *getRawImportedEntities() const { return getOperand(8); }
834870

835871
/// \brief Replace arrays.
836872
///

llvm/lib/IR/AsmWriter.cpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1539,16 +1539,16 @@ static void writeMDDerivedType(raw_ostream &Out, const MDDerivedType *N,
15391539
MDFieldPrinter Printer(Out, TypePrinter, Machine, Context);
15401540
Printer.printTag(N);
15411541
Printer.printString("name", N->getName());
1542-
Printer.printMetadata("scope", N->getScope());
1543-
Printer.printMetadata("file", N->getFile());
1542+
Printer.printMetadata("scope", N->getRawScope());
1543+
Printer.printMetadata("file", N->getRawFile());
15441544
Printer.printInt("line", N->getLine());
1545-
Printer.printMetadata("baseType", N->getBaseType(),
1545+
Printer.printMetadata("baseType", N->getRawBaseType(),
15461546
/* ShouldSkipNull */ false);
15471547
Printer.printInt("size", N->getSizeInBits());
15481548
Printer.printInt("align", N->getAlignInBits());
15491549
Printer.printInt("offset", N->getOffsetInBits());
15501550
Printer.printDIFlags("flags", N->getFlags());
1551-
Printer.printMetadata("extraData", N->getExtraData());
1551+
Printer.printMetadata("extraData", N->getRawExtraData());
15521552
Out << ")";
15531553
}
15541554

@@ -1559,19 +1559,19 @@ static void writeMDCompositeType(raw_ostream &Out, const MDCompositeType *N,
15591559
MDFieldPrinter Printer(Out, TypePrinter, Machine, Context);
15601560
Printer.printTag(N);
15611561
Printer.printString("name", N->getName());
1562-
Printer.printMetadata("scope", N->getScope());
1563-
Printer.printMetadata("file", N->getFile());
1562+
Printer.printMetadata("scope", N->getRawScope());
1563+
Printer.printMetadata("file", N->getRawFile());
15641564
Printer.printInt("line", N->getLine());
1565-
Printer.printMetadata("baseType", N->getBaseType());
1565+
Printer.printMetadata("baseType", N->getRawBaseType());
15661566
Printer.printInt("size", N->getSizeInBits());
15671567
Printer.printInt("align", N->getAlignInBits());
15681568
Printer.printInt("offset", N->getOffsetInBits());
15691569
Printer.printDIFlags("flags", N->getFlags());
1570-
Printer.printMetadata("elements", N->getElements());
1570+
Printer.printMetadata("elements", N->getRawElements());
15711571
Printer.printDwarfEnum("runtimeLang", N->getRuntimeLang(),
15721572
dwarf::LanguageString);
1573-
Printer.printMetadata("vtableHolder", N->getVTableHolder());
1574-
Printer.printMetadata("templateParams", N->getTemplateParams());
1573+
Printer.printMetadata("vtableHolder", N->getRawVTableHolder());
1574+
Printer.printMetadata("templateParams", N->getRawTemplateParams());
15751575
Printer.printString("identifier", N->getIdentifier());
15761576
Out << ")";
15771577
}
@@ -1582,7 +1582,8 @@ static void writeMDSubroutineType(raw_ostream &Out, const MDSubroutineType *N,
15821582
Out << "!MDSubroutineType(";
15831583
MDFieldPrinter Printer(Out, TypePrinter, Machine, Context);
15841584
Printer.printDIFlags("flags", N->getFlags());
1585-
Printer.printMetadata("types", N->getTypeArray(), /* ShouldSkipNull */ false);
1585+
Printer.printMetadata("types", N->getRawTypeArray(),
1586+
/* ShouldSkipNull */ false);
15861587
Out << ")";
15871588
}
15881589

@@ -1604,7 +1605,7 @@ static void writeMDCompileUnit(raw_ostream &Out, const MDCompileUnit *N,
16041605
MDFieldPrinter Printer(Out, TypePrinter, Machine, Context);
16051606
Printer.printDwarfEnum("language", N->getSourceLanguage(),
16061607
dwarf::LanguageString, /* ShouldSkipZero */ false);
1607-
Printer.printMetadata("file", N->getFile(), /* ShouldSkipNull */ false);
1608+
Printer.printMetadata("file", N->getRawFile(), /* ShouldSkipNull */ false);
16081609
Printer.printString("producer", N->getProducer());
16091610
Printer.printBool("isOptimized", N->isOptimized());
16101611
Printer.printString("flags", N->getFlags());
@@ -1613,11 +1614,11 @@ static void writeMDCompileUnit(raw_ostream &Out, const MDCompileUnit *N,
16131614
Printer.printString("splitDebugFilename", N->getSplitDebugFilename());
16141615
Printer.printInt("emissionKind", N->getEmissionKind(),
16151616
/* ShouldSkipZero */ false);
1616-
Printer.printMetadata("enums", N->getEnumTypes());
1617-
Printer.printMetadata("retainedTypes", N->getRetainedTypes());
1618-
Printer.printMetadata("subprograms", N->getSubprograms());
1619-
Printer.printMetadata("globals", N->getGlobalVariables());
1620-
Printer.printMetadata("imports", N->getImportedEntities());
1617+
Printer.printMetadata("enums", N->getRawEnumTypes());
1618+
Printer.printMetadata("retainedTypes", N->getRawRetainedTypes());
1619+
Printer.printMetadata("subprograms", N->getRawSubprograms());
1620+
Printer.printMetadata("globals", N->getRawGlobalVariables());
1621+
Printer.printMetadata("imports", N->getRawImportedEntities());
16211622
Out << ")";
16221623
}
16231624

llvm/lib/IR/DIBuilder.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,8 @@ DIDerivedType DIBuilder::createReferenceType(unsigned Tag, DIType RTy) {
269269

270270
DIDerivedType DIBuilder::createTypedef(DIType Ty, StringRef Name, DIFile File,
271271
unsigned LineNo, DIDescriptor Context) {
272-
return MDDerivedType::get(VMContext, dwarf::DW_TAG_typedef, Name,
273-
File.getFileNode(), LineNo,
272+
return MDDerivedType::get(VMContext, dwarf::DW_TAG_typedef, Name, File,
273+
LineNo,
274274
DIScope(getNonCompileUnitScope(Context)).getRef(),
275275
Ty.getRef(), 0, 0, 0, 0);
276276
}

0 commit comments

Comments
 (0)