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