r337433 - [clang]: Add support for "-fno-delete-null-pointer-checks"

Manoj Gupta via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 23 13:07:01 PDT 2018


Agree,
will try to add separate testcase soon.

Thanks,
Manoj

On Mon, Jul 23, 2018 at 12:39 PM Richard Smith <richard at metafoo.co.uk>
wrote:

> 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 at 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 at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180723/d4cf7d10/attachment-0001.html>


More information about the cfe-commits mailing list