@@ -480,6 +480,7 @@ class Verifier : public InstVisitor<Verifier>, VerifierSupport {
480
480
visitModuleFlags ();
481
481
visitModuleIdents ();
482
482
visitModuleCommandLines ();
483
+ visitModuleErrnoTBAA ();
483
484
484
485
verifyCompileUnits ();
485
486
@@ -516,6 +517,7 @@ class Verifier : public InstVisitor<Verifier>, VerifierSupport {
516
517
void visitComdat (const Comdat &C);
517
518
void visitModuleIdents ();
518
519
void visitModuleCommandLines ();
520
+ void visitModuleErrnoTBAA ();
519
521
void visitModuleFlags ();
520
522
void visitModuleFlag (const MDNode *Op,
521
523
DenseMap<const MDString *, const MDNode *> &SeenIDs,
@@ -1815,6 +1817,18 @@ void Verifier::visitModuleCommandLines() {
1815
1817
}
1816
1818
}
1817
1819
1820
+ void Verifier::visitModuleErrnoTBAA () {
1821
+ const NamedMDNode *ErrnoTBAA = M.getNamedMetadata (" llvm.errno.tbaa" );
1822
+ if (!ErrnoTBAA)
1823
+ return ;
1824
+
1825
+ Check (ErrnoTBAA->getNumOperands () >= 1 ,
1826
+ " llvm.errno.tbaa must have at least one operand" , ErrnoTBAA);
1827
+
1828
+ for (const MDNode *N : ErrnoTBAA->operands ())
1829
+ TBAAVerifyHelper.visitTBAAMetadata (nullptr , N);
1830
+ }
1831
+
1818
1832
void Verifier::visitModuleFlags () {
1819
1833
const NamedMDNode *Flags = M.getModuleFlagsMetadata ();
1820
1834
if (!Flags) return ;
@@ -5537,7 +5551,7 @@ void Verifier::visitInstruction(Instruction &I) {
5537
5551
visitNofreeMetadata (I, MD);
5538
5552
5539
5553
if (MDNode *TBAA = I.getMetadata (LLVMContext::MD_tbaa))
5540
- TBAAVerifyHelper.visitTBAAMetadata (I, TBAA);
5554
+ TBAAVerifyHelper.visitTBAAMetadata (& I, TBAA);
5541
5555
5542
5556
if (MDNode *MD = I.getMetadata (LLVMContext::MD_noalias))
5543
5557
visitAliasScopeListMetadata (MD);
@@ -7879,21 +7893,22 @@ static bool isNewFormatTBAATypeNode(llvm::MDNode *Type) {
7879
7893
return isa_and_nonnull<MDNode>(Type->getOperand (0 ));
7880
7894
}
7881
7895
7882
- bool TBAAVerifier::visitTBAAMetadata (Instruction & I, const MDNode *MD) {
7883
- CheckTBAA (MD->getNumOperands () > 0 , " TBAA metadata cannot have 0 operands" ,
7884
- &I, MD);
7896
+ bool TBAAVerifier::visitTBAAMetadata (Instruction * I, const MDNode *MD) {
7897
+ CheckTBAA (MD->getNumOperands () > 0 , " TBAA metadata cannot have 0 operands" , I,
7898
+ MD);
7885
7899
7886
- CheckTBAA (isa<LoadInst>(I) || isa<StoreInst>(I) || isa<CallInst>(I) ||
7887
- isa<VAArgInst>(I) || isa<AtomicRMWInst>(I) ||
7888
- isa<AtomicCmpXchgInst>(I),
7889
- " This instruction shall not have a TBAA access tag!" , &I);
7900
+ if (I)
7901
+ CheckTBAA (isa<LoadInst>(I) || isa<StoreInst>(I) || isa<CallInst>(I) ||
7902
+ isa<VAArgInst>(I) || isa<AtomicRMWInst>(I) ||
7903
+ isa<AtomicCmpXchgInst>(I),
7904
+ " This instruction shall not have a TBAA access tag!" , I);
7890
7905
7891
7906
bool IsStructPathTBAA =
7892
7907
isa<MDNode>(MD->getOperand (0 )) && MD->getNumOperands () >= 3 ;
7893
7908
7894
7909
CheckTBAA (IsStructPathTBAA,
7895
7910
" Old-style TBAA is no longer allowed, use struct-path TBAA instead" ,
7896
- & I);
7911
+ I);
7897
7912
7898
7913
MDNode *BaseNode = dyn_cast_or_null<MDNode>(MD->getOperand (0 ));
7899
7914
MDNode *AccessType = dyn_cast_or_null<MDNode>(MD->getOperand (1 ));
@@ -7902,17 +7917,17 @@ bool TBAAVerifier::visitTBAAMetadata(Instruction &I, const MDNode *MD) {
7902
7917
7903
7918
if (IsNewFormat) {
7904
7919
CheckTBAA (MD->getNumOperands () == 4 || MD->getNumOperands () == 5 ,
7905
- " Access tag metadata must have either 4 or 5 operands" , & I, MD);
7920
+ " Access tag metadata must have either 4 or 5 operands" , I, MD);
7906
7921
} else {
7907
7922
CheckTBAA (MD->getNumOperands () < 5 ,
7908
- " Struct tag metadata must have either 3 or 4 operands" , & I, MD);
7923
+ " Struct tag metadata must have either 3 or 4 operands" , I, MD);
7909
7924
}
7910
7925
7911
7926
// Check the access size field.
7912
7927
if (IsNewFormat) {
7913
7928
auto *AccessSizeNode = mdconst::dyn_extract_or_null<ConstantInt>(
7914
7929
MD->getOperand (3 ));
7915
- CheckTBAA (AccessSizeNode, " Access size field must be a constant" , & I, MD);
7930
+ CheckTBAA (AccessSizeNode, " Access size field must be a constant" , I, MD);
7916
7931
}
7917
7932
7918
7933
// Check the immutability flag.
@@ -7921,45 +7936,45 @@ bool TBAAVerifier::visitTBAAMetadata(Instruction &I, const MDNode *MD) {
7921
7936
auto *IsImmutableCI = mdconst::dyn_extract_or_null<ConstantInt>(
7922
7937
MD->getOperand (ImmutabilityFlagOpNo));
7923
7938
CheckTBAA (IsImmutableCI,
7924
- " Immutability tag on struct tag metadata must be a constant" , & I,
7939
+ " Immutability tag on struct tag metadata must be a constant" , I,
7925
7940
MD);
7926
7941
CheckTBAA (
7927
7942
IsImmutableCI->isZero () || IsImmutableCI->isOne (),
7928
- " Immutability part of the struct tag metadata must be either 0 or 1" ,
7929
- &I, MD);
7943
+ " Immutability part of the struct tag metadata must be either 0 or 1" , I,
7944
+ MD);
7930
7945
}
7931
7946
7932
7947
CheckTBAA (BaseNode && AccessType,
7933
7948
" Malformed struct tag metadata: base and access-type "
7934
7949
" should be non-null and point to Metadata nodes" ,
7935
- & I, MD, BaseNode, AccessType);
7950
+ I, MD, BaseNode, AccessType);
7936
7951
7937
7952
if (!IsNewFormat) {
7938
7953
CheckTBAA (isValidScalarTBAANode (AccessType),
7939
- " Access type node must be a valid scalar type" , & I, MD,
7954
+ " Access type node must be a valid scalar type" , I, MD,
7940
7955
AccessType);
7941
7956
}
7942
7957
7943
7958
auto *OffsetCI = mdconst::dyn_extract_or_null<ConstantInt>(MD->getOperand (2 ));
7944
- CheckTBAA (OffsetCI, " Offset must be constant integer" , & I, MD);
7959
+ CheckTBAA (OffsetCI, " Offset must be constant integer" , I, MD);
7945
7960
7946
7961
APInt Offset = OffsetCI->getValue ();
7947
7962
bool SeenAccessTypeInPath = false ;
7948
7963
7949
7964
SmallPtrSet<MDNode *, 4 > StructPath;
7950
7965
7951
7966
for (/* empty */ ; BaseNode && !IsRootTBAANode (BaseNode);
7952
- BaseNode = getFieldNodeFromTBAABaseNode (I, BaseNode, Offset,
7953
- IsNewFormat)) {
7967
+ BaseNode =
7968
+ getFieldNodeFromTBAABaseNode (*I, BaseNode, Offset, IsNewFormat)) {
7954
7969
if (!StructPath.insert (BaseNode).second ) {
7955
- CheckFailed (" Cycle detected in struct path" , & I, MD);
7970
+ CheckFailed (" Cycle detected in struct path" , I, MD);
7956
7971
return false ;
7957
7972
}
7958
7973
7959
7974
bool Invalid;
7960
7975
unsigned BaseNodeBitWidth;
7961
- std::tie (Invalid, BaseNodeBitWidth) = verifyTBAABaseNode (I, BaseNode,
7962
- IsNewFormat);
7976
+ std::tie (Invalid, BaseNodeBitWidth) =
7977
+ verifyTBAABaseNode (*I, BaseNode, IsNewFormat);
7963
7978
7964
7979
// If the base node is invalid in itself, then we've already printed all the
7965
7980
// errors we wanted to print.
@@ -7969,20 +7984,20 @@ bool TBAAVerifier::visitTBAAMetadata(Instruction &I, const MDNode *MD) {
7969
7984
SeenAccessTypeInPath |= BaseNode == AccessType;
7970
7985
7971
7986
if (isValidScalarTBAANode (BaseNode) || BaseNode == AccessType)
7972
- CheckTBAA (Offset == 0 , " Offset not zero at the point of scalar access" ,
7973
- &I, MD, &Offset);
7987
+ CheckTBAA (Offset == 0 , " Offset not zero at the point of scalar access" , I,
7988
+ MD, &Offset);
7974
7989
7975
7990
CheckTBAA (BaseNodeBitWidth == Offset.getBitWidth () ||
7976
7991
(BaseNodeBitWidth == 0 && Offset == 0 ) ||
7977
7992
(IsNewFormat && BaseNodeBitWidth == ~0u ),
7978
- " Access bit-width not the same as description bit-width" , & I, MD,
7993
+ " Access bit-width not the same as description bit-width" , I, MD,
7979
7994
BaseNodeBitWidth, Offset.getBitWidth ());
7980
7995
7981
7996
if (IsNewFormat && SeenAccessTypeInPath)
7982
7997
break ;
7983
7998
}
7984
7999
7985
- CheckTBAA (SeenAccessTypeInPath, " Did not see access type in access path!" , & I,
8000
+ CheckTBAA (SeenAccessTypeInPath, " Did not see access type in access path!" , I,
7986
8001
MD);
7987
8002
return true ;
7988
8003
}
0 commit comments