67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
// RUN: %clang_cc1 -x objective-c -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=bool %s -o - -w | FileCheck %s -check-prefixes=SHARED,OBJC
 | 
						|
// RUN: %clang_cc1 -x objective-c++ -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=bool %s -o - -w | FileCheck %s -check-prefixes=SHARED,OBJC
 | 
						|
// RUN: %clang_cc1 -x c -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=bool %s -o - | FileCheck %s -check-prefixes=SHARED,C
 | 
						|
 | 
						|
typedef signed char BOOL;
 | 
						|
 | 
						|
// SHARED-LABEL: f1
 | 
						|
BOOL f1() {
 | 
						|
  // OBJC: call void @__ubsan_handle_load_invalid_value
 | 
						|
  // C-NOT: call void @__ubsan_handle_load_invalid_value
 | 
						|
  BOOL a = 2;
 | 
						|
  return a + 1;
 | 
						|
  // SHARED: ret i8
 | 
						|
}
 | 
						|
 | 
						|
struct S1 {
 | 
						|
  BOOL b1 : 1;
 | 
						|
};
 | 
						|
 | 
						|
// SHARED-LABEL: f2
 | 
						|
BOOL f2(struct S1 *s) {
 | 
						|
  // OBJC: [[LOAD:%.*]] = load i8, i8* {{.*}}
 | 
						|
  // OBJC: [[SHL:%.*]] = shl i8 [[LOAD]], 7
 | 
						|
  // OBJC: [[ASHR:%.*]] = ashr i8 [[SHL]], 7
 | 
						|
  // OBJC: icmp ule i8 [[ASHR]], 1, !nosanitize
 | 
						|
  // OBJC: call void @__ubsan_handle_load_invalid_value
 | 
						|
 | 
						|
  // C-NOT: call void @__ubsan_handle_load_invalid_value
 | 
						|
  return s->b1;
 | 
						|
  // SHARED: ret i8
 | 
						|
}
 | 
						|
 | 
						|
#ifdef __OBJC__
 | 
						|
@interface I1 {
 | 
						|
@public
 | 
						|
  BOOL b1 : 1;
 | 
						|
}
 | 
						|
@property (nonatomic) BOOL b1;
 | 
						|
@end
 | 
						|
@implementation I1
 | 
						|
@synthesize b1;
 | 
						|
@end
 | 
						|
 | 
						|
// Check the synthesized getter.
 | 
						|
// OBJC-LABEL: define internal signext i8 @"\01-[I1 b1]"
 | 
						|
// OBJC: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_I1.b1"
 | 
						|
// OBJC: [[ADDR:%.*]] = getelementptr inbounds i8, i8* {{.*}}, i64 [[IVAR]]
 | 
						|
// OBJC: [[LOAD:%.*]] = load i8, i8* {{.*}}
 | 
						|
// OBJC: [[SHL:%.*]] = shl i8 [[LOAD]], 7
 | 
						|
// OBJC: [[ASHR:%.*]] = ashr i8 [[SHL]], 7
 | 
						|
// OBJC: icmp ule i8 [[ASHR]], 1, !nosanitize
 | 
						|
// OBJC: call void @__ubsan_handle_load_invalid_value
 | 
						|
 | 
						|
// Also check direct accesses to the ivar.
 | 
						|
// OBJC-LABEL: f3
 | 
						|
BOOL f3(I1 *i) {
 | 
						|
  // OBJC: [[LOAD:%.*]] = load i8, i8* {{.*}}
 | 
						|
  // OBJC: [[SHL:%.*]] = shl i8 [[LOAD]], 7
 | 
						|
  // OBJC: [[ASHR:%.*]] = ashr i8 [[SHL]], 7
 | 
						|
  // OBJC: icmp ule i8 [[ASHR]], 1, !nosanitize
 | 
						|
  // OBJC: call void @__ubsan_handle_load_invalid_value
 | 
						|
 | 
						|
  return i->b1;
 | 
						|
  // OBJC: ret i8
 | 
						|
}
 | 
						|
#endif /* __OBJC__ */
 |