40 SanitizerSet FsanitizeArgument = CGM.getLangOpts().Sanitize;
47 FsanitizeArgument.
Mask};
49 llvm::GlobalVariable::SanitizerMetadata Meta;
50 if (GV->hasSanitizerMetadata())
51 Meta = GV->getSanitizerMetadata();
53 Meta.NoAddress |= NoSanitizeAttrSet.
hasOneOf(SanitizerKind::Address);
54 Meta.NoAddress |= CGM.isInNoSanitizeList(
55 FsanitizeArgument.
Mask & SanitizerKind::Address, GV, Loc, Ty);
57 Meta.NoHWAddress |= NoSanitizeAttrSet.
hasOneOf(SanitizerKind::HWAddress);
58 Meta.NoHWAddress |= CGM.isInNoSanitizeList(
59 FsanitizeArgument.
Mask & SanitizerKind::HWAddress, GV, Loc, Ty);
62 static_cast<bool>(FsanitizeArgument.
Mask & SanitizerKind::MemtagGlobals);
63 Meta.Memtag &= !NoSanitizeAttrSet.
hasOneOf(SanitizerKind::MemTag);
64 Meta.Memtag &= !CGM.isInNoSanitizeList(
65 FsanitizeArgument.
Mask & SanitizerKind::MemTag, GV, Loc, Ty);
67 Meta.IsDynInit = IsDynInit && !Meta.NoAddress &&
68 FsanitizeArgument.
has(SanitizerKind::Address) &&
69 !CGM.isInNoSanitizeList(SanitizerKind::Address |
70 SanitizerKind::KernelAddress,
73 GV->setSanitizerMetadata(Meta);
75 if (Ty.
isNull() || !CGM.getLangOpts().Sanitize.has(SanitizerKind::Type) ||
76 NoSanitizeAttrMask & SanitizerKind::Type)
79 llvm::MDNode *TBAAInfo = CGM.getTBAATypeInfo(Ty);
80 if (!TBAAInfo || TBAAInfo == CGM.getTBAATypeInfo(CGM.getContext().CharTy))
83 llvm::Metadata *GlobalMetadata[] = {llvm::ConstantAsMetadata::get(GV),
87 if (llvm::MDNode::getIfExists(CGM.getLLVMContext(), GlobalMetadata))
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);
101 std::string QualName;
102 llvm::raw_string_ostream OS(QualName);
105 auto getNoSanitizeMask = [](
const VarDecl &D) {
106 if (D.
hasAttr<DisableSanitizerInstrumentationAttr>())
107 return SanitizerKind::All;
111 NoSanitizeMask |=
Attr->getMask();
116 NoSanitizeMask |= SanitizerKind::Type;
118 return NoSanitizeMask;