]> granicus.if.org Git - clang/commitdiff
update calls to objectsize intrinsic to match LLVM r156473
authorNuno Lopes <nunoplopes@sapo.pt>
Wed, 9 May 2012 15:53:34 +0000 (15:53 +0000)
committerNuno Lopes <nunoplopes@sapo.pt>
Wed, 9 May 2012 15:53:34 +0000 (15:53 +0000)
add a test for -fbounds-checking code generation

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156474 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGBuiltin.cpp
lib/CodeGen/CGExpr.cpp
test/CodeGen/bounds-checking.c [new file with mode: 0644]
test/CodeGen/object-size.c

index bf180f64b3839c9397a8adf070efb6b93df24ca2..f995614fd56c3e038f54a63188fcb04c375bc85e 100644 (file)
@@ -346,11 +346,12 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
     assert(CI);
     uint64_t val = CI->getZExtValue();
     CI = ConstantInt::get(Builder.getInt1Ty(), (val & 0x2) >> 1);    
+    Value *Runtime = Builder.getInt32(0);  // FIXME: use BoundsChecking here?
     
     Value *F = CGM.getIntrinsic(Intrinsic::objectsize, ResType);
-    return RValue::get(Builder.CreateCall2(F,
+    return RValue::get(Builder.CreateCall3(F,
                                            EmitScalarExpr(E->getArg(0)),
-                                           CI));
+                                           CI, Runtime));
   }
   case Builtin::BI__builtin_prefetch: {
     Value *Locality, *RW, *Address = EmitScalarExpr(E->getArg(0));
index 19ee42824f5a97ee268a15ccb804a4a87c86701b..979454bdc872c1fb3e50edc7d9daf4b096cb7b68 100644 (file)
@@ -525,8 +525,9 @@ void CodeGenFunction::EmitCheck(llvm::Value *Address, unsigned Size) {
 
   llvm::Value *F = CGM.getIntrinsic(llvm::Intrinsic::objectsize, IntPtrTy);
 
-  llvm::Value *Arg = Builder.getFalse();
-  llvm::Value *C = Builder.CreateCall2(F, Address, Arg);
+  llvm::Value *Min = Builder.getFalse();
+  llvm::Value *Runtime = Builder.getInt32(BoundsChecking);
+  llvm::Value *C = Builder.CreateCall3(F, Address, Min, Runtime);
   llvm::BasicBlock *Cont = createBasicBlock();
   Builder.CreateCondBr(Builder.CreateICmpUGE(C,
                                         llvm::ConstantInt::get(IntPtrTy, Size)),
diff --git a/test/CodeGen/bounds-checking.c b/test/CodeGen/bounds-checking.c
new file mode 100644 (file)
index 0000000..ce7f24f
--- /dev/null
@@ -0,0 +1,25 @@
+// RUN: %clang_cc1 -fbounds-checking=4 -emit-llvm -triple x86_64-apple-darwin10 < %s | FileCheck %s
+
+// CHECK: @f
+double f(int b, int i) {
+  double a[b];
+  return a[i];
+  // CHECK: objectsize.i64({{.*}}, i1 false, i32 4)
+  // CHECK: icmp uge i64 {{.*}}, 8
+}
+
+// CHECK: @f2
+void f2() {
+  int a[2];
+  // CHECK: objectsize.i64({{.*}}, i1 false, i32 4)
+  // CHECK: icmp uge i64 {{.*}}, 4
+  a[1] = 42;
+  
+  short *b = malloc(64);
+  // CHECK: objectsize.i64({{.*}}, i1 false, i32 4)
+  // CHECK: icmp uge i64 {{.*}}, 4
+  // CHECK: getelementptr {{.*}}, i64 5
+  // CHECK: objectsize.i64({{.*}}, i1 false, i32 4)
+  // CHECK: icmp uge i64 {{.*}}, 2
+  b[5] = a[1]+2;
+}
index 1f16d02d7d64fa6de1e7cc8ec344da588d3cb24f..966d59f11df4baf22e254faba928eddc8c983a5c 100644 (file)
@@ -40,7 +40,7 @@ void test4() {
 // CHECK: define void @test5
 void test5() {
   // CHECK:     = load i8** @gp
-  // CHECK-NEXT:= call i64 @llvm.objectsize.i64(i8* %{{.*}}, i1 false)
+  // CHECK-NEXT:= call i64 @llvm.objectsize.i64(i8* %{{.*}}, i1 false, i32 0)
   strcpy(gp, "Hi there");
 }
 
@@ -55,7 +55,7 @@ void test6() {
 // CHECK: define void @test7
 void test7() {
   int i;
-  // CHECK:     = call i64 @llvm.objectsize.i64(i8* {{.*}}@gbuf{{.*}}, i1 false)
+  // CHECK:     = call i64 @llvm.objectsize.i64(i8* {{.*}}@gbuf{{.*}}, i1 false, i32 0)
   strcpy((++i, gbuf), "Hi there");
 }