@@ -31,11 +31,11 @@ static SanitizerMask expandKernelSanitizerMasks(SanitizerMask Mask) {
3131 return Mask;
3232}
3333
34- void SanitizerMetadata::reportGlobal (llvm::GlobalVariable *GV,
35- SourceLocation Loc, StringRef Name,
36- QualType Ty,
37- SanitizerMask NoSanitizeAttrMask,
38- bool IsDynInit) {
34+ void SanitizerMetadata::reportGlobalToASan (llvm::GlobalVariable *GV,
35+ SourceLocation Loc, StringRef Name,
36+ QualType Ty,
37+ SanitizerMask NoSanitizeAttrMask,
38+ bool IsDynInit) {
3939 SanitizerSet FsanitizeArgument = CGM.getLangOpts ().Sanitize ;
4040 if (!isAsanHwasanOrMemTag (FsanitizeArgument))
4141 return ;
@@ -72,8 +72,8 @@ void SanitizerMetadata::reportGlobal(llvm::GlobalVariable *GV,
7272 GV->setSanitizerMetadata (Meta);
7373}
7474
75- void SanitizerMetadata::reportGlobal (llvm::GlobalVariable *GV, const VarDecl &D ,
76- bool IsDynInit) {
75+ void SanitizerMetadata::reportGlobalToASan (llvm::GlobalVariable *GV,
76+ const VarDecl &D, bool IsDynInit) {
7777 if (!isAsanHwasanOrMemTag (CGM.getLangOpts ().Sanitize ))
7878 return ;
7979 std::string QualName;
@@ -95,6 +95,30 @@ void SanitizerMetadata::reportGlobal(llvm::GlobalVariable *GV, const VarDecl &D,
9595 IsDynInit);
9696}
9797
98+ void SanitizerMetadata::reportGlobalToTySan (llvm::GlobalVariable *GV,
99+ const VarDecl &D) {
100+ if (!CGM.getLangOpts ().Sanitize .has (SanitizerKind::Type))
101+ return ;
102+
103+ for (auto Attr : D.specific_attrs <NoSanitizeAttr>())
104+ if (Attr->getMask () & SanitizerKind::Type)
105+ return ;
106+
107+ QualType QTy = D.getType ();
108+ llvm::MDNode *TBAAInfo = CGM.getTBAATypeInfo (QTy);
109+ if (!TBAAInfo || TBAAInfo == CGM.getTBAATypeInfo (CGM.getContext ().CharTy ))
110+ return ;
111+
112+ llvm::Metadata *GlobalMetadata[] = {llvm::ConstantAsMetadata::get (GV),
113+ TBAAInfo};
114+
115+ llvm::MDNode *ThisGlobal =
116+ llvm::MDNode::get (CGM.getLLVMContext (), GlobalMetadata);
117+ llvm::NamedMDNode *TysanGlobals =
118+ CGM.getModule ().getOrInsertNamedMetadata (" llvm.tysan.globals" );
119+ TysanGlobals->addOperand (ThisGlobal);
120+ }
121+
98122void SanitizerMetadata::disableSanitizerForGlobal (llvm::GlobalVariable *GV) {
99- reportGlobal (GV, SourceLocation (), " " , QualType (), SanitizerKind::All);
123+ reportGlobalToASan (GV, SourceLocation (), " " , QualType (), SanitizerKind::All);
100124}
0 commit comments