Ensure sanitizer check function calls have a !dbg location

Function calls without a !dbg location inside a function that has a
DISubprogram make it impossible to construct inline information and
are rejected by the verifier. This patch ensures that sanitizer check
function calls have a !dbg location, by carrying forward the location
of the preceding instruction or by inserting an artificial location if
necessary.

This fixes a crash when compiling the attached testcase with -Os.

rdar://problem/45311226

Differential Revision: https://reviews.llvm.org/D53459

llvm-svn: 344915
This commit is contained in:
Adrian Prantl 2018-10-22 16:27:41 +00:00
parent 687ec75d10
commit 5f5b910495
2 changed files with 20 additions and 0 deletions

View File

@ -2867,6 +2867,9 @@ static void emitCheckHandlerCall(CodeGenFunction &CGF,
CheckRecoverableKind RecoverKind, bool IsFatal,
llvm::BasicBlock *ContBB) {
assert(IsFatal || RecoverKind != CheckRecoverableKind::Unrecoverable);
auto *DI = CGF.getDebugInfo();
SourceLocation Loc = DI ? DI->getLocation() : SourceLocation();
auto DL = ApplyDebugLocation::CreateDefaultArtificial(CGF, Loc);
bool NeedsAbortSuffix =
IsFatal && RecoverKind != CheckRecoverableKind::Unrecoverable;
bool MinimalRuntime = CGF.CGM.getCodeGenOpts().SanitizeMinimalRuntime;

View File

@ -0,0 +1,17 @@
// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited \
// RUN: -fsanitize=null %s -o - | FileCheck %s
// Check that santizer check calls have a !dbg location.
// CHECK: define {{.*}}acquire{{.*}} !dbg
// CHECK-NOT: define
// CHECK: call void {{.*}}@__ubsan_handle_type_mismatch_v1
// CHECK-SAME: !dbg
struct SourceLocation {
SourceLocation acquire() {};
};
extern "C" void __ubsan_handle_type_mismatch_v1(SourceLocation *Loc);
static void handleTypeMismatchImpl(SourceLocation *Loc) { Loc->acquire(); }
void __ubsan_handle_type_mismatch_v1(SourceLocation *Loc) {
handleTypeMismatchImpl(Loc);
}