[clang] [clang][CodeGen] Added SanitizerHandler mapping, trap messages in debug info, and corresponding test cases. (PR #143758)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 23 03:20:01 PDT 2025
https://github.com/anthonyhatran updated https://github.com/llvm/llvm-project/pull/143758
>From 0cf31b41838d449835296d4ec290209bd5aae1e6 Mon Sep 17 00:00:00 2001
From: Anthony Tran <anthonytran at anthonys-air.lan>
Date: Wed, 11 Jun 2025 10:11:09 -0700
Subject: [PATCH 1/2] Added Trap messages in debug info
---
clang/lib/CodeGen/CGExpr.cpp | 117 +++++++++++++++++-
clang/lib/CodeGen/CodeGenFunction.h | 3 +-
.../CodeGen/ubsan-trap-reason-add-overflow.c | 10 ++
.../ubsan-trap-reason-builtin-unreachable.c | 12 ++
.../ubsan-trap-reason-div-rem-overflow.c | 10 ++
.../ubsan-trap-reason-float-cast-overflow.c | 10 ++
...ubsan-trap-reason-function-type-mismatch.c | 16 +++
.../ubsan-trap-reason-implicit-conversion.c | 13 ++
.../ubsan-trap-reason-invalid-builtin.c | 12 ++
.../ubsan-trap-reason-load-invalid-value.c | 15 +++
.../ubsan-trap-reason-missing-return.cpp | 12 ++
.../CodeGen/ubsan-trap-reason-mul-overflow.c | 10 ++
.../ubsan-trap-reason-negate-overflow.c | 12 ++
.../CodeGen/ubsan-trap-reason-nonnull-arg.c | 17 +++
.../ubsan-trap-reason-nonnull-return.c | 15 +++
.../ubsan-trap-reason-nullability-arg.c | 19 +++
.../ubsan-trap-reason-nullability-return.c | 19 +++
.../CodeGen/ubsan-trap-reason-out-of-bounds.c | 12 ++
.../ubsan-trap-reason-pointer-overflow.c | 16 +++
.../ubsan-trap-reason-shift-out-of-bounds.c | 12 ++
.../CodeGen/ubsan-trap-reason-sub-overflow.c | 10 ++
.../CodeGen/ubsan-trap-reason-type-mismatch.c | 11 ++
22 files changed, 379 insertions(+), 4 deletions(-)
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-add-overflow.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-builtin-unreachable.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-div-rem-overflow.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-float-cast-overflow.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-function-type-mismatch.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-implicit-conversion.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-invalid-builtin.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-load-invalid-value.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-missing-return.cpp
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-mul-overflow.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-negate-overflow.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-nonnull-arg.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-nonnull-return.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-nullability-arg.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-nullability-return.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-out-of-bounds.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-pointer-overflow.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-shift-out-of-bounds.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-sub-overflow.c
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-type-mismatch.c
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index 85c768807572f..e37eaf948eb1a 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -85,6 +85,98 @@ enum VariableTypeDescriptorKind : uint16_t {
// Miscellaneous Helper Methods
//===--------------------------------------------------------------------===//
+static llvm::StringRef GetTrapMessageForHandler(SanitizerHandler ID) {
+ switch (ID) {
+ case SanitizerHandler::AddOverflow:
+ return "The addition of two signed integers resulted in overflow.";
+
+ case SanitizerHandler::BuiltinUnreachable:
+ return "_builtin_unreachable encountered.";
+
+ case SanitizerHandler::CFICheckFail:
+ return "Control flow integrity check failed.";
+
+ case SanitizerHandler::DivremOverflow: // Unsure
+ return "stub";
+
+ case SanitizerHandler::DynamicTypeCacheMiss: // Unsure
+ return "Data requested for dynamic type not found in cache memory.";
+
+ case SanitizerHandler::FloatCastOverflow: // Pasted from LLVM docs, maybe
+ // something better to put here.
+ return "Conversion to, from, or between floating-point types which would "
+ "overflow the destination.";
+
+ case SanitizerHandler::FunctionTypeMismatch:
+ return "Function called with arguments of a different data type than "
+ "expected";
+
+ case SanitizerHandler::ImplicitConversion:
+ return "Implicit conversion occurred.";
+
+ case SanitizerHandler::InvalidBuiltin:
+ return "Built-in function or keyword not recognized.";
+
+ case SanitizerHandler::InvalidObjCCast:
+ return "Invalid Objective-C cast.";
+
+ case SanitizerHandler::LoadInvalidValue:
+ return "stub";
+
+ case SanitizerHandler::MissingReturn:
+ return "Function is missing a return.";
+
+ case SanitizerHandler::MulOverflow:
+ return "The multiplication of two signed integers resulted in overflow.";
+
+ case SanitizerHandler::NegateOverflow:
+ return "Underflow/negative overflow occurred.";
+
+ case SanitizerHandler::
+ NullabilityArg: // Next 4 pasted from
+ // https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
+ return "Passing null as a function parameter which is annotated with "
+ "_Nonnull";
+
+ case SanitizerHandler::NullabilityReturn:
+ return "Returning null from a function with a return type annotated with "
+ "_Nonnull";
+
+ case SanitizerHandler::NonnullArg:
+ return "Passing null as a function parameter which is declared to never be "
+ "null";
+
+ case SanitizerHandler::NonnullReturn:
+ return "Returning null pointer from a function which is declared to never "
+ "be null";
+
+ case SanitizerHandler::OutOfBounds:
+ return "Out of bounds -- memory accessed outside of expected boundaries.";
+
+ case SanitizerHandler::PointerOverflow:
+ return "stub";
+
+ case SanitizerHandler::ShiftOutOfBounds:
+ return "Bit shift attempted to move bits beyond boundaries of data type's "
+ "bit size.";
+
+ case SanitizerHandler::SubOverflow:
+ return "The subtraction of two signed integers resulted in overflow.";
+
+ case SanitizerHandler::TypeMismatch:
+ return "Type mismatch -- value type used does not match type expected.";
+
+ case SanitizerHandler::AlignmentAssumption: // Help on bottom 2
+ return "stub";
+
+ case SanitizerHandler::VLABoundNotPositive:
+ return "stub";
+
+ default:
+ return "";
+ }
+}
+
/// CreateTempAlloca - This creates a alloca and inserts it into the entry
/// block.
RawAddress
@@ -4041,7 +4133,8 @@ void CodeGenFunction::EmitUnreachable(SourceLocation Loc) {
void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
SanitizerHandler CheckHandlerID,
- bool NoMerge) {
+ bool NoMerge, StringRef Annotation,
+ StringRef TrapMessage) {
llvm::BasicBlock *Cont = createBasicBlock("cont");
// If we're optimizing, collapse all calls to trap down to just one per
@@ -4051,6 +4144,14 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
llvm::BasicBlock *&TrapBB = TrapBBs[CheckHandlerID];
+ llvm::DILocation *TrapLocation = Builder.getCurrentDebugLocation();
+ llvm::StringRef Category = GetTrapMessageForHandler(CheckHandlerID);
+
+ if (getDebugInfo() && !Category.empty()) {
+ TrapLocation = getDebugInfo()->CreateTrapFailureMessageFor(
+ TrapLocation, Category, TrapMessage);
+ }
+
NoMerge = NoMerge || !CGM.getCodeGenOpts().OptimizationLevel ||
(CurCodeDecl && CurCodeDecl->hasAttr<OptimizeNoneAttr>());
@@ -4059,8 +4160,16 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
auto Call = TrapBB->begin();
assert(isa<llvm::CallInst>(Call) && "Expected call in trap BB");
- Call->applyMergedLocation(Call->getDebugLoc(),
- Builder.getCurrentDebugLocation());
+ // Call->applyMergedLocation(Call->getDebugLoc(),
+ // Builder.getCurrentDebugLocation());
+ Call->applyMergedLocation(Call->getDebugLoc(), TrapLocation);
+
+ auto Unreachable = ++TrapBB->begin();
+ if (isa<llvm::UnreachableInst>(Unreachable)) {
+ Unreachable->applyMergedLocation(Unreachable->getDebugLoc(),
+ TrapLocation);
+ }
+
Builder.CreateCondBr(Checked, Cont, TrapBB,
MDHelper.createLikelyBranchWeights());
} else {
@@ -4069,6 +4178,8 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
MDHelper.createLikelyBranchWeights());
EmitBlock(TrapBB);
+ ApplyDebugLocation applyTrapDI(*this, TrapLocation);
+
llvm::CallInst *TrapCall =
Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::ubsantrap),
llvm::ConstantInt::get(CGM.Int8Ty, CheckHandlerID));
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h
index 59f14b3e35fd0..bd7f87647a35c 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -5287,7 +5287,8 @@ class CodeGenFunction : public CodeGenTypeCache {
/// Create a basic block that will call the trap intrinsic, and emit a
/// conditional branch to it, for the -ftrapv checks.
void EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID,
- bool NoMerge = false);
+ bool NoMerge = false, StringRef Annotation = "",
+ StringRef TrapMessage = "");
/// Emit a call to trap or debugtrap and attach function attribute
/// "trap-func-name" if specified.
diff --git a/clang/test/CodeGen/ubsan-trap-reason-add-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-add-overflow.c
new file mode 100644
index 0000000000000..822a1c003d16a
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-add-overflow.c
@@ -0,0 +1,10 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=undefined \
+// RUN: -fsanitize-trap=undefined -emit-llvm -S -c %s -o - | FileCheck %s
+
+int add_overflow(int a, int b) {
+ return a + b;
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 0) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
diff --git a/clang/test/CodeGen/ubsan-trap-reason-builtin-unreachable.c b/clang/test/CodeGen/ubsan-trap-reason-builtin-unreachable.c
new file mode 100644
index 0000000000000..ada4c372a92b7
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-builtin-unreachable.c
@@ -0,0 +1,12 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=unreachable \
+// RUN: -fsanitize-trap=unreachable -emit-llvm -S -c %s -o - | FileCheck %s
+
+int call_builtin_unreachable()
+{
+ __builtin_unreachable();
+}
+
+
+// CHECK: call void @llvm.ubsantrap(i8 1) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-div-rem-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-div-rem-overflow.c
new file mode 100644
index 0000000000000..17b6dca16cc62
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-div-rem-overflow.c
@@ -0,0 +1,10 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=undefined \
+// RUN: -fsanitize-trap=undefined -emit-llvm -S -c %s -o - | FileCheck %s
+
+int div_rem_overflow(int a, int b) {
+ return a / b;
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 3) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
diff --git a/clang/test/CodeGen/ubsan-trap-reason-float-cast-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-float-cast-overflow.c
new file mode 100644
index 0000000000000..b761e638c5293
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-float-cast-overflow.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -O0 -debug-info-kind=standalone -dwarf-version=5 -fsanitize=float-cast-overflow \
+// RUN: -fsanitize-trap=float-cast-overflow -emit-llvm %s -o - | FileCheck %s
+
+int f(float x) {
+ return (int)x;
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 5) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-function-type-mismatch.c b/clang/test/CodeGen/ubsan-trap-reason-function-type-mismatch.c
new file mode 100644
index 0000000000000..25063b69a894c
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-function-type-mismatch.c
@@ -0,0 +1,16 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=undefined \
+// RUN: -fsanitize-trap=undefined -emit-llvm -S -c %s -o - | FileCheck %s
+
+void target() { }
+
+int function_type_mismatch() {
+ int (*fp_int)(int);
+
+ fp_int = (int (*)(int))(void *)target;
+
+ return fp_int(42);
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 6) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-implicit-conversion.c b/clang/test/CodeGen/ubsan-trap-reason-implicit-conversion.c
new file mode 100644
index 0000000000000..48eb86d09b51a
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-implicit-conversion.c
@@ -0,0 +1,13 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=implicit-conversion \
+// RUN: -fsanitize-trap=implicit-conversion -emit-llvm -S -c %s -o - | FileCheck %s
+
+unsigned long long big;
+
+unsigned implicit_conversion()
+{
+ return big;
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 7) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-invalid-builtin.c b/clang/test/CodeGen/ubsan-trap-reason-invalid-builtin.c
new file mode 100644
index 0000000000000..cd136df2f0ed4
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-invalid-builtin.c
@@ -0,0 +1,12 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=builtin \
+// RUN: -fsanitize-trap=builtin -emit-llvm -S -c %s -o - | FileCheck %s
+
+unsigned invalid_builtin(unsigned x)
+{
+ return __builtin_clz(x);
+}
+
+
+// CHECK: call void @llvm.ubsantrap(i8 8) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-load-invalid-value.c b/clang/test/CodeGen/ubsan-trap-reason-load-invalid-value.c
new file mode 100644
index 0000000000000..09d8d588f0a32
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-load-invalid-value.c
@@ -0,0 +1,15 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=undefined \
+// RUN: -fsanitize-trap=undefined -emit-llvm -S -c %s -o - | FileCheck %s
+#include <stdbool.h>
+
+unsigned char bad_byte;
+
+bool load_invalid_value()
+{
+ return *((bool *)&bad_byte);
+}
+
+
+// CHECK: call void @llvm.ubsantrap(i8 10) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-missing-return.cpp b/clang/test/CodeGen/ubsan-trap-reason-missing-return.cpp
new file mode 100644
index 0000000000000..7f0265abd2305
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-missing-return.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=return \
+// RUN: -fsanitize-trap=return -emit-llvm -S -c %s -o - | FileCheck %s
+
+int missing_return(int x)
+{
+ if (x > 0)
+ return x;
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 11) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-mul-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-mul-overflow.c
new file mode 100644
index 0000000000000..e9f76b87455c9
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-mul-overflow.c
@@ -0,0 +1,10 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=undefined \
+// RUN: -fsanitize-trap=undefined -emit-llvm -S -c %s -o - | FileCheck %s
+
+int mul_overflow(int a, int b) {
+ return a * b;
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 12) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
diff --git a/clang/test/CodeGen/ubsan-trap-reason-negate-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-negate-overflow.c
new file mode 100644
index 0000000000000..5660c6bb08d03
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-negate-overflow.c
@@ -0,0 +1,12 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=undefined \
+// RUN: -fsanitize-trap=undefined -emit-llvm -S -c %s -o - | FileCheck %s
+
+int negate_overflow()
+{
+ int x;
+ return -x;
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 13) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-nonnull-arg.c b/clang/test/CodeGen/ubsan-trap-reason-nonnull-arg.c
new file mode 100644
index 0000000000000..e648f91b86b27
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-nonnull-arg.c
@@ -0,0 +1,17 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=nonnull-attribute \
+// RUN: -fsanitize-trap=nonnull-attribute -emit-llvm -S -c %s -o - | FileCheck %s
+
+__attribute__((nonnull))
+void nonnull_arg(int *p) {
+ (void)p;
+}
+
+void trigger_nonnull_arg()
+{
+ nonnull_arg(0);
+}
+
+
+// CHECK: call void @llvm.ubsantrap(i8 16) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-nonnull-return.c b/clang/test/CodeGen/ubsan-trap-reason-nonnull-return.c
new file mode 100644
index 0000000000000..9b14004d96a02
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-nonnull-return.c
@@ -0,0 +1,15 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=returns-nonnull-attribute \
+// RUN: -fsanitize-trap=returns-nonnull-attribute -emit-llvm -S -c %s -o - | FileCheck %s
+
+__attribute__((returns_nonnull))
+int* must_return_nonnull(int bad)
+{
+ if (bad)
+ return 0;
+ static int x = 1;
+ return &x;
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 17) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-nullability-arg.c b/clang/test/CodeGen/ubsan-trap-reason-nullability-arg.c
new file mode 100644
index 0000000000000..e0d6a79b27c02
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-nullability-arg.c
@@ -0,0 +1,19 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=nullability-arg \
+// RUN: -fsanitize-trap=nullability-arg -emit-llvm -S -c %s -o - | FileCheck %s
+
+#include <stddef.h>
+
+int nullability_arg(int* _Nonnull p)
+{
+ return *p;
+}
+
+int trigger_nullability_arg()
+{
+ return nullability_arg(NULL);
+}
+
+
+// CHECK: call void @llvm.ubsantrap(i8 14) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-nullability-return.c b/clang/test/CodeGen/ubsan-trap-reason-nullability-return.c
new file mode 100644
index 0000000000000..e10fc5b225221
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-nullability-return.c
@@ -0,0 +1,19 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=nullability-return \
+// RUN: -fsanitize-trap=nullability-return -emit-llvm -S -c %s -o - | FileCheck %s
+
+#include <stdbool.h>
+#include <stddef.h>
+
+int* _Nonnull nullability_return(bool fail)
+{
+ if (fail)
+ return NULL;
+
+ static int x = 0;
+ return &x;
+}
+
+
+// CHECK: call void @llvm.ubsantrap(i8 15) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-out-of-bounds.c b/clang/test/CodeGen/ubsan-trap-reason-out-of-bounds.c
new file mode 100644
index 0000000000000..9ed093fc528ed
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-out-of-bounds.c
@@ -0,0 +1,12 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=bounds \
+// RUN: -fsanitize-trap=bounds -emit-llvm -S -c %s -o - | FileCheck %s
+
+int out_of_bounds()
+{
+ int a[1] = {0};
+ return a[1];
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 18) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-pointer-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-pointer-overflow.c
new file mode 100644
index 0000000000000..93ae42208520f
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-pointer-overflow.c
@@ -0,0 +1,16 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=pointer-overflow \
+// RUN: -fsanitize-trap=pointer-overflow -emit-llvm -S -c %s -o - | FileCheck %s
+
+#include <stddef.h>
+#include <stdint.h>
+
+int* pointer_overflow(void)
+{
+ int buf[4];
+ volatile size_t n = (SIZE_MAX / sizeof(int)) - 1;
+ return buf + n;
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 19) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-shift-out-of-bounds.c b/clang/test/CodeGen/ubsan-trap-reason-shift-out-of-bounds.c
new file mode 100644
index 0000000000000..6f5aff7cd197a
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-shift-out-of-bounds.c
@@ -0,0 +1,12 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=shift \
+// RUN: -fsanitize-trap=shift -emit-llvm -S -c %s -o - | FileCheck %s
+
+int shift_out_of_bounds()
+{
+ int sh = 32;
+ return 1 << sh;
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 20) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-sub-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-sub-overflow.c
new file mode 100644
index 0000000000000..3f7c5639aecf7
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-sub-overflow.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -O0 -debug-info-kind=standalone -dwarf-version=5 \
+// RUN: -fsanitize=signed-integer-overflow -fsanitize-trap=signed-integer-overflow -emit-llvm %s -o - | FileCheck %s
+
+int sub_overflow(int a, int b) {
+ return a - b;
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 21) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-type-mismatch.c b/clang/test/CodeGen/ubsan-trap-reason-type-mismatch.c
new file mode 100644
index 0000000000000..3907e8e239a04
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-type-mismatch.c
@@ -0,0 +1,11 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=undefined \
+// RUN: -fsanitize-trap=undefined -emit-llvm -S -c %s -o - | FileCheck %s
+
+int type_mismatch(int *p)
+{
+ return *p;
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 22) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
>From e40a02746df3d20e426cea7042e8ac9faf0f2c7b Mon Sep 17 00:00:00 2001
From: Anthony Tran <anthonytran at anthonys-air.lan>
Date: Mon, 23 Jun 2025 03:08:16 -0700
Subject: [PATCH 2/2] Address Michael's review and changed string descriptions
---
clang/lib/CodeGen/CGExpr.cpp | 60 +++++++++----------
clang/lib/CodeGen/CodeGenFunction.h | 3 +-
.../CodeGen/ubsan-trap-reason-add-overflow.c | 2 +-
.../ubsan-trap-reason-builtin-unreachable.c | 2 +-
.../ubsan-trap-reason-div-rem-overflow.c | 2 +-
.../ubsan-trap-reason-float-cast-overflow.c | 2 +-
...ubsan-trap-reason-function-type-mismatch.c | 2 +-
.../ubsan-trap-reason-implicit-conversion.c | 2 +-
.../ubsan-trap-reason-invalid-builtin.c | 2 +-
.../ubsan-trap-reason-load-invalid-value.c | 2 +-
.../ubsan-trap-reason-missing-return.cpp | 2 +-
.../CodeGen/ubsan-trap-reason-mul-overflow.c | 2 +-
.../ubsan-trap-reason-negate-overflow.c | 2 +-
.../CodeGen/ubsan-trap-reason-nonnull-arg.c | 2 +-
.../ubsan-trap-reason-nonnull-return.c | 2 +-
.../ubsan-trap-reason-nullability-arg.c | 2 +-
.../ubsan-trap-reason-nullability-return.c | 2 +-
.../CodeGen/ubsan-trap-reason-out-of-bounds.c | 2 +-
.../ubsan-trap-reason-pointer-overflow.c | 2 +-
.../ubsan-trap-reason-shift-out-of-bounds.c | 2 +-
.../CodeGen/ubsan-trap-reason-sub-overflow.c | 2 +-
.../CodeGen/ubsan-trap-reason-type-mismatch.c | 2 +-
...ubsan-trap-reason-vla-bound-not-positive.c | 14 +++++
23 files changed, 62 insertions(+), 55 deletions(-)
create mode 100644 clang/test/CodeGen/ubsan-trap-reason-vla-bound-not-positive.c
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index e37eaf948eb1a..126286e073628 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -88,53 +88,48 @@ enum VariableTypeDescriptorKind : uint16_t {
static llvm::StringRef GetTrapMessageForHandler(SanitizerHandler ID) {
switch (ID) {
case SanitizerHandler::AddOverflow:
- return "The addition of two signed integers resulted in overflow.";
+ return "Signed integer addition overflowed.";
case SanitizerHandler::BuiltinUnreachable:
- return "_builtin_unreachable encountered.";
+ return "_builtin_unreachable() executed.";
case SanitizerHandler::CFICheckFail:
- return "Control flow integrity check failed.";
+ return "Control flow integrity check failed";
- case SanitizerHandler::DivremOverflow: // Unsure
- return "stub";
+ case SanitizerHandler::DivremOverflow:
+ return "Signed integer divide or remainder overflowed";
- case SanitizerHandler::DynamicTypeCacheMiss: // Unsure
- return "Data requested for dynamic type not found in cache memory.";
+ case SanitizerHandler::DynamicTypeCacheMiss:
+ return "Dynamic-type cache miss";
- case SanitizerHandler::FloatCastOverflow: // Pasted from LLVM docs, maybe
- // something better to put here.
- return "Conversion to, from, or between floating-point types which would "
- "overflow the destination.";
+ case SanitizerHandler::FloatCastOverflow:
+ return "Floating-point to integer conversion overflowed";
case SanitizerHandler::FunctionTypeMismatch:
- return "Function called with arguments of a different data type than "
- "expected";
+ return "Function called with mismatched signature";
case SanitizerHandler::ImplicitConversion:
- return "Implicit conversion occurred.";
+ return "Implicit integer conversion overflowed or lost data";
case SanitizerHandler::InvalidBuiltin:
- return "Built-in function or keyword not recognized.";
+ return "Invalid use of builtin function";
case SanitizerHandler::InvalidObjCCast:
return "Invalid Objective-C cast.";
case SanitizerHandler::LoadInvalidValue:
- return "stub";
+ return "Loaded an invalid or uninitialized value";
case SanitizerHandler::MissingReturn:
- return "Function is missing a return.";
+ return "Non-void function fell off end without return";
case SanitizerHandler::MulOverflow:
- return "The multiplication of two signed integers resulted in overflow.";
+ return "Signed integer multiplication overflowed";
case SanitizerHandler::NegateOverflow:
- return "Underflow/negative overflow occurred.";
+ return "Signed integer negation overflowed";
- case SanitizerHandler::
- NullabilityArg: // Next 4 pasted from
- // https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
+ case SanitizerHandler::NullabilityArg:
return "Passing null as a function parameter which is annotated with "
"_Nonnull";
@@ -151,26 +146,25 @@ static llvm::StringRef GetTrapMessageForHandler(SanitizerHandler ID) {
"be null";
case SanitizerHandler::OutOfBounds:
- return "Out of bounds -- memory accessed outside of expected boundaries.";
+ return "Array index out of bounds";
case SanitizerHandler::PointerOverflow:
- return "stub";
+ return "Pointer arithmetic overflowed bounds";
case SanitizerHandler::ShiftOutOfBounds:
- return "Bit shift attempted to move bits beyond boundaries of data type's "
- "bit size.";
+ return "Shift amount exceeds bit-width of operand";
case SanitizerHandler::SubOverflow:
- return "The subtraction of two signed integers resulted in overflow.";
+ return "Signed integer subtraction overflowed";
case SanitizerHandler::TypeMismatch:
- return "Type mismatch -- value type used does not match type expected.";
+ return "Type mismatch in operation";
case SanitizerHandler::AlignmentAssumption: // Help on bottom 2
- return "stub";
+ return "Alignment assumption violated";
case SanitizerHandler::VLABoundNotPositive:
- return "stub";
+ return "Variable-length array bound is not positive";
default:
return "";
@@ -4133,8 +4127,7 @@ void CodeGenFunction::EmitUnreachable(SourceLocation Loc) {
void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
SanitizerHandler CheckHandlerID,
- bool NoMerge, StringRef Annotation,
- StringRef TrapMessage) {
+ bool NoMerge) {
llvm::BasicBlock *Cont = createBasicBlock("cont");
// If we're optimizing, collapse all calls to trap down to just one per
@@ -4145,7 +4138,8 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
llvm::BasicBlock *&TrapBB = TrapBBs[CheckHandlerID];
llvm::DILocation *TrapLocation = Builder.getCurrentDebugLocation();
- llvm::StringRef Category = GetTrapMessageForHandler(CheckHandlerID);
+ llvm::StringRef Category = "UBSan Trap Reason";
+ llvm::StringRef TrapMessage = GetTrapMessageForHandler(CheckHandlerID);
if (getDebugInfo() && !Category.empty()) {
TrapLocation = getDebugInfo()->CreateTrapFailureMessageFor(
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h
index bd7f87647a35c..59f14b3e35fd0 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -5287,8 +5287,7 @@ class CodeGenFunction : public CodeGenTypeCache {
/// Create a basic block that will call the trap intrinsic, and emit a
/// conditional branch to it, for the -ftrapv checks.
void EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID,
- bool NoMerge = false, StringRef Annotation = "",
- StringRef TrapMessage = "");
+ bool NoMerge = false);
/// Emit a call to trap or debugtrap and attach function attribute
/// "trap-func-name" if specified.
diff --git a/clang/test/CodeGen/ubsan-trap-reason-add-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-add-overflow.c
index 822a1c003d16a..e141ec515c260 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-add-overflow.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-add-overflow.c
@@ -7,4 +7,4 @@ int add_overflow(int a, int b) {
// CHECK: call void @llvm.ubsantrap(i8 0) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
diff --git a/clang/test/CodeGen/ubsan-trap-reason-builtin-unreachable.c b/clang/test/CodeGen/ubsan-trap-reason-builtin-unreachable.c
index ada4c372a92b7..f64b50fb110dd 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-builtin-unreachable.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-builtin-unreachable.c
@@ -9,4 +9,4 @@ int call_builtin_unreachable()
// CHECK: call void @llvm.ubsantrap(i8 1) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-div-rem-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-div-rem-overflow.c
index 17b6dca16cc62..91b37fa5d2f95 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-div-rem-overflow.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-div-rem-overflow.c
@@ -7,4 +7,4 @@ int div_rem_overflow(int a, int b) {
// CHECK: call void @llvm.ubsantrap(i8 3) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
diff --git a/clang/test/CodeGen/ubsan-trap-reason-float-cast-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-float-cast-overflow.c
index b761e638c5293..79b36495c5dcb 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-float-cast-overflow.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-float-cast-overflow.c
@@ -7,4 +7,4 @@ int f(float x) {
// CHECK: call void @llvm.ubsantrap(i8 5) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-function-type-mismatch.c b/clang/test/CodeGen/ubsan-trap-reason-function-type-mismatch.c
index 25063b69a894c..140cbc61107d5 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-function-type-mismatch.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-function-type-mismatch.c
@@ -13,4 +13,4 @@ int function_type_mismatch() {
// CHECK: call void @llvm.ubsantrap(i8 6) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-implicit-conversion.c b/clang/test/CodeGen/ubsan-trap-reason-implicit-conversion.c
index 48eb86d09b51a..f4ce6c37533b2 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-implicit-conversion.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-implicit-conversion.c
@@ -10,4 +10,4 @@ unsigned implicit_conversion()
// CHECK: call void @llvm.ubsantrap(i8 7) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-invalid-builtin.c b/clang/test/CodeGen/ubsan-trap-reason-invalid-builtin.c
index cd136df2f0ed4..7f1c5505732c1 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-invalid-builtin.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-invalid-builtin.c
@@ -9,4 +9,4 @@ unsigned invalid_builtin(unsigned x)
// CHECK: call void @llvm.ubsantrap(i8 8) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-load-invalid-value.c b/clang/test/CodeGen/ubsan-trap-reason-load-invalid-value.c
index 09d8d588f0a32..aee62441d3b9a 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-load-invalid-value.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-load-invalid-value.c
@@ -12,4 +12,4 @@ bool load_invalid_value()
// CHECK: call void @llvm.ubsantrap(i8 10) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-missing-return.cpp b/clang/test/CodeGen/ubsan-trap-reason-missing-return.cpp
index 7f0265abd2305..cc43815dd9066 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-missing-return.cpp
+++ b/clang/test/CodeGen/ubsan-trap-reason-missing-return.cpp
@@ -9,4 +9,4 @@ int missing_return(int x)
// CHECK: call void @llvm.ubsantrap(i8 11) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-mul-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-mul-overflow.c
index e9f76b87455c9..a56dba170f01f 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-mul-overflow.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-mul-overflow.c
@@ -7,4 +7,4 @@ int mul_overflow(int a, int b) {
// CHECK: call void @llvm.ubsantrap(i8 12) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
diff --git a/clang/test/CodeGen/ubsan-trap-reason-negate-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-negate-overflow.c
index 5660c6bb08d03..f395770e37adf 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-negate-overflow.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-negate-overflow.c
@@ -9,4 +9,4 @@ int negate_overflow()
// CHECK: call void @llvm.ubsantrap(i8 13) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-nonnull-arg.c b/clang/test/CodeGen/ubsan-trap-reason-nonnull-arg.c
index e648f91b86b27..16c9ce1101626 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-nonnull-arg.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-nonnull-arg.c
@@ -14,4 +14,4 @@ void trigger_nonnull_arg()
// CHECK: call void @llvm.ubsantrap(i8 16) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-nonnull-return.c b/clang/test/CodeGen/ubsan-trap-reason-nonnull-return.c
index 9b14004d96a02..ca55ac201cb4d 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-nonnull-return.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-nonnull-return.c
@@ -12,4 +12,4 @@ int* must_return_nonnull(int bad)
// CHECK: call void @llvm.ubsantrap(i8 17) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-nullability-arg.c b/clang/test/CodeGen/ubsan-trap-reason-nullability-arg.c
index e0d6a79b27c02..0520473e51104 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-nullability-arg.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-nullability-arg.c
@@ -16,4 +16,4 @@ int trigger_nullability_arg()
// CHECK: call void @llvm.ubsantrap(i8 14) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-nullability-return.c b/clang/test/CodeGen/ubsan-trap-reason-nullability-return.c
index e10fc5b225221..a9b4bb570f6cb 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-nullability-return.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-nullability-return.c
@@ -16,4 +16,4 @@ int* _Nonnull nullability_return(bool fail)
// CHECK: call void @llvm.ubsantrap(i8 15) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-out-of-bounds.c b/clang/test/CodeGen/ubsan-trap-reason-out-of-bounds.c
index 9ed093fc528ed..dcfbdf30d10b4 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-out-of-bounds.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-out-of-bounds.c
@@ -9,4 +9,4 @@ int out_of_bounds()
// CHECK: call void @llvm.ubsantrap(i8 18) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-pointer-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-pointer-overflow.c
index 93ae42208520f..b80c127323966 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-pointer-overflow.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-pointer-overflow.c
@@ -13,4 +13,4 @@ int* pointer_overflow(void)
// CHECK: call void @llvm.ubsantrap(i8 19) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-shift-out-of-bounds.c b/clang/test/CodeGen/ubsan-trap-reason-shift-out-of-bounds.c
index 6f5aff7cd197a..d79bea14af457 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-shift-out-of-bounds.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-shift-out-of-bounds.c
@@ -9,4 +9,4 @@ int shift_out_of_bounds()
// CHECK: call void @llvm.ubsantrap(i8 20) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-sub-overflow.c b/clang/test/CodeGen/ubsan-trap-reason-sub-overflow.c
index 3f7c5639aecf7..45f7b67c5c4d4 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-sub-overflow.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-sub-overflow.c
@@ -7,4 +7,4 @@ int sub_overflow(int a, int b) {
// CHECK: call void @llvm.ubsantrap(i8 21) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-type-mismatch.c b/clang/test/CodeGen/ubsan-trap-reason-type-mismatch.c
index 3907e8e239a04..fd64916d5ac2c 100644
--- a/clang/test/CodeGen/ubsan-trap-reason-type-mismatch.c
+++ b/clang/test/CodeGen/ubsan-trap-reason-type-mismatch.c
@@ -8,4 +8,4 @@ int type_mismatch(int *p)
// CHECK: call void @llvm.ubsantrap(i8 22) {{.*}}!dbg [[LOC:![0-9]+]]
// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
-// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$
\ No newline at end of file
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
diff --git a/clang/test/CodeGen/ubsan-trap-reason-vla-bound-not-positive.c b/clang/test/CodeGen/ubsan-trap-reason-vla-bound-not-positive.c
new file mode 100644
index 0000000000000..d128c3e2de77a
--- /dev/null
+++ b/clang/test/CodeGen/ubsan-trap-reason-vla-bound-not-positive.c
@@ -0,0 +1,14 @@
+// RUN: %clang -O0 -g -debug-info-kind=standalone -dwarf-version=5 -fsanitize=undefined \
+// RUN: -fsanitize-trap=undefined -emit-llvm -S -c %s -o - | FileCheck %s
+
+int n = 0;
+
+int vla_bound_not_positive()
+{
+ int a[n];
+ return sizeof a;
+}
+
+// CHECK: call void @llvm.ubsantrap(i8 24) {{.*}}!dbg [[LOC:![0-9]+]]
+// CHECK: [[LOC]] = !DILocation(line: 0, scope: [[MSG:![0-9]+]], {{.+}})
+// CHECK: distinct !DISubprogram(name: "__clang_trap_msg$UBSan Trap Reason
\ No newline at end of file
More information about the cfe-commits
mailing list