Skip to content

Commit 00e6e65

Browse files
committed
[𝘀𝗽𝗿] initial version
Created using spr 1.3.4
2 parents 04c473b + fbaff40 commit 00e6e65

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+3831
-38
lines changed

clang/include/clang/Basic/Features.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ FEATURE(nullability_nullable_result, true)
9898
FEATURE(memory_sanitizer,
9999
LangOpts.Sanitize.hasOneOf(SanitizerKind::Memory |
100100
SanitizerKind::KernelMemory))
101+
FEATURE(type_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Type))
101102
FEATURE(thread_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Thread))
102103
FEATURE(dataflow_sanitizer, LangOpts.Sanitize.has(SanitizerKind::DataFlow))
103104
FEATURE(scudo, LangOpts.Sanitize.hasOneOf(SanitizerKind::Scudo))

clang/include/clang/Basic/Sanitizers.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ SANITIZER("fuzzer", Fuzzer)
7373
// libFuzzer-required instrumentation, no linking.
7474
SANITIZER("fuzzer-no-link", FuzzerNoLink)
7575

76+
// TypeSanitizer
77+
SANITIZER("type", Type)
78+
7679
// ThreadSanitizer
7780
SANITIZER("thread", Thread)
7881

clang/include/clang/Driver/SanitizerArgs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ class SanitizerArgs {
8686
bool needsHwasanAliasesRt() const {
8787
return needsHwasanRt() && HwasanUseAliases;
8888
}
89+
bool needsTysanRt() const { return Sanitizers.has(SanitizerKind::Type); }
8990
bool needsTsanRt() const { return Sanitizers.has(SanitizerKind::Thread); }
9091
bool needsMsanRt() const { return Sanitizers.has(SanitizerKind::Memory); }
9192
bool needsFuzzer() const { return Sanitizers.has(SanitizerKind::Fuzzer); }

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
#include "llvm/Transforms/Instrumentation/SanitizerBinaryMetadata.h"
8080
#include "llvm/Transforms/Instrumentation/SanitizerCoverage.h"
8181
#include "llvm/Transforms/Instrumentation/ThreadSanitizer.h"
82+
#include "llvm/Transforms/Instrumentation/TypeSanitizer.h"
8283
#include "llvm/Transforms/ObjCARC.h"
8384
#include "llvm/Transforms/Scalar/EarlyCSE.h"
8485
#include "llvm/Transforms/Scalar/GVN.h"
@@ -685,6 +686,11 @@ static void addSanitizers(const Triple &TargetTriple,
685686
MPM.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass()));
686687
}
687688

689+
if (LangOpts.Sanitize.has(SanitizerKind::Type)) {
690+
MPM.addPass(ModuleTypeSanitizerPass());
691+
MPM.addPass(createModuleToFunctionPassAdaptor(TypeSanitizerPass()));
692+
}
693+
688694
auto ASanPass = [&](SanitizerMask Mask, bool CompileKernel) {
689695
if (LangOpts.Sanitize.has(Mask)) {
690696
bool UseGlobalGC = asanUseGlobalsGC(TargetTriple, CodeGenOpts);

clang/lib/CodeGen/CGDecl.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,8 @@ void CodeGenFunction::EmitStaticVarDecl(const VarDecl &D,
481481
LocalDeclMap.find(&D)->second = Address(castedAddr, elemTy, alignment);
482482
CGM.setStaticLocalDeclAddress(&D, castedAddr);
483483

484-
CGM.getSanitizerMetadata()->reportGlobal(var, D);
484+
CGM.getSanitizerMetadata()->reportGlobalToASan(var, D);
485+
CGM.getSanitizerMetadata()->reportGlobalToTySan(var, D);
485486

486487
// Emit global variable debug descriptor for static vars.
487488
CGDebugInfo *DI = getDebugInfo();

clang/lib/CodeGen/CGDeclCXX.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,10 @@ llvm::Function *CodeGenModule::CreateGlobalInitOrCleanUpFunction(
472472
!isInNoSanitizeList(SanitizerKind::MemtagStack, Fn, Loc))
473473
Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);
474474

475+
if (getLangOpts().Sanitize.has(SanitizerKind::Type) &&
476+
!isInNoSanitizeList(SanitizerKind::Type, Fn, Loc))
477+
Fn->addFnAttr(llvm::Attribute::SanitizeType);
478+
475479
if (getLangOpts().Sanitize.has(SanitizerKind::Thread) &&
476480
!isInNoSanitizeList(SanitizerKind::Thread, Fn, Loc))
477481
Fn->addFnAttr(llvm::Attribute::SanitizeThread);

clang/lib/CodeGen/CodeGenFunction.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,8 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
790790
Fn->addFnAttr(llvm::Attribute::SanitizeMemTag);
791791
if (SanOpts.has(SanitizerKind::Thread))
792792
Fn->addFnAttr(llvm::Attribute::SanitizeThread);
793+
if (SanOpts.has(SanitizerKind::Type))
794+
Fn->addFnAttr(llvm::Attribute::SanitizeType);
793795
if (SanOpts.hasOneOf(SanitizerKind::Memory | SanitizerKind::KernelMemory))
794796
Fn->addFnAttr(llvm::Attribute::SanitizeMemory);
795797
}

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -391,8 +391,8 @@ CodeGenModule::CodeGenModule(ASTContext &C,
391391
if (LangOpts.HLSL)
392392
createHLSLRuntime();
393393

394-
// Enable TBAA unless it's suppressed. ThreadSanitizer needs TBAA even at O0.
395-
if (LangOpts.Sanitize.has(SanitizerKind::Thread) ||
394+
// Enable TBAA unless it's suppressed. TSan and TySan need TBAA even at O0.
395+
if (LangOpts.Sanitize.hasOneOf(SanitizerKind::Thread | SanitizerKind::Type) ||
396396
(!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0))
397397
TBAA.reset(new CodeGenTBAA(Context, TheModule, CodeGenOpts, getLangOpts(),
398398
getCXXABI().getMangleContext()));
@@ -4924,7 +4924,7 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName, llvm::Type *Ty,
49244924
}
49254925

49264926
if (D)
4927-
SanitizerMD->reportGlobal(GV, *D);
4927+
SanitizerMD->reportGlobalToASan(GV, *D);
49284928

49294929
LangAS ExpectedAS =
49304930
D ? D->getType().getAddressSpace()
@@ -5465,7 +5465,8 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D,
54655465
if (NeedsGlobalCtor || NeedsGlobalDtor)
54665466
EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
54675467

5468-
SanitizerMD->reportGlobal(GV, *D, NeedsGlobalCtor);
5468+
SanitizerMD->reportGlobalToASan(GV, *D, NeedsGlobalCtor);
5469+
SanitizerMD->reportGlobalToTySan(GV, *D);
54695470

54705471
// Emit global variable debug information.
54715472
if (CGDebugInfo *DI = getModuleDebugInfo())
@@ -6341,7 +6342,8 @@ CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S,
63416342
if (Entry)
63426343
*Entry = GV;
63436344

6344-
SanitizerMD->reportGlobal(GV, S->getStrTokenLoc(0), "<string literal>");
6345+
SanitizerMD->reportGlobalToASan(GV, S->getStrTokenLoc(0), "<string literal>");
6346+
// FIXME: Should we also report to the TySan?
63456347

63466348
return ConstantAddress(castStringLiteralToDefaultAddressSpace(*this, GV),
63476349
GV->getValueType(), Alignment);

clang/lib/CodeGen/CodeGenTBAA.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,10 @@ llvm::MDNode *CodeGenTBAA::getTypeInfoHelper(const Type *Ty) {
226226
}
227227

228228
llvm::MDNode *CodeGenTBAA::getTypeInfo(QualType QTy) {
229-
// At -O0 or relaxed aliasing, TBAA is not emitted for regular types.
230-
if (CodeGenOpts.OptimizationLevel == 0 || CodeGenOpts.RelaxedAliasing)
229+
// At -O0 or relaxed aliasing, TBAA is not emitted for regular types (unless
230+
// we're running TypeSanitizer).
231+
if (!Features.Sanitize.has(SanitizerKind::Type) &&
232+
(CodeGenOpts.OptimizationLevel == 0 || CodeGenOpts.RelaxedAliasing))
231233
return nullptr;
232234

233235
// If the type has the may_alias attribute (even on a typedef), it is

clang/lib/CodeGen/SanitizerMetadata.cpp

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ SanitizerMask expandKernelSanitizerMasks(SanitizerMask Mask) {
3434
return Mask;
3535
}
3636

37-
void SanitizerMetadata::reportGlobal(llvm::GlobalVariable *GV,
38-
SourceLocation Loc, StringRef Name,
39-
QualType Ty,
40-
SanitizerMask NoSanitizeAttrMask,
41-
bool IsDynInit) {
37+
void SanitizerMetadata::reportGlobalToASan(llvm::GlobalVariable *GV,
38+
SourceLocation Loc, StringRef Name,
39+
QualType Ty,
40+
SanitizerMask NoSanitizeAttrMask,
41+
bool IsDynInit) {
4242
SanitizerSet FsanitizeArgument = CGM.getLangOpts().Sanitize;
4343
if (!isAsanHwasanOrMemTag(FsanitizeArgument))
4444
return;
@@ -75,8 +75,8 @@ void SanitizerMetadata::reportGlobal(llvm::GlobalVariable *GV,
7575
GV->setSanitizerMetadata(Meta);
7676
}
7777

78-
void SanitizerMetadata::reportGlobal(llvm::GlobalVariable *GV, const VarDecl &D,
79-
bool IsDynInit) {
78+
void SanitizerMetadata::reportGlobalToASan(llvm::GlobalVariable *GV,
79+
const VarDecl &D, bool IsDynInit) {
8080
if (!isAsanHwasanOrMemTag(CGM.getLangOpts().Sanitize))
8181
return;
8282
std::string QualName;
@@ -94,10 +94,34 @@ void SanitizerMetadata::reportGlobal(llvm::GlobalVariable *GV, const VarDecl &D,
9494
return NoSanitizeMask;
9595
};
9696

97-
reportGlobal(GV, D.getLocation(), OS.str(), D.getType(), getNoSanitizeMask(D),
98-
IsDynInit);
97+
reportGlobalToASan(GV, D.getLocation(), OS.str(), D.getType(),
98+
getNoSanitizeMask(D), IsDynInit);
99+
}
100+
101+
void SanitizerMetadata::reportGlobalToTySan(llvm::GlobalVariable *GV,
102+
const VarDecl &D) {
103+
if (!CGM.getLangOpts().Sanitize.has(SanitizerKind::Type))
104+
return;
105+
106+
for (auto Attr : D.specific_attrs<NoSanitizeAttr>())
107+
if (Attr->getMask() & SanitizerKind::Type)
108+
return;
109+
110+
QualType QTy = D.getType();
111+
llvm::MDNode *TBAAInfo = CGM.getTBAATypeInfo(QTy);
112+
if (!TBAAInfo || TBAAInfo == CGM.getTBAATypeInfo(CGM.getContext().CharTy))
113+
return;
114+
115+
llvm::Metadata *GlobalMetadata[] = {llvm::ConstantAsMetadata::get(GV),
116+
TBAAInfo};
117+
118+
llvm::MDNode *ThisGlobal =
119+
llvm::MDNode::get(CGM.getLLVMContext(), GlobalMetadata);
120+
llvm::NamedMDNode *TysanGlobals =
121+
CGM.getModule().getOrInsertNamedMetadata("llvm.tysan.globals");
122+
TysanGlobals->addOperand(ThisGlobal);
99123
}
100124

101125
void SanitizerMetadata::disableSanitizerForGlobal(llvm::GlobalVariable *GV) {
102-
reportGlobal(GV, SourceLocation(), "", QualType(), SanitizerKind::All);
126+
reportGlobalToASan(GV, SourceLocation(), "", QualType(), SanitizerKind::All);
103127
}

clang/lib/CodeGen/SanitizerMetadata.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,13 @@ class SanitizerMetadata {
3737

3838
public:
3939
SanitizerMetadata(CodeGenModule &CGM);
40-
void reportGlobal(llvm::GlobalVariable *GV, const VarDecl &D,
41-
bool IsDynInit = false);
42-
void reportGlobal(llvm::GlobalVariable *GV, SourceLocation Loc,
43-
StringRef Name, QualType Ty = {},
44-
SanitizerMask NoSanitizeAttrMask = {},
45-
bool IsDynInit = false);
40+
void reportGlobalToASan(llvm::GlobalVariable *GV, const VarDecl &D,
41+
bool IsDynInit = false);
42+
void reportGlobalToASan(llvm::GlobalVariable *GV, SourceLocation Loc,
43+
StringRef Name, QualType Ty = {},
44+
SanitizerMask NoSanitizeAttrMask = {},
45+
bool IsDynInit = false);
46+
void reportGlobalToTySan(llvm::GlobalVariable *GV, const VarDecl &D);
4647
void disableSanitizerForGlobal(llvm::GlobalVariable *GV);
4748
};
4849
} // end namespace CodeGen

clang/lib/Driver/SanitizerArgs.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ static const SanitizerMask NotAllowedWithExecuteOnly =
4242
static const SanitizerMask RequiresPIE =
4343
SanitizerKind::DataFlow | SanitizerKind::Scudo;
4444
static const SanitizerMask NeedsUnwindTables =
45-
SanitizerKind::Address | SanitizerKind::HWAddress | SanitizerKind::Thread |
46-
SanitizerKind::Memory | SanitizerKind::DataFlow;
45+
SanitizerKind::Address | SanitizerKind::HWAddress | SanitizerKind::Type |
46+
SanitizerKind::Thread | SanitizerKind::Memory | SanitizerKind::DataFlow;
4747
static const SanitizerMask SupportsCoverage =
4848
SanitizerKind::Address | SanitizerKind::HWAddress |
4949
SanitizerKind::KernelAddress | SanitizerKind::KernelHWAddress |
50-
SanitizerKind::MemtagStack | SanitizerKind::MemtagHeap |
51-
SanitizerKind::MemtagGlobals | SanitizerKind::Memory |
52-
SanitizerKind::KernelMemory | SanitizerKind::Leak |
50+
SanitizerKind::Type | SanitizerKind::MemtagStack |
51+
SanitizerKind::MemtagHeap | SanitizerKind::MemtagGlobals |
52+
SanitizerKind::Memory | SanitizerKind::KernelMemory | SanitizerKind::Leak |
5353
SanitizerKind::Undefined | SanitizerKind::Integer | SanitizerKind::Bounds |
5454
SanitizerKind::ImplicitConversion | SanitizerKind::Nullability |
5555
SanitizerKind::DataFlow | SanitizerKind::Fuzzer |
@@ -178,6 +178,7 @@ static void addDefaultIgnorelists(const Driver &D, SanitizerMask Kinds,
178178
{"memtag_ignorelist.txt", SanitizerKind::MemTag},
179179
{"msan_ignorelist.txt", SanitizerKind::Memory},
180180
{"tsan_ignorelist.txt", SanitizerKind::Thread},
181+
{"tysan_blacklist.txt", SanitizerKind::Type},
181182
{"dfsan_abilist.txt", SanitizerKind::DataFlow},
182183
{"cfi_ignorelist.txt", SanitizerKind::CFI},
183184
{"ubsan_ignorelist.txt",
@@ -516,6 +517,10 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
516517
std::pair<SanitizerMask, SanitizerMask> IncompatibleGroups[] = {
517518
std::make_pair(SanitizerKind::Address,
518519
SanitizerKind::Thread | SanitizerKind::Memory),
520+
std::make_pair(SanitizerKind::Type,
521+
SanitizerKind::Address | SanitizerKind::KernelAddress |
522+
SanitizerKind::Memory | SanitizerKind::Leak |
523+
SanitizerKind::Thread | SanitizerKind::KernelAddress),
519524
std::make_pair(SanitizerKind::Thread, SanitizerKind::Memory),
520525
std::make_pair(SanitizerKind::Leak,
521526
SanitizerKind::Thread | SanitizerKind::Memory),

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1337,8 +1337,10 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
13371337
if (SanArgs.needsScudoRt()) {
13381338
SharedRuntimes.push_back("scudo_standalone");
13391339
}
1340-
if (SanArgs.needsTsanRt())
1340+
if (SanArgs.needsTsanRt() && SanArgs.linkRuntimes())
13411341
SharedRuntimes.push_back("tsan");
1342+
if (SanArgs.needsTysanRt())
1343+
StaticRuntimes.push_back("tysan");
13421344
if (SanArgs.needsHwasanRt()) {
13431345
if (SanArgs.needsHwasanAliasesRt())
13441346
SharedRuntimes.push_back("hwasan_aliases");
@@ -1403,6 +1405,8 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
14031405
if (SanArgs.linkCXXRuntimes())
14041406
StaticRuntimes.push_back("tsan_cxx");
14051407
}
1408+
if (!SanArgs.needsSharedRt() && SanArgs.needsTysanRt())
1409+
StaticRuntimes.push_back("tysan");
14061410
if (!SanArgs.needsSharedRt() && SanArgs.needsUbsanRt()) {
14071411
if (SanArgs.requiresMinimalRuntime()) {
14081412
StaticRuntimes.push_back("ubsan_minimal");

clang/lib/Driver/ToolChains/Darwin.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1505,6 +1505,8 @@ void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
15051505
"Static sanitizer runtimes not supported");
15061506
AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
15071507
}
1508+
if (Sanitize.needsTysanRt())
1509+
AddLinkSanitizerLibArgs(Args, CmdArgs, "tysan");
15081510
if (Sanitize.needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
15091511
AddLinkSanitizerLibArgs(Args, CmdArgs, "fuzzer", /*shared=*/false);
15101512

@@ -3373,6 +3375,9 @@ SanitizerMask Darwin::getSupportedSanitizers() const {
33733375
isTargetTvOSSimulator() || isTargetWatchOSSimulator())) {
33743376
Res |= SanitizerKind::Thread;
33753377
}
3378+
if ((IsX86_64 || IsAArch64) && isTargetMacOSBased()) {
3379+
Res |= SanitizerKind::Type;
3380+
}
33763381
return Res;
33773382
}
33783383

clang/lib/Driver/ToolChains/Linux.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,8 @@ SanitizerMask Linux::getSupportedSanitizers() const {
803803
if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64 || IsSystemZ ||
804804
IsLoongArch64 || IsRISCV64)
805805
Res |= SanitizerKind::Thread;
806+
if (IsX86_64 || IsAArch64)
807+
Res |= SanitizerKind::Type;
806808
if (IsX86_64 || IsSystemZ)
807809
Res |= SanitizerKind::KernelMemory;
808810
if (IsX86_64 || IsMIPS64 || IsAArch64 || IsX86 || IsMIPS || IsArmArch ||

clang/runtime/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ if(LLVM_BUILD_EXTERNAL_COMPILER_RT AND EXISTS ${COMPILER_RT_SRC_ROOT}/)
122122
COMPONENT compiler-rt)
123123

124124
# Add top-level targets that build specific compiler-rt runtimes.
125-
set(COMPILER_RT_RUNTIMES fuzzer asan builtins dfsan lsan msan profile tsan ubsan ubsan-minimal)
125+
set(COMPILER_RT_RUNTIMES fuzzer asan builtins dfsan lsan msan profile tsan tysan ubsan ubsan-minimal)
126126
foreach(runtime ${COMPILER_RT_RUNTIMES})
127127
get_ext_project_build_command(build_runtime_cmd ${runtime})
128128
add_custom_target(${runtime}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck -check-prefix=WITHOUT %s
2+
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -o - %s -fsanitize=type | FileCheck -check-prefix=TYSAN %s
3+
// RUN: echo "src:%s" | sed -e 's/\\/\\\\/g' > %t
4+
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -o - %s -fsanitize=type -fsanitize-blacklist=%t | FileCheck -check-prefix=BL %s
5+
6+
// The sanitize_type attribute should be attached to functions
7+
// when TypeSanitizer is enabled, unless no_sanitize("type") attribute
8+
// is present.
9+
10+
// WITHOUT: NoTYSAN1{{.*}}) [[NOATTR:#[0-9]+]]
11+
// BL: NoTYSAN1{{.*}}) [[NOATTR:#[0-9]+]]
12+
// TYSAN: NoTYSAN1{{.*}}) [[NOATTR:#[0-9]+]]
13+
__attribute__((no_sanitize("type"))) int NoTYSAN1(int *a) { return *a; }
14+
15+
// WITHOUT: NoTYSAN2{{.*}}) [[NOATTR]]
16+
// BL: NoTYSAN2{{.*}}) [[NOATTR]]
17+
// TYSAN: NoTYSAN2{{.*}}) [[NOATTR]]
18+
__attribute__((no_sanitize("type"))) int NoTYSAN2(int *a);
19+
int NoTYSAN2(int *a) { return *a; }
20+
21+
// WITHOUT: NoTYSAN3{{.*}}) [[NOATTR:#[0-9]+]]
22+
// BL: NoTYSAN3{{.*}}) [[NOATTR:#[0-9]+]]
23+
// TYSAN: NoTYSAN3{{.*}}) [[NOATTR:#[0-9]+]]
24+
__attribute__((no_sanitize("type"))) int NoTYSAN3(int *a) { return *a; }
25+
26+
// WITHOUT: TYSANOk{{.*}}) [[NOATTR]]
27+
// BL: TYSANOk{{.*}}) [[NOATTR]]
28+
// TYSAN: TYSANOk{{.*}}) [[WITH:#[0-9]+]]
29+
int TYSANOk(int *a) { return *a; }
30+
31+
// WITHOUT: TemplateTYSANOk{{.*}}) [[NOATTR]]
32+
// BL: TemplateTYSANOk{{.*}}) [[NOATTR]]
33+
// TYSAN: TemplateTYSANOk{{.*}}) [[WITH]]
34+
template <int i>
35+
int TemplateTYSANOk() { return i; }
36+
37+
// WITHOUT: TemplateNoTYSAN{{.*}}) [[NOATTR]]
38+
// BL: TemplateNoTYSAN{{.*}}) [[NOATTR]]
39+
// TYSAN: TemplateNoTYSAN{{.*}}) [[NOATTR]]
40+
template <int i>
41+
__attribute__((no_sanitize("type"))) int TemplateNoTYSAN() { return i; }
42+
43+
int force_instance = TemplateTYSANOk<42>() + TemplateNoTYSAN<42>();
44+
45+
// Check that __cxx_global_var_init* get the sanitize_type attribute.
46+
int global1 = 0;
47+
int global2 = *(int *)((char *)&global1 + 1);
48+
// WITHOUT: @__cxx_global_var_init{{.*}}[[NOATTR:#[0-9]+]]
49+
// BL: @__cxx_global_var_init{{.*}}[[NOATTR:#[0-9]+]]
50+
// TYSAN: @__cxx_global_var_init{{.*}}[[WITH:#[0-9]+]]
51+
52+
// Make sure that we don't add globals to the list for which we don't have a
53+
// specific type description.
54+
// FIXME: We now have a type description for this type and a global is added. Should it?
55+
struct SX {
56+
int a, b;
57+
};
58+
SX sx;
59+
60+
// WITHOUT: attributes [[NOATTR]] = { noinline nounwind{{.*}} }
61+
62+
// BL: attributes [[NOATTR]] = { noinline nounwind{{.*}} }
63+
64+
// TYSAN: attributes [[NOATTR]] = { mustprogress noinline nounwind{{.*}} }
65+
// TYSAN: attributes [[WITH]] = { noinline nounwind sanitize_type{{.*}} }
66+
67+
// TYSAN-DAG: !llvm.tysan.globals = !{[[G1MD:![0-9]+]], [[G2MD:![0-9]+]], [[G3MD:![0-9]+]], [[SXMD:![0-9]+]]}
68+
// TYSAN-DAG: [[G1MD]] = !{ptr @force_instance, [[INTMD:![0-9]+]]}
69+
// TYSAN-DAG: [[INTMD]] = !{!"int",
70+
// TYSAN-DAG: [[G2MD]] = !{ptr @global1, [[INTMD]]}
71+
// TYSAN-DAG: [[G3MD]] = !{ptr @global2, [[INTMD]]}
72+
// TYSAN-DAG: [[SXMD]] = !{ptr @sx, [[SXTYMD:![0-9]+]]}
73+
// TYSAN-DAG: [[SXTYMD]] = !{!"_ZTS2SX", [[INTMD]], i64 0, !1, i64 4}
74+
// TYSAN-DAG: Simple C++ TBAA

0 commit comments

Comments
 (0)