From 7442d6faa2719e4e7d33a7021c406c5a4facd74d Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Sun, 16 Apr 2017 16:02:28 +0000 Subject: Vendor import of clang trunk r300422: https://llvm.org/svn/llvm-project/cfe/trunk@300422 --- test/CodeGenCXX/ubsan-global-alignment.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 test/CodeGenCXX/ubsan-global-alignment.cpp (limited to 'test/CodeGenCXX/ubsan-global-alignment.cpp') diff --git a/test/CodeGenCXX/ubsan-global-alignment.cpp b/test/CodeGenCXX/ubsan-global-alignment.cpp new file mode 100644 index 000000000000..67fcfd469a96 --- /dev/null +++ b/test/CodeGenCXX/ubsan-global-alignment.cpp @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -fsanitize=alignment | FileCheck %s + +struct S { + int I; +}; + +extern S g_S; +extern S array_S[]; + +// CHECK-LABEL: define i32 @_Z18load_extern_global +int load_extern_global() { + // FIXME: The IR builder constant-folds the alignment check away to 'true' + // here, so we never call the diagnostic. This is PR32630. + // CHECK-NOT: ptrtoint i32* {{.*}} to i32, !nosanitize + // CHECK: [[I:%.*]] = load i32, i32* getelementptr inbounds (%struct.S, %struct.S* @g_S, i32 0, i32 0), align 4 + // CHECK-NEXT: ret i32 [[I]] + return g_S.I; +} + +// CHECK-LABEL: define i32 @_Z22load_from_extern_array +int load_from_extern_array(int I) { + // CHECK: [[I:%.*]] = getelementptr inbounds %struct.S, %struct.S* {{.*}}, i32 0, i32 0 + // CHECK-NEXT: [[PTRTOINT:%.*]] = ptrtoint i32* [[I]] to i64, !nosanitize + // CHECK-NEXT: [[AND:%.*]] = and i64 [[PTRTOINT]], 3, !nosanitize + // CHECK-NEXT: [[ICMP:%.*]] = icmp eq i64 [[AND]], 0, !nosanitize + // CHECK-NEXT: br i1 [[ICMP]] + // CHECK: call void @__ubsan_handle_type_mismatch + return array_S[I].I; +} -- cgit v1.3