At -O0, emit an @llvm.trap() call at the end of a value-returning function which
authorRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 15 Oct 2012 00:23:07 +0000 (00:23 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 15 Oct 2012 00:23:07 +0000 (00:23 +0000)
fails to return a value, to make debugging this issue easier.

llvm-svn: 165914

clang/lib/CodeGen/CodeGenFunction.cpp
clang/test/CodeGenCXX/return.cpp

index 8562d79..5f71af8 100644 (file)
@@ -547,6 +547,8 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn,
       EmitCheck(Builder.getFalse(), "missing_return",
                 EmitCheckSourceLocation(FD->getLocation()),
                 llvm::ArrayRef<llvm::Value*>());
+    else if (CGM.getCodeGenOpts().OptimizationLevel == 0)
+      Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::trap));
     Builder.CreateUnreachable();
     Builder.ClearInsertionPoint();
   }
index 2af1a52..43d40ae 100644 (file)
@@ -1,6 +1,12 @@
-// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm -O0 -o - %s | FileCheck %s
+// RUN: %clang_cc1 -emit-llvm -O -o - %s | FileCheck %s --check-prefix=CHECK-OPT
 
-// CHECK: @_Z9no_return
+// CHECK:     @_Z9no_return
+// CHECK-OPT: @_Z9no_return
 int no_return() {
-  // CHECK: unreachable
+  // CHECK:      call void @llvm.trap
+  // CHECK-NEXT: unreachable
+
+  // CHECK-OPT-NOT: call void @llvm.trap
+  // CHECK-OPT:     unreachable
 }