<div dir="ltr">Hi Manoj,<div><br></div><div>Please can you add better test coverage that we don't emit 'nonnull' annotations for reference parameters / return values? At the moment, the only such test coverage has been added to test files that are testing unrelated things, which seems inappropriate. A separate test file that tests that we don't emit 'nonnull' annotations when null pointers are assumed valid would seem best to me.</div><div><br></div><div>Thanks!</div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, 18 Jul 2018 at 17:49, Manoj Gupta via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: manojgupta<br>
Date: Wed Jul 18 17:44:52 2018<br>
New Revision: 337433<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=337433&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=337433&view=rev</a><br>
Log:<br>
[clang]: Add support for "-fno-delete-null-pointer-checks"<br>
<br>
Summary:<br>
Support for this option is needed for building Linux kernel.<br>
This is a very frequently requested feature by kernel developers.<br>
<br>
More details : <a href="https://lkml.org/lkml/2018/4/4/601" rel="noreferrer" target="_blank">https://lkml.org/lkml/2018/4/4/601</a><br>
<br>
GCC option description for -fdelete-null-pointer-checks:<br>
This Assume that programs cannot safely dereference null pointers,<br>
and that no code or data element resides at address zero.<br>
<br>
-fno-delete-null-pointer-checks is the inverse of this implying that<br>
null pointer dereferencing is not undefined.<br>
<br>
This feature is implemented in as the function attribute<br>
"null-pointer-is-valid"="true".<br>
This CL only adds the attribute on the function.<br>
It also strips "nonnull" attributes from function arguments but<br>
keeps the related warnings unchanged.<br>
<br>
Corresponding LLVM change rL336613 already updated the<br>
optimizations to not treat null pointer dereferencing<br>
as undefined if the attribute is present.<br>
<br>
Reviewers: t.p.northover, efriedma, jyknight, chandlerc, rnk, srhines, void, george.burgess.iv<br>
<br>
Reviewed By: jyknight<br>
<br>
Subscribers: drinkcat, xbolva00, cfe-commits<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D47894" rel="noreferrer" target="_blank">https://reviews.llvm.org/D47894</a><br>
<br>
Added:<br>
    cfe/trunk/test/CodeGen/delete-null-pointer-checks.c<br>
Modified:<br>
    cfe/trunk/docs/ClangCommandLineReference.rst<br>
    cfe/trunk/include/clang/Driver/Options.td<br>
    cfe/trunk/include/clang/Frontend/CodeGenOptions.def<br>
    cfe/trunk/lib/CodeGen/CGCall.cpp<br>
    cfe/trunk/lib/Driver/ToolChains/Clang.cpp<br>
    cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
    cfe/trunk/test/CodeGen/nonnull.c<br>
    cfe/trunk/test/CodeGen/vla.c<br>
    cfe/trunk/test/CodeGenCXX/address-space-ref.cpp<br>
    cfe/trunk/test/CodeGenCXX/constructors.cpp<br>
    cfe/trunk/test/CodeGenCXX/temporaries.cpp<br>
    cfe/trunk/test/Driver/clang_f_opts.c<br>
    cfe/trunk/test/Sema/nonnull.c<br>
<br>
Modified: cfe/trunk/docs/ClangCommandLineReference.rst<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ClangCommandLineReference.rst?rev=337433&r1=337432&r2=337433&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ClangCommandLineReference.rst?rev=337433&r1=337432&r2=337433&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/docs/ClangCommandLineReference.rst (original)<br>
+++ cfe/trunk/docs/ClangCommandLineReference.rst Wed Jul 18 17:44:52 2018<br>
@@ -1543,6 +1543,14 @@ Specifies the largest alignment guarante<br>
<br>
 Disable implicit builtin knowledge of a specific function<br>
<br>
+.. option:: -fdelete-null-pointer-checks, -fno-delete-null-pointer-checks<br>
+<br>
+When enabled, treat null pointer dereference, creation of a reference to null,<br>
+or passing a null pointer to a function parameter annotated with the "nonnull"<br>
+attribute as undefined behavior. (And, thus the optimizer may assume that any<br>
+pointer used in such a way must not have been null and optimize away the<br>
+branches accordingly.) On by default.<br>
+<br>
 .. option:: -fno-elide-type<br>
<br>
 Do not elide types when printing diagnostics<br>
<br>
Modified: cfe/trunk/include/clang/Driver/Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=337433&r1=337432&r2=337433&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=337433&r1=337432&r2=337433&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/Options.td (original)<br>
+++ cfe/trunk/include/clang/Driver/Options.td Wed Jul 18 17:44:52 2018<br>
@@ -1080,6 +1080,13 @@ def frewrite_imports : Flag<["-"], "frew<br>
   Flags<[CC1Option]>;<br>
 def fno_rewrite_imports : Flag<["-"], "fno-rewrite-imports">, Group<f_Group>;<br>
<br>
+def fdelete_null_pointer_checks : Flag<["-"],<br>
+  "fdelete-null-pointer-checks">, Group<f_Group>,<br>
+  HelpText<"Treat usage of null pointers as undefined behavior.">;<br>
+def fno_delete_null_pointer_checks : Flag<["-"],<br>
+  "fno-delete-null-pointer-checks">, Group<f_Group>, Flags<[CC1Option]>,<br>
+  HelpText<"Do not treat usage of null pointers as undefined behavior.">;<br>
+<br>
 def frewrite_map_file : Separate<["-"], "frewrite-map-file">,<br>
                         Group<f_Group>,<br>
                         Flags<[ DriverOption, CC1Option ]>;<br>
@@ -2855,8 +2862,6 @@ defm reorder_blocks : BooleanFFlag<"reor<br>
 defm eliminate_unused_debug_types : BooleanFFlag<"eliminate-unused-debug-types">, Group<clang_ignored_f_Group>;<br>
 defm branch_count_reg : BooleanFFlag<"branch-count-reg">, Group<clang_ignored_gcc_optimization_f_Group>;<br>
 defm default_inline : BooleanFFlag<"default-inline">, Group<clang_ignored_gcc_optimization_f_Group>;<br>
-defm delete_null_pointer_checks : BooleanFFlag<"delete-null-pointer-checks">,<br>
-    Group<clang_ignored_gcc_optimization_f_Group>;<br>
 defm fat_lto_objects : BooleanFFlag<"fat-lto-objects">, Group<clang_ignored_gcc_optimization_f_Group>;<br>
 defm float_store : BooleanFFlag<"float-store">, Group<clang_ignored_gcc_optimization_f_Group>;<br>
 defm friend_injection : BooleanFFlag<"friend-injection">, Group<clang_ignored_f_Group>;<br>
<br>
Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=337433&r1=337432&r2=337433&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=337433&r1=337432&r2=337433&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Frontend/CodeGenOptions.def (original)<br>
+++ cfe/trunk/include/clang/Frontend/CodeGenOptions.def Wed Jul 18 17:44:52 2018<br>
@@ -130,6 +130,7 @@ CODEGENOPT(EnableSegmentedStacks , 1, 0)<br>
 CODEGENOPT(NoImplicitFloat   , 1, 0) ///< Set when -mno-implicit-float is enabled.<br>
 CODEGENOPT(NoInfsFPMath      , 1, 0) ///< Assume FP arguments, results not +-Inf.<br>
 CODEGENOPT(NoSignedZeros     , 1, 0) ///< Allow ignoring the signedness of FP zero<br>
+CODEGENOPT(NullPointerIsValid , 1, 0) ///< Assume Null pointer deference is defined.<br>
 CODEGENOPT(Reassociate       , 1, 0) ///< Allow reassociation of FP math ops<br>
 CODEGENOPT(ReciprocalMath    , 1, 0) ///< Allow FP divisions to be reassociated.<br>
 CODEGENOPT(NoTrappingMath    , 1, 0) ///< Set when -fno-trapping-math is enabled.<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGCall.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=337433&r1=337432&r2=337433&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=337433&r1=337432&r2=337433&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Wed Jul 18 17:44:52 2018<br>
@@ -1734,6 +1734,8 @@ void CodeGenModule::ConstructDefaultFnAt<br>
     FuncAttrs.addAttribute("less-precise-fpmad",<br>
                            llvm::toStringRef(CodeGenOpts.LessPreciseFPMAD));<br>
<br>
+    if (CodeGenOpts.NullPointerIsValid)<br>
+      FuncAttrs.addAttribute("null-pointer-is-valid", "true");<br>
     if (!CodeGenOpts.FPDenormalMode.empty())<br>
       FuncAttrs.addAttribute("denormal-fp-math", CodeGenOpts.FPDenormalMode);<br>
<br>
@@ -1867,7 +1869,8 @@ void CodeGenModule::ConstructAttributeLi<br>
     }<br>
     if (TargetDecl->hasAttr<RestrictAttr>())<br>
       RetAttrs.addAttribute(llvm::Attribute::NoAlias);<br>
-    if (TargetDecl->hasAttr<ReturnsNonNullAttr>())<br>
+    if (TargetDecl->hasAttr<ReturnsNonNullAttr>() &&<br>
+        !CodeGenOpts.NullPointerIsValid)<br>
       RetAttrs.addAttribute(llvm::Attribute::NonNull);<br>
     if (TargetDecl->hasAttr<AnyX86NoCallerSavedRegistersAttr>())<br>
       FuncAttrs.addAttribute("no_caller_saved_registers");<br>
@@ -1974,7 +1977,8 @@ void CodeGenModule::ConstructAttributeLi<br>
     if (!PTy->isIncompleteType() && PTy->isConstantSizeType())<br>
       RetAttrs.addDereferenceableAttr(getContext().getTypeSizeInChars(PTy)<br>
                                         .getQuantity());<br>
-    else if (getContext().getTargetAddressSpace(PTy) == 0)<br>
+    else if (getContext().getTargetAddressSpace(PTy) == 0 &&<br>
+             !CodeGenOpts.NullPointerIsValid)<br>
       RetAttrs.addAttribute(llvm::Attribute::NonNull);<br>
   }<br>
<br>
@@ -2083,7 +2087,8 @@ void CodeGenModule::ConstructAttributeLi<br>
       if (!PTy->isIncompleteType() && PTy->isConstantSizeType())<br>
         Attrs.addDereferenceableAttr(getContext().getTypeSizeInChars(PTy)<br>
                                        .getQuantity());<br>
-      else if (getContext().getTargetAddressSpace(PTy) == 0)<br>
+      else if (getContext().getTargetAddressSpace(PTy) == 0 &&<br>
+               !CodeGenOpts.NullPointerIsValid)<br>
         Attrs.addAttribute(llvm::Attribute::NonNull);<br>
     }<br>
<br>
@@ -2343,7 +2348,8 @@ void CodeGenFunction::EmitFunctionProlog<br>
<br>
         if (const ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(Arg)) {<br>
           if (getNonNullAttr(CurCodeDecl, PVD, PVD->getType(),<br>
-                             PVD->getFunctionScopeIndex()))<br>
+                             PVD->getFunctionScopeIndex()) &&<br>
+              !CGM.getCodeGenOpts().NullPointerIsValid)<br>
             AI->addAttr(llvm::Attribute::NonNull);<br>
<br>
           QualType OTy = PVD->getOriginalType();<br>
@@ -2362,7 +2368,8 @@ void CodeGenFunction::EmitFunctionProlog<br>
                 Attrs.addDereferenceableAttr(<br>
                   getContext().getTypeSizeInChars(ETy).getQuantity()*ArrSize);<br>
                 AI->addAttrs(Attrs);<br>
-              } else if (getContext().getTargetAddressSpace(ETy) == 0) {<br>
+              } else if (getContext().getTargetAddressSpace(ETy) == 0 &&<br>
+                         !CGM.getCodeGenOpts().NullPointerIsValid) {<br>
                 AI->addAttr(llvm::Attribute::NonNull);<br>
               }<br>
             }<br>
@@ -2372,7 +2379,8 @@ void CodeGenFunction::EmitFunctionProlog<br>
             // we can't use the dereferenceable attribute, but in addrspace(0)<br>
             // we know that it must be nonnull.<br>
             if (ArrTy->getSizeModifier() == VariableArrayType::Static &&<br>
-                !getContext().getTargetAddressSpace(ArrTy->getElementType()))<br>
+                !getContext().getTargetAddressSpace(ArrTy->getElementType()) &&<br>
+                !CGM.getCodeGenOpts().NullPointerIsValid)<br>
               AI->addAttr(llvm::Attribute::NonNull);<br>
           }<br>
<br>
<br>
Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=337433&r1=337432&r2=337433&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=337433&r1=337432&r2=337433&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original)<br>
+++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Wed Jul 18 17:44:52 2018<br>
@@ -3348,6 +3348,10 @@ void Clang::ConstructJob(Compilation &C,<br>
                    options::OPT_fno_merge_all_constants, false))<br>
     CmdArgs.push_back("-fmerge-all-constants");<br>
<br>
+  if (Args.hasFlag(options::OPT_fno_delete_null_pointer_checks,<br>
+                   options::OPT_fdelete_null_pointer_checks, false))<br>
+    CmdArgs.push_back("-fno-delete-null-pointer-checks");<br>
+<br>
   // LLVM Code Generator Options.<br>
<br>
   if (Args.hasArg(options::OPT_frewrite_map_file) ||<br>
<br>
Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=337433&r1=337432&r2=337433&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=337433&r1=337432&r2=337433&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Wed Jul 18 17:44:52 2018<br>
@@ -746,6 +746,8 @@ static bool ParseCodeGenArgs(CodeGenOpti<br>
<br>
   Opts.NoUseJumpTables = Args.hasArg(OPT_fno_jump_tables);<br>
<br>
+  Opts.NullPointerIsValid = Args.hasArg(OPT_fno_delete_null_pointer_checks);<br>
+<br>
   Opts.ProfileSampleAccurate = Args.hasArg(OPT_fprofile_sample_accurate);<br>
<br>
   Opts.PrepareForLTO = Args.hasArg(OPT_flto, OPT_flto_EQ);<br>
<br>
Added: cfe/trunk/test/CodeGen/delete-null-pointer-checks.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/delete-null-pointer-checks.c?rev=337433&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/delete-null-pointer-checks.c?rev=337433&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/delete-null-pointer-checks.c (added)<br>
+++ cfe/trunk/test/CodeGen/delete-null-pointer-checks.c Wed Jul 18 17:44:52 2018<br>
@@ -0,0 +1,20 @@<br>
+// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-linux-gnu -O2 -o - %s | FileCheck -check-prefix=NULL-POINTER-INVALID  %s<br>
+// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-linux-gnu -O2 -o - %s -fno-delete-null-pointer-checks | FileCheck -check-prefix=NULL-POINTER-VALID  %s<br>
+<br>
+// Test that clang does not remove the null pointer check with<br>
+// -fno-delete-null-pointer-checks.<br>
+int null_check(int *P) {<br>
+// NULL-POINTER-VALID: %[[TOBOOL:.*]] = icmp eq i32* %P, null<br>
+// NULL-POINTER-INVALID-NOT: icmp eq<br>
+// NULL-POINTER-VALID: %[[SEL:.*]] = select i1 %[[TOBOOL:.*]], i32* null, i32*<br>
+// NULL-POINTER-INVALID-NOT: select i1<br>
+// NULL-POINTER-VALID: load i32, i32* %[[SEL:.*]]<br>
+  int *Q = P;<br>
+  if (P) {<br>
+    Q = P + 2;<br>
+  }<br>
+  return *Q;<br>
+}<br>
+<br>
+// NULL-POINTER-INVALID-NOT: attributes #0 = {{.*}} "null-pointer-is-valid"="true"<br>
+// NULL-POINTER-VALID: attributes #0 = {{.*}} "null-pointer-is-valid"="true"<br>
<br>
Modified: cfe/trunk/test/CodeGen/nonnull.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/nonnull.c?rev=337433&r1=337432&r2=337433&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/nonnull.c?rev=337433&r1=337432&r2=337433&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/nonnull.c (original)<br>
+++ cfe/trunk/test/CodeGen/nonnull.c Wed Jul 18 17:44:52 2018<br>
@@ -1,32 +1,39 @@<br>
-// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm < %s | FileCheck %s<br>
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm < %s | FileCheck -check-prefix=NULL-INVALID %s<br>
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -fno-delete-null-pointer-checks < %s | FileCheck -check-prefix=NULL-VALID %s<br>
<br>
-// CHECK: define void @foo(i32* nonnull %x)<br>
+// NULL-INVALID: define void @foo(i32* nonnull %x)<br>
+// NULL-VALID: define void @foo(i32* %x)<br>
 void foo(int * __attribute__((nonnull)) x) {<br>
   *x = 0;<br>
 }<br>
<br>
-// CHECK: define void @bar(i32* nonnull %x)<br>
+// NULL-INVALID: define void @bar(i32* nonnull %x)<br>
+// NULL-VALID: define void @bar(i32* %x)<br>
 void bar(int * x) __attribute__((nonnull(1)))  {<br>
   *x = 0;<br>
 }<br>
<br>
-// CHECK: define void @bar2(i32* %x, i32* nonnull %y)<br>
+// NULL-INVALID: define void @bar2(i32* %x, i32* nonnull %y)<br>
+// NULL-VALID: define void @bar2(i32* %x, i32* %y)<br>
 void bar2(int * x, int * y) __attribute__((nonnull(2)))  {<br>
   *x = 0;<br>
 }<br>
<br>
 static int a;<br>
-// CHECK: define nonnull i32* @bar3()<br>
+// NULL-INVALID: define nonnull i32* @bar3()<br>
+// NULL-VALID: define i32* @bar3()<br>
 int * bar3() __attribute__((returns_nonnull))  {<br>
   return &a;<br>
 }<br>
<br>
-// CHECK: define i32 @bar4(i32 %n, i32* nonnull %p)<br>
+// NULL-INVALID: define i32 @bar4(i32 %n, i32* nonnull %p)<br>
+// NULL-VALID: define i32 @bar4(i32 %n, i32* %p)<br>
 int bar4(int n, int *p) __attribute__((nonnull)) {<br>
   return n + *p;<br>
 }<br>
<br>
-// CHECK: define i32 @bar5(i32 %n, i32* nonnull %p)<br>
+// NULL-INVALID: define i32 @bar5(i32 %n, i32* nonnull %p)<br>
+// NULL-VALID: define i32 @bar5(i32 %n, i32* %p)<br>
 int bar5(int n, int *p) __attribute__((nonnull(1, 2))) {<br>
   return n + *p;<br>
 }<br>
@@ -37,15 +44,18 @@ typedef union {<br>
   double d;<br>
 } TransparentUnion __attribute__((transparent_union));<br>
<br>
-// CHECK: define i32 @bar6(i64 %<br>
+// NULL-INVALID: define i32 @bar6(i64 %<br>
+// NULL-VALID: define i32 @bar6(i64 %<br>
 int bar6(TransparentUnion tu) __attribute__((nonnull(1))) {<br>
   return *tu.p;<br>
 }<br>
<br>
-// CHECK: define void @bar7(i32* nonnull %a, i32* nonnull %b)<br>
+// NULL-INVALID: define void @bar7(i32* nonnull %a, i32* nonnull %b)<br>
+// NULL-VALID: define void @bar7(i32* %a, i32* %b)<br>
 void bar7(int *a, int *b) __attribute__((nonnull(1)))<br>
 __attribute__((nonnull(2))) {}<br>
<br>
-// CHECK: define void @bar8(i32* nonnull %a, i32* nonnull %b)<br>
+// NULL-INVALID: define void @bar8(i32* nonnull %a, i32* nonnull %b)<br>
+// NULL-VALID: define void @bar8(i32* %a, i32* %b)<br>
 void bar8(int *a, int *b) __attribute__((nonnull))<br>
 __attribute__((nonnull(1))) {}<br>
<br>
Modified: cfe/trunk/test/CodeGen/vla.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/vla.c?rev=337433&r1=337432&r2=337433&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/vla.c?rev=337433&r1=337432&r2=337433&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/vla.c (original)<br>
+++ cfe/trunk/test/CodeGen/vla.c Wed Jul 18 17:44:52 2018<br>
@@ -1,4 +1,5 @@<br>
-// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s<br>
+// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK,NULL-INVALID<br>
+// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -fno-delete-null-pointer-checks -o - | FileCheck %s -check-prefixes=CHECK,NULL-VALID<br>
<br>
 int b(char* x);<br>
<br>
@@ -202,5 +203,6 @@ void test8(int a[static 3]) { }<br>
 // CHECK: define void @test8(i32* dereferenceable(12) %a)<br>
<br>
 void test9(int n, int a[static n]) { }<br>
-// CHECK: define void @test9(i32 %n, i32* nonnull %a)<br>
+// NULL-INVALID: define void @test9(i32 %n, i32* nonnull %a)<br>
+// NULL-VALID: define void @test9(i32 %n, i32* %a)<br>
<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/address-space-ref.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/address-space-ref.cpp?rev=337433&r1=337432&r2=337433&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/address-space-ref.cpp?rev=337433&r1=337432&r2=337433&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/address-space-ref.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/address-space-ref.cpp Wed Jul 18 17:44:52 2018<br>
@@ -1,4 +1,5 @@<br>
-// RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s<br>
+// RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK,NULL-INVALID<br>
+// RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -fno-delete-null-pointer-checks -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK,NULL-VALID<br>
<br>
 // For a reference to a complete type, output the dereferenceable attribute (in<br>
 // any address space).<br>
@@ -29,6 +30,7 @@ bc & bar2(bc &x, bc & y) {<br>
   return x;<br>
 }<br>
<br>
-// CHECK: define nonnull %class.bc* @_Z4bar2R2bcS0_(%class.bc* nonnull %x, %class.bc* nonnull %y)<br>
+// NULL-INVALID: define nonnull %class.bc* @_Z4bar2R2bcS0_(%class.bc* nonnull %x, %class.bc* nonnull %y)<br>
+// NULL-VALID: define %class.bc* @_Z4bar2R2bcS0_(%class.bc* %x, %class.bc* %y)<br>
<br>
<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/constructors.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/constructors.cpp?rev=337433&r1=337432&r2=337433&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/constructors.cpp?rev=337433&r1=337432&r2=337433&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/constructors.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/constructors.cpp Wed Jul 18 17:44:52 2018<br>
@@ -1,4 +1,5 @@<br>
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -emit-llvm -o - | FileCheck %s --implicit-check-not=should_not_appear_in_output<br>
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -emit-llvm -o - | FileCheck %s --implicit-check-not=should_not_appear_in_output --check-prefixes=CHECK,NULL-INVALID<br>
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -emit-llvm -fno-delete-null-pointer-checks -o - | FileCheck %s --implicit-check-not=should_not_appear_in_output --check-prefixes=CHECK,NULL-VALID<br>
<br>
 struct Member { int x; Member(); Member(int); Member(const Member &); };<br>
 struct VBase { int x; VBase(); VBase(int); VBase(const VBase &); };<br>
@@ -21,10 +22,12 @@ struct A {<br>
 A::A(struct Undeclared &ref) : mem(0) {}<br>
<br>
 // Check that delegation works.<br>
-// CHECK-LABEL: define void @_ZN1AC2ER10Undeclared(%struct.A* %this, %struct.Undeclared* nonnull %ref) unnamed_addr<br>
+// NULL-INVALID-LABEL: define void @_ZN1AC2ER10Undeclared(%struct.A* %this, %struct.Undeclared* nonnull %ref) unnamed_addr<br>
+// NULL-VALID-LABEL: define void @_ZN1AC2ER10Undeclared(%struct.A* %this, %struct.Undeclared* %ref) unnamed_addr<br>
 // CHECK: call void @_ZN6MemberC1Ei(<br>
<br>
-// CHECK-LABEL: define void @_ZN1AC1ER10Undeclared(%struct.A* %this, %struct.Undeclared* nonnull %ref) unnamed_addr<br>
+// NULL-INVALID-LABEL: define void @_ZN1AC1ER10Undeclared(%struct.A* %this, %struct.Undeclared* nonnull %ref) unnamed_addr<br>
+// NULL-VALID-LABEL: define void @_ZN1AC1ER10Undeclared(%struct.A* %this, %struct.Undeclared* %ref) unnamed_addr<br>
 // CHECK: call void @_ZN1AC2ER10Undeclared(<br>
<br>
 A::A(ValueClass v) : mem(v.y - v.x) {}<br>
@@ -43,11 +46,13 @@ struct B : A {<br>
<br>
 B::B(struct Undeclared &ref) : A(ref), mem(1) {}<br>
<br>
-// CHECK-LABEL: define void @_ZN1BC2ER10Undeclared(%struct.B* %this, %struct.Undeclared* nonnull %ref) unnamed_addr<br>
+// NULL-INVALID-LABEL: define void @_ZN1BC2ER10Undeclared(%struct.B* %this, %struct.Undeclared* nonnull %ref) unnamed_addr<br>
+// NULL-VALID-LABEL: define void @_ZN1BC2ER10Undeclared(%struct.B* %this, %struct.Undeclared* %ref) unnamed_addr<br>
 // CHECK: call void @_ZN1AC2ER10Undeclared(<br>
 // CHECK: call void @_ZN6MemberC1Ei(<br>
<br>
-// CHECK-LABEL: define void @_ZN1BC1ER10Undeclared(%struct.B* %this, %struct.Undeclared* nonnull %ref) unnamed_addr<br>
+// NULL-INVALID-LABEL: define void @_ZN1BC1ER10Undeclared(%struct.B* %this, %struct.Undeclared* nonnull %ref) unnamed_addr<br>
+// NULL-VALID-LABEL: define void @_ZN1BC1ER10Undeclared(%struct.B* %this, %struct.Undeclared* %ref) unnamed_addr<br>
 // CHECK: call void @_ZN1BC2ER10Undeclared(<br>
<br>
<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/temporaries.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/temporaries.cpp?rev=337433&r1=337432&r2=337433&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/temporaries.cpp?rev=337433&r1=337432&r2=337433&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/temporaries.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/temporaries.cpp Wed Jul 18 17:44:52 2018<br>
@@ -1,4 +1,5 @@<br>
-// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -std=c++11 | FileCheck %s<br>
+// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -std=c++11 | FileCheck %s -check-prefixes=CHECK,NULL-INVALID<br>
+// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -std=c++11 -fno-delete-null-pointer-checks | FileCheck %s -check-prefixes=CHECK,NULL-VALID<br>
<br>
 namespace PR16263 {<br>
   const unsigned int n = 1234;<br>
@@ -333,7 +334,8 @@ namespace PR6648 {<br>
   struct D;<br>
   D& zed(B);<br>
   void foobar() {<br>
-    // CHECK: call nonnull %"struct.PR6648::D"* @_ZN6PR66483zedENS_1BE<br>
+    // NULL-INVALID: call nonnull %"struct.PR6648::D"* @_ZN6PR66483zedENS_1BE<br>
+    // NULL-VALID: call %"struct.PR6648::D"* @_ZN6PR66483zedENS_1BE<br>
     zed(foo);<br>
   }<br>
 }<br>
<br>
Modified: cfe/trunk/test/Driver/clang_f_opts.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/clang_f_opts.c?rev=337433&r1=337432&r2=337433&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/clang_f_opts.c?rev=337433&r1=337432&r2=337433&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Driver/clang_f_opts.c (original)<br>
+++ cfe/trunk/test/Driver/clang_f_opts.c Wed Jul 18 17:44:52 2018<br>
@@ -348,7 +348,6 @@<br>
 // RUN: -fwhole-program                                                       \<br>
 // RUN: -fcaller-saves                                                        \<br>
 // RUN: -freorder-blocks                                                      \<br>
-// RUN: -fdelete-null-pointer-checks                                          \<br>
 // RUN: -ffat-lto-objects                                                     \<br>
 // RUN: -fmerge-constants                                                     \<br>
 // RUN: -finline-small-functions                                              \<br>
@@ -414,7 +413,6 @@<br>
 // CHECK-WARNING-DAG: optimization flag '-fwhole-program' is not supported<br>
 // CHECK-WARNING-DAG: optimization flag '-fcaller-saves' is not supported<br>
 // CHECK-WARNING-DAG: optimization flag '-freorder-blocks' is not supported<br>
-// CHECK-WARNING-DAG: optimization flag '-fdelete-null-pointer-checks' is not supported<br>
 // CHECK-WARNING-DAG: optimization flag '-ffat-lto-objects' is not supported<br>
 // CHECK-WARNING-DAG: optimization flag '-fmerge-constants' is not supported<br>
 // CHECK-WARNING-DAG: optimization flag '-finline-small-functions' is not supported<br>
@@ -526,3 +524,10 @@<br>
 // RUN: %clang -### -S -fno-merge-all-constants -fmerge-all-constants %s 2>&1 | FileCheck -check-prefix=CHECK-MERGE-ALL-CONSTANTS %s<br>
 // CHECK-NO-MERGE-ALL-CONSTANTS-NOT: "-fmerge-all-constants"<br>
 // CHECK-MERGE-ALL-CONSTANTS: "-fmerge-all-constants"<br>
+<br>
+// RUN: %clang -### -S -fdelete-null-pointer-checks %s 2>&1 | FileCheck -check-prefix=CHECK-NULL-POINTER-CHECKS %s<br>
+// RUN: %clang -### -S -fno-delete-null-pointer-checks %s 2>&1 | FileCheck -check-prefix=CHECK-NO-NULL-POINTER-CHECKS %s<br>
+// RUN: %clang -### -S -fdelete-null-pointer-checks -fno-delete-null-pointer-checks %s 2>&1 | FileCheck -check-prefix=CHECK-NO-NULL-POINTER-CHECKS %s<br>
+// RUN: %clang -### -S -fno-delete-null-pointer-checks -fdelete-null-pointer-checks %s 2>&1 | FileCheck -check-prefix=CHECK-NULL-POINTER-CHECKS %s<br>
+// CHECK-NO-NULL-POINTER-CHECKS: "-fno-delete-null-pointer-checks"<br>
+// CHECK-NULL-POINTER-CHECKS-NOT: "-fno-delete-null-pointer-checks"<br>
<br>
Modified: cfe/trunk/test/Sema/nonnull.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/nonnull.c?rev=337433&r1=337432&r2=337433&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/nonnull.c?rev=337433&r1=337432&r2=337433&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Sema/nonnull.c (original)<br>
+++ cfe/trunk/test/Sema/nonnull.c Wed Jul 18 17:44:52 2018<br>
@@ -1,5 +1,9 @@<br>
 // RUN: %clang_cc1 -fsyntax-only -verify %s<br>
 // rdar://9584012<br>
+//<br>
+// Verify All warnings are still issued with the option -fno-delete-null-pointer-checks<br>
+// if nullptr is passed to function with nonnull attribute.<br>
+// RUN: %clang_cc1 -fsyntax-only -fno-delete-null-pointer-checks -verify %s<br>
<br>
 typedef struct {<br>
        char *str;<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>