@@ -19,9 +19,10 @@ using namespace CodeGen;
19
19
20
20
SanitizerMetadata::SanitizerMetadata (CodeGenModule &CGM) : CGM(CGM) {}
21
21
22
- static bool isAsanHwasanOrMemTag (const SanitizerSet &SS) {
22
+ static bool isAsanHwasanMemTagOrTysan (const SanitizerSet &SS) {
23
23
return SS.hasOneOf (SanitizerKind::Address | SanitizerKind::KernelAddress |
24
- SanitizerKind::HWAddress | SanitizerKind::MemTag);
24
+ SanitizerKind::HWAddress | SanitizerKind::MemTag |
25
+ SanitizerKind::Type);
25
26
}
26
27
27
28
static SanitizerMask expandKernelSanitizerMasks (SanitizerMask Mask) {
@@ -31,13 +32,13 @@ static SanitizerMask expandKernelSanitizerMasks(SanitizerMask Mask) {
31
32
return Mask;
32
33
}
33
34
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) {
39
40
SanitizerSet FsanitizeArgument = CGM.getLangOpts ().Sanitize ;
40
- if (!isAsanHwasanOrMemTag (FsanitizeArgument))
41
+ if (!isAsanHwasanMemTagOrTysan (FsanitizeArgument))
41
42
return ;
42
43
43
44
FsanitizeArgument.Mask = expandKernelSanitizerMasks (FsanitizeArgument.Mask );
@@ -70,11 +71,32 @@ void SanitizerMetadata::reportGlobalToASan(llvm::GlobalVariable *GV,
70
71
GV, Loc, Ty, " init" );
71
72
72
73
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);
73
95
}
74
96
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 ))
78
100
return ;
79
101
std::string QualName;
80
102
llvm::raw_string_ostream OS (QualName);
@@ -91,34 +113,10 @@ void SanitizerMetadata::reportGlobalToASan(llvm::GlobalVariable *GV,
91
113
return NoSanitizeMask;
92
114
};
93
115
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);
120
118
}
121
119
122
120
void SanitizerMetadata::disableSanitizerForGlobal (llvm::GlobalVariable *GV) {
123
- reportGlobalToASan (GV, SourceLocation (), " " , QualType (), SanitizerKind::All);
121
+ reportGlobal (GV, SourceLocation (), " " , QualType (), SanitizerKind::All);
124
122
}
0 commit comments