Merged to 7.0 in r339660.
On Sat, Aug 4, 2018 at 1:12 AM, Volodymyr Sapsai via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: vsapsai > Date: Fri Aug 3 16:12:37 2018 > New Revision: 338934 > > URL: http://llvm.org/viewvc/llvm-project?rev=338934&view=rev > Log: > [Preprocessor] Allow libc++ to detect when aligned allocation is unavailable. > > Libc++ needs to know when aligned allocation is supported by clang, but is > otherwise unavailable at link time. Otherwise, libc++ will incorrectly end up > generating calls to `__builtin_operator_new`/`__builtin_operator_delete` with > alignment arguments. > > This patch implements the following changes: > > * The `__cpp_aligned_new` feature test macro to no longer be defined when > aligned allocation is otherwise enabled but unavailable. > > * The Darwin driver no longer passes `-faligned-alloc-unavailable` when the > user manually specifies `-faligned-allocation` or `-fno-aligned-allocation`. > > * Instead of a warning Clang now generates a hard error when an aligned > allocation or deallocation function is referenced but unavailable. > > Patch by Eric Fiselier. > > Reviewers: rsmith, vsapsai, erik.pilkington, ahatanak, dexonsmith > > Reviewed By: rsmith > > Subscribers: Quuxplusone, cfe-commits > > Differential Revision: https://reviews.llvm.org/D45015 > > > Added: > cfe/trunk/test/Lexer/aligned-allocation.cpp > Modified: > cfe/trunk/include/clang/Basic/DiagnosticGroups.td > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > cfe/trunk/lib/Driver/ToolChains/Darwin.cpp > cfe/trunk/lib/Frontend/InitPreprocessor.cpp > cfe/trunk/lib/Sema/SemaExprCXX.cpp > cfe/trunk/test/Driver/unavailable_aligned_allocation.cpp > > Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=338934&r1=338933&r2=338934&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Fri Aug 3 16:12:37 2018 > @@ -364,7 +364,6 @@ def NonVirtualDtor : DiagGroup<"non-virt > def NullPointerArithmetic : DiagGroup<"null-pointer-arithmetic">; > def : DiagGroup<"effc++", [NonVirtualDtor]>; > def OveralignedType : DiagGroup<"over-aligned">; > -def AlignedAllocationUnavailable : > DiagGroup<"aligned-allocation-unavailable">; > def OldStyleCast : DiagGroup<"old-style-cast">; > def : DiagGroup<"old-style-definition">; > def OutOfLineDeclaration : DiagGroup<"out-of-line-declaration">; > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=338934&r1=338933&r2=338934&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Aug 3 16:12:37 > 2018 > @@ -6465,12 +6465,12 @@ def warn_overaligned_type : Warning< > "type %0 requires %1 bytes of alignment and the default allocator only " > "guarantees %2 bytes">, > InGroup<OveralignedType>, DefaultIgnore; > -def warn_aligned_allocation_unavailable :Warning< > +def err_aligned_allocation_unavailable : Error< > "aligned %select{allocation|deallocation}0 function of type '%1' is only " > - "available on %2 %3 or newer">, InGroup<AlignedAllocationUnavailable>, > DefaultError; > + "available on %2 %3 or newer">; > def note_silence_unligned_allocation_unavailable : Note< > "if you supply your own aligned allocation functions, use " > - "-Wno-aligned-allocation-unavailable to silence this diagnostic">; > + "-faligned-allocation to silence this diagnostic">; > > def err_conditional_void_nonvoid : Error< > "%select{left|right}1 operand to ? is void, but %select{right|left}1 > operand " > > Modified: cfe/trunk/lib/Driver/ToolChains/Darwin.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Darwin.cpp?rev=338934&r1=338933&r2=338934&view=diff > ============================================================================== > --- cfe/trunk/lib/Driver/ToolChains/Darwin.cpp (original) > +++ cfe/trunk/lib/Driver/ToolChains/Darwin.cpp Fri Aug 3 16:12:37 2018 > @@ -2035,7 +2035,11 @@ bool Darwin::isAlignedAllocationUnavaila > void Darwin::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, > llvm::opt::ArgStringList &CC1Args, > Action::OffloadKind DeviceOffloadKind) > const { > - if (isAlignedAllocationUnavailable()) > + // Pass "-faligned-alloc-unavailable" only when the user hasn't manually > + // enabled or disabled aligned allocations. > + if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation, > + options::OPT_fno_aligned_allocation) && > + isAlignedAllocationUnavailable()) > CC1Args.push_back("-faligned-alloc-unavailable"); > } > > > Modified: cfe/trunk/lib/Frontend/InitPreprocessor.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitPreprocessor.cpp?rev=338934&r1=338933&r2=338934&view=diff > ============================================================================== > --- cfe/trunk/lib/Frontend/InitPreprocessor.cpp (original) > +++ cfe/trunk/lib/Frontend/InitPreprocessor.cpp Fri Aug 3 16:12:37 2018 > @@ -553,7 +553,7 @@ static void InitializeCPlusPlusFeatureTe > Builder.defineMacro("__cpp_guaranteed_copy_elision", "201606L"); > Builder.defineMacro("__cpp_nontype_template_parameter_auto", "201606L"); > } > - if (LangOpts.AlignedAllocation) > + if (LangOpts.AlignedAllocation && !LangOpts.AlignedAllocationUnavailable) > Builder.defineMacro("__cpp_aligned_new", "201606L"); > if (LangOpts.RelaxedTemplateTemplateArgs) > Builder.defineMacro("__cpp_template_template_args", "201611L"); > > Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=338934&r1=338933&r2=338934&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Fri Aug 3 16:12:37 2018 > @@ -1741,9 +1741,9 @@ static void diagnoseUnavailableAlignedAl > StringRef OSName = AvailabilityAttr::getPlatformNameSourceSpelling( > S.getASTContext().getTargetInfo().getPlatformName()); > > - S.Diag(Loc, diag::warn_aligned_allocation_unavailable) > - << IsDelete << FD.getType().getAsString() << OSName > - << alignedAllocMinVersion(T.getOS()).getAsString(); > + S.Diag(Loc, diag::err_aligned_allocation_unavailable) > + << IsDelete << FD.getType().getAsString() << OSName > + << alignedAllocMinVersion(T.getOS()).getAsString(); > S.Diag(Loc, diag::note_silence_unligned_allocation_unavailable); > } > } > > Modified: cfe/trunk/test/Driver/unavailable_aligned_allocation.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/unavailable_aligned_allocation.cpp?rev=338934&r1=338933&r2=338934&view=diff > ============================================================================== > --- cfe/trunk/test/Driver/unavailable_aligned_allocation.cpp (original) > +++ cfe/trunk/test/Driver/unavailable_aligned_allocation.cpp Fri Aug 3 > 16:12:37 2018 > @@ -51,4 +51,13 @@ > // RUN: -c -### %s 2>&1 \ > // RUN: | FileCheck %s -check-prefix=AVAILABLE > // > +// Check that passing -faligned-allocation or -fno-aligned-allocation stops > the > +// driver from passing -faligned-alloc-unavailable to cc1. > +// > +// RUN: %clang -target x86_64-apple-macosx10.12 -faligned-allocation -c -### > %s 2>&1 \ > +// RUN: | FileCheck %s -check-prefix=AVAILABLE > +// > +// RUN: %clang -target x86_64-apple-macosx10.12 -fno-aligned-allocation -c > -### %s 2>&1 \ > +// RUN: | FileCheck %s -check-prefix=AVAILABLE > + > // AVAILABLE-NOT: "-faligned-alloc-unavailable" > > Added: cfe/trunk/test/Lexer/aligned-allocation.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/aligned-allocation.cpp?rev=338934&view=auto > ============================================================================== > --- cfe/trunk/test/Lexer/aligned-allocation.cpp (added) > +++ cfe/trunk/test/Lexer/aligned-allocation.cpp Fri Aug 3 16:12:37 2018 > @@ -0,0 +1,23 @@ > +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.12.0 -fexceptions > -std=c++17 -verify %s \ > +// RUN: -DEXPECT_DEFINED > +// > +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.12.0 -fexceptions > -std=c++17 -verify %s \ > +// RUN: -faligned-alloc-unavailable > +// > +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.12.0 -fexceptions > -std=c++17 -verify %s \ > +// RUN: -faligned-allocation -faligned-alloc-unavailable > + > +// Test that __cpp_aligned_new is not defined when CC1 is passed > +// -faligned-alloc-unavailable by the Darwin driver, even when aligned > +// allocation is actually enabled. > + > +// expected-no-diagnostics > +#ifdef EXPECT_DEFINED > +# ifndef __cpp_aligned_new > +# error "__cpp_aligned_new" should be defined > +# endif > +#else > +# ifdef __cpp_aligned_new > +# error "__cpp_aligned_new" should not be defined > +# endif > +#endif > > > _______________________________________________ > 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