@@ -19,9 +19,10 @@ using namespace CodeGen;
1919
2020SanitizerMetadata::SanitizerMetadata (CodeGenModule &CGM) : CGM(CGM) {}
2121
22- static bool isAsanHwasanOrMemTag (const SanitizerSet &SS) {
22+ static bool isAsanHwasanMemTagOrTysan (const SanitizerSet &SS) {
2323 return SS.hasOneOf (SanitizerKind::Address | SanitizerKind::KernelAddress |
24- SanitizerKind::HWAddress | SanitizerKind::MemTag);
24+ SanitizerKind::HWAddress | SanitizerKind::MemTag |
25+ SanitizerKind::Type);
2526}
2627
2728static SanitizerMask expandKernelSanitizerMasks (SanitizerMask Mask) {
@@ -31,13 +32,13 @@ static SanitizerMask expandKernelSanitizerMasks(SanitizerMask Mask) {
3132 return Mask;
3233}
3334
34- void SanitizerMetadata::reportGlobalToASan (llvm::GlobalVariable *GV,
35- SourceLocation Loc, StringRef Name,
36- QualType Ty,
37- SanitizerMask NoSanitizeAttrMask,
38- bool IsDynInit) {
35+ void SanitizerMetadata::reportGlobal (llvm::GlobalVariable *GV,
36+ SourceLocation Loc, StringRef Name,
37+ QualType Ty,
38+ SanitizerMask NoSanitizeAttrMask,
39+ bool IsDynInit) {
3940 SanitizerSet FsanitizeArgument = CGM.getLangOpts ().Sanitize ;
40- if (!isAsanHwasanOrMemTag (FsanitizeArgument))
41+ if (!isAsanHwasanMemTagOrTysan (FsanitizeArgument))
4142 return ;
4243
4344 FsanitizeArgument.Mask = expandKernelSanitizerMasks (FsanitizeArgument.Mask );
@@ -70,11 +71,32 @@ void SanitizerMetadata::reportGlobalToASan(llvm::GlobalVariable *GV,
7071 GV, Loc, Ty, " init" );
7172
7273 GV->setSanitizerMetadata (Meta);
74+
75+ if (!CGM.getLangOpts ().Sanitize .has (SanitizerKind::Type) ||
76+ NoSanitizeAttrMask & SanitizerKind::Type)
77+ return ;
78+
79+ llvm::MDNode *TBAAInfo = CGM.getTBAATypeInfo (Ty);
80+ if (!TBAAInfo || TBAAInfo == CGM.getTBAATypeInfo (CGM.getContext ().CharTy ))
81+ return ;
82+
83+ llvm::Metadata *GlobalMetadata[] = {llvm::ConstantAsMetadata::get (GV),
84+ TBAAInfo};
85+
86+ // Metadata for the global already registered.
87+ if (llvm::MDNode::getIfExists (CGM.getLLVMContext (), GlobalMetadata))
88+ return ;
89+
90+ llvm::MDNode *ThisGlobal =
91+ llvm::MDNode::get (CGM.getLLVMContext (), GlobalMetadata);
92+ llvm::NamedMDNode *TysanGlobals =
93+ CGM.getModule ().getOrInsertNamedMetadata (" llvm.tysan.globals" );
94+ TysanGlobals->addOperand (ThisGlobal);
7395}
7496
75- void SanitizerMetadata::reportGlobalToASan (llvm::GlobalVariable *GV,
76- const VarDecl &D, bool IsDynInit) {
77- if (!isAsanHwasanOrMemTag (CGM.getLangOpts ().Sanitize ))
97+ void SanitizerMetadata::reportGlobal (llvm::GlobalVariable *GV, const VarDecl &D ,
98+ bool IsDynInit) {
99+ if (!isAsanHwasanMemTagOrTysan (CGM.getLangOpts ().Sanitize ))
78100 return ;
79101 std::string QualName;
80102 llvm::raw_string_ostream OS (QualName);
@@ -91,34 +113,10 @@ void SanitizerMetadata::reportGlobalToASan(llvm::GlobalVariable *GV,
91113 return NoSanitizeMask;
92114 };
93115
94- reportGlobalToASan (GV, D.getLocation (), QualName, D.getType (),
95- getNoSanitizeMask (D), IsDynInit);
96- }
97-
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);
116+ reportGlobal (GV, D.getLocation (), QualName, D.getType (), getNoSanitizeMask (D),
117+ IsDynInit);
120118}
121119
122120void SanitizerMetadata::disableSanitizerForGlobal (llvm::GlobalVariable *GV) {
123- reportGlobalToASan (GV, SourceLocation (), " " , QualType (), SanitizerKind::All);
121+ reportGlobal (GV, SourceLocation (), " " , QualType (), SanitizerKind::All);
124122}
0 commit comments