brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · a63f87f Raw
70 lines · plain
1// RUN: %clang_cc1 -no-enable-noundef-analysis -x objective-c -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=bool -o - -w < %s | FileCheck %s -check-prefixes=SHARED,OBJC2// RUN: %clang_cc1 -no-enable-noundef-analysis -x objective-c++ -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=bool -o - -w < %s | FileCheck %s -check-prefixes=SHARED,OBJC3// RUN: %clang_cc1 -no-enable-noundef-analysis -x c -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=bool -o - < %s | FileCheck %s -check-prefixes=SHARED,C4 5typedef signed char BOOL;6 7// SHARED-LABEL: define{{.*}}f18BOOL f1(void) {9  // OBJC: call void @__ubsan_handle_load_invalid_value10  // C-NOT: call void @__ubsan_handle_load_invalid_value11  BOOL a = 2;12  return a + 1;13  // SHARED: ret i814}15 16struct S1 {17  BOOL b1 : 1;18};19 20// SHARED-LABEL: define{{.*}}f221BOOL f2(struct S1 *s) {22  // OBJC: [[LOAD:%.*]] = load i8, ptr {{.*}}23  // OBJC: [[SHL:%.*]] = shl i8 [[LOAD]], 724  // OBJC: [[ASHR:%.*]] = ashr i8 [[SHL]], 725  // OBJC: icmp ule i8 [[ASHR]], 1, !nosanitize26  // OBJC: call void @__ubsan_handle_load_invalid_value27 28  // C-NOT: call void @__ubsan_handle_load_invalid_value29  return s->b1;30  // SHARED: ret i831}32 33#ifdef __OBJC__34@interface SuperClass35@end36 37@interface I1 : SuperClass {38@public39  BOOL b1 : 1;40}41@property (nonatomic) BOOL b1;42@end43@implementation I144@synthesize b1;45@end46 47// Check the synthesized getter.48// OBJC-LABEL: define internal signext i8 @"\01-[I1 b1]"49// OBJC: [[IVAR:%.*]] = load i64, ptr @"OBJC_IVAR_$_I1.b1"50// OBJC: [[ADDR:%.*]] = getelementptr inbounds i8, ptr {{.*}}, i64 [[IVAR]]51// OBJC: [[LOAD:%.*]] = load i8, ptr {{.*}}52// OBJC: [[SHL:%.*]] = shl i8 [[LOAD]], 753// OBJC: [[ASHR:%.*]] = ashr i8 [[SHL]], 754// OBJC: icmp ule i8 [[ASHR]], 1, !nosanitize55// OBJC: call void @__ubsan_handle_load_invalid_value56 57// Also check direct accesses to the ivar.58// OBJC-LABEL: define{{.*}}f359BOOL f3(I1 *i) {60  // OBJC: [[LOAD:%.*]] = load i8, ptr {{.*}}61  // OBJC: [[SHL:%.*]] = shl i8 [[LOAD]], 762  // OBJC: [[ASHR:%.*]] = ashr i8 [[SHL]], 763  // OBJC: icmp ule i8 [[ASHR]], 1, !nosanitize64  // OBJC: call void @__ubsan_handle_load_invalid_value65 66  return i->b1;67  // OBJC: ret i868}69#endif /* __OBJC__ */70