llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-compiler-rt-sanitizer Author: None (BStott6) <details> <summary>Changes</summary> Changed the TypeSanitizer instrumentation pass to parse TBAA's `pN T` (e.g. `p2 int`) pointer type names and rewrite them in a more user-familiar `T*` notation. Updated TySan docs to remove the explanation for the strange pointer type names. Updated TySan regression tests which refer to the pointer type formatting to match the new formatting. Added a command line option in `TypeSanitizer.cpp` to use the old TBAA-style type names instead (`tysan-use-tbaa-type-names`). --- Full diff: https://github.com/llvm/llvm-project/pull/166381.diff 4 Files Affected: - (modified) clang/docs/TypeSanitizer.rst (-2) - (modified) compiler-rt/test/tysan/print_stacktrace.c (+1-1) - (modified) compiler-rt/test/tysan/ptr-float.c (+1-1) - (modified) llvm/lib/Transforms/Instrumentation/TypeSanitizer.cpp (+39-1) ``````````diff diff --git a/clang/docs/TypeSanitizer.rst b/clang/docs/TypeSanitizer.rst index 3c683a6c24bb4..c2f628cb231db 100644 --- a/clang/docs/TypeSanitizer.rst +++ b/clang/docs/TypeSanitizer.rst @@ -119,8 +119,6 @@ brief dictionary of these terms. * ``omnipotent char``: This is a special type which can alias with anything. Its name comes from the C/C++ type ``char``. -* ``type p[x]``: This signifies pointers to the type. ``x`` is the number of indirections to reach the final value. - As an example, a pointer to a pointer to an integer would be ``type p2 int``. TypeSanitizer is still experimental. User-facing error messages should be improved in the future to remove references to LLVM IR specific terms. diff --git a/compiler-rt/test/tysan/print_stacktrace.c b/compiler-rt/test/tysan/print_stacktrace.c index 3ffb6063377d9..831be5e4afed9 100644 --- a/compiler-rt/test/tysan/print_stacktrace.c +++ b/compiler-rt/test/tysan/print_stacktrace.c @@ -10,7 +10,7 @@ void zero_array() { for (i = 0; i < 1; ++i) P[i] = 0.0f; // CHECK: ERROR: TypeSanitizer: type-aliasing-violation - // CHECK: WRITE of size 4 at {{.*}} with type float accesses an existing object of type p1 float + // CHECK: WRITE of size 4 at {{.*}} with type float accesses an existing object of type float* // CHECK: {{#0 0x.* in zero_array .*print_stacktrace.c:}}[[@LINE-3]] // CHECK-SHORT-NOT: {{#1 0x.* in main .*print_stacktrace.c}} // CHECK-LONG-NEXT: {{#1 0x.* in main .*print_stacktrace.c}} diff --git a/compiler-rt/test/tysan/ptr-float.c b/compiler-rt/test/tysan/ptr-float.c index aaa9895986988..145d5d8f289ea 100644 --- a/compiler-rt/test/tysan/ptr-float.c +++ b/compiler-rt/test/tysan/ptr-float.c @@ -7,7 +7,7 @@ void zero_array() { for (i = 0; i < 1; ++i) P[i] = 0.0f; // CHECK: ERROR: TypeSanitizer: type-aliasing-violation - // CHECK: WRITE of size 4 at {{.*}} with type float accesses an existing object of type p1 float + // CHECK: WRITE of size 4 at {{.*}} with type float accesses an existing object of type float* // CHECK: {{#0 0x.* in zero_array .*ptr-float.c:}}[[@LINE-3]] } diff --git a/llvm/lib/Transforms/Instrumentation/TypeSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/TypeSanitizer.cpp index 87eba5f2c5242..e5109c047584e 100644 --- a/llvm/lib/Transforms/Instrumentation/TypeSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/TypeSanitizer.cpp @@ -70,6 +70,12 @@ static cl::opt<bool> ClVerifyOutlinedInstrumentation( "function calls. This verifies that they behave the same."), cl::Hidden, cl::init(false)); +static cl::opt<bool> ClUseTBAATypeNames( + "tysan-use-tbaa-type-names", + cl::desc("Print TBAA-style type names for pointers rather than C-style " + "names (e.g. 'p2 int' rather than 'int**')"), + cl::Hidden, cl::init(false)); + STATISTIC(NumInstrumentedAccesses, "Number of instrumented accesses"); namespace { @@ -260,6 +266,29 @@ static std::string encodeName(StringRef Name) { return Output; } +/// Converts pointer type names from TBAA "p2 int" style to C style ("int**"). +/// Currently leaves "omnipotent char" unchanged - not sure of a user-friendly name for this type. +/// If the type name was changed, returns true and stores the new type name in `Dest`. +/// Otherwise, returns false (`Dest` is unchanged). +static bool convertTBAAStyleTypeNamesToCStyle(StringRef TypeName, std::string &Dest) { + if (!TypeName.consume_front("p")) + return false; + + int Indirection; + if (TypeName.consumeInteger(10, Indirection)) + return false; + + if (!TypeName.consume_front(" ")) + return false; + + Dest.clear(); + Dest.reserve(TypeName.size() + Indirection); // One * per indirection + Dest.append(TypeName); + Dest.append(Indirection, '*'); + + return true; +} + std::string TypeSanitizer::getAnonymousStructIdentifier(const MDNode *MD, TypeNameMapTy &TypeNames) { @@ -355,7 +384,16 @@ bool TypeSanitizer::generateBaseTypeDescriptor( // [2, member count, [type pointer, offset]..., name] LLVMContext &C = MD->getContext(); - Constant *NameData = ConstantDataArray::getString(C, NameNode->getString()); + StringRef TypeName = NameNode->getString(); + + // Convert LLVM-internal TBAA-style type names to C-style type names + // (more user-friendly) + std::string CStyleTypeName; + if (!ClUseTBAATypeNames) + if (convertTBAAStyleTypeNamesToCStyle(TypeName, CStyleTypeName)) + TypeName = CStyleTypeName; + + Constant *NameData = ConstantDataArray::getString(C, TypeName); SmallVector<Type *> TDSubTys; SmallVector<Constant *> TDSubData; `````````` </details> https://github.com/llvm/llvm-project/pull/166381 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
