Re: r285544 - Add support for __builtin_alloca_with_align
Added in r285609. On Mon, Oct 31, 2016 at 9:21 AM, Hal Finkel <hfin...@anl.gov> wrote: > Hi David, > > On Reid's patch for this (D25581), Richard said, "This takes the alignment > in bits? That's so ridiculously dumb that I would feel bad about accepting > this patch unless it comes with a warning for people writing the > obvious-but-wrong __builtin_alloca_with_align(sizeof(T), alignof(T))". We > should add the warning. > > Thanks again, > Hal > > - Original Message - > > From: "David Majnemer via cfe-commits" <cfe-commits@lists.llvm.org> > > To: cfe-commits@lists.llvm.org > > Sent: Monday, October 31, 2016 12:37:49 AM > > Subject: r285544 - Add support for __builtin_alloca_with_align > > > > Author: majnemer > > Date: Mon Oct 31 00:37:48 2016 > > New Revision: 285544 > > > > URL: http://llvm.org/viewvc/llvm-project?rev=285544=rev > > Log: > > Add support for __builtin_alloca_with_align > > > > __builtin_alloca always uses __BIGGEST_ALIGNMENT__ for the alignment > > of > > the allocation. __builtin_alloca_with_align allows the programmer to > > specify the alignment of the allocation. > > > > This fixes PR30658. > > > > Added: > > cfe/trunk/test/Sema/builtin-alloca-with-align.c > > Modified: > > cfe/trunk/include/clang/Basic/Builtins.def > > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > > cfe/trunk/include/clang/Sema/Sema.h > > cfe/trunk/lib/CodeGen/CGBuiltin.cpp > > cfe/trunk/lib/Sema/SemaChecking.cpp > > cfe/trunk/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp > > cfe/trunk/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp > > cfe/trunk/test/CodeGen/builtins-ms.c > > > > Modified: cfe/trunk/include/clang/Basic/Builtins.def > > URL: > > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/ > clang/Basic/Builtins.def?rev=285544=285543=285544=diff > > > == > > --- cfe/trunk/include/clang/Basic/Builtins.def (original) > > +++ cfe/trunk/include/clang/Basic/Builtins.def Mon Oct 31 00:37:48 > > 2016 > > @@ -512,6 +512,7 @@ BUILTIN(__builtin_unreachable, "v", "nr" > > BUILTIN(__builtin_shufflevector, "v." , "nc") > > BUILTIN(__builtin_convertvector, "v." , "nct") > > BUILTIN(__builtin_alloca, "v*z" , "Fn") > > +BUILTIN(__builtin_alloca_with_align, "v*zIz", "Fn") > > BUILTIN(__builtin_call_with_static_chain, "v.", "nt") > > > > // "Overloaded" Atomic operator builtins. These are overloaded to > > support data > > > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > > URL: > > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/ > DiagnosticSemaKinds.td?rev=285544=285543=285544=diff > > > == > > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Oct 31 > > 00:37:48 2016 > > @@ -2440,6 +2440,10 @@ def err_no_accessor_for_property : Error > > def error_cannot_find_suitable_accessor : Error< > >"cannot find suitable %select{getter|setter}0 for property %1">; > > > > +def err_alignment_too_small : Error< > > + "requested alignment must be %0 or greater">; > > +def err_alignment_too_big : Error< > > + "requested alignment must be %0 or smaller">; > > def err_alignment_not_power_of_two : Error< > >"requested alignment is not a power of 2">; > > def err_alignment_dependent_typedef_name : Error< > > > > Modified: cfe/trunk/include/clang/Sema/Sema.h > > URL: > > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/ > clang/Sema/Sema.h?rev=285544=285543=285544=diff > > > == > > --- cfe/trunk/include/clang/Sema/Sema.h (original) > > +++ cfe/trunk/include/clang/Sema/Sema.h Mon Oct 31 00:37:48 2016 > > @@ -9719,6 +9719,7 @@ public: > > > > private: > >bool SemaBuiltinPrefetch(CallExpr *TheCall); > > + bool SemaBuiltinAllocaWithAlign(CallExpr *TheCall); > >bool SemaBuiltinAssume(CallExpr *TheCall); > >bool SemaBuiltinAssumeAligned(CallExpr *TheCall); > >bool SemaBuiltinLongjmp(CallExpr *TheCall); > > > > Modi
Re: r285544 - Add support for __builtin_alloca_with_align
Hi David, On Reid's patch for this (D25581), Richard said, "This takes the alignment in bits? That's so ridiculously dumb that I would feel bad about accepting this patch unless it comes with a warning for people writing the obvious-but-wrong __builtin_alloca_with_align(sizeof(T), alignof(T))". We should add the warning. Thanks again, Hal - Original Message - > From: "David Majnemer via cfe-commits" <cfe-commits@lists.llvm.org> > To: cfe-commits@lists.llvm.org > Sent: Monday, October 31, 2016 12:37:49 AM > Subject: r285544 - Add support for __builtin_alloca_with_align > > Author: majnemer > Date: Mon Oct 31 00:37:48 2016 > New Revision: 285544 > > URL: http://llvm.org/viewvc/llvm-project?rev=285544=rev > Log: > Add support for __builtin_alloca_with_align > > __builtin_alloca always uses __BIGGEST_ALIGNMENT__ for the alignment > of > the allocation. __builtin_alloca_with_align allows the programmer to > specify the alignment of the allocation. > > This fixes PR30658. > > Added: > cfe/trunk/test/Sema/builtin-alloca-with-align.c > Modified: > cfe/trunk/include/clang/Basic/Builtins.def > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > cfe/trunk/include/clang/Sema/Sema.h > cfe/trunk/lib/CodeGen/CGBuiltin.cpp > cfe/trunk/lib/Sema/SemaChecking.cpp > cfe/trunk/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp > cfe/trunk/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp > cfe/trunk/test/CodeGen/builtins-ms.c > > Modified: cfe/trunk/include/clang/Basic/Builtins.def > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Builtins.def?rev=285544=285543=285544=diff > == > --- cfe/trunk/include/clang/Basic/Builtins.def (original) > +++ cfe/trunk/include/clang/Basic/Builtins.def Mon Oct 31 00:37:48 > 2016 > @@ -512,6 +512,7 @@ BUILTIN(__builtin_unreachable, "v", "nr" > BUILTIN(__builtin_shufflevector, "v." , "nc") > BUILTIN(__builtin_convertvector, "v." , "nct") > BUILTIN(__builtin_alloca, "v*z" , "Fn") > +BUILTIN(__builtin_alloca_with_align, "v*zIz", "Fn") > BUILTIN(__builtin_call_with_static_chain, "v.", "nt") > > // "Overloaded" Atomic operator builtins. These are overloaded to > support data > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=285544=285543=285544=diff > == > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Oct 31 > 00:37:48 2016 > @@ -2440,6 +2440,10 @@ def err_no_accessor_for_property : Error > def error_cannot_find_suitable_accessor : Error< >"cannot find suitable %select{getter|setter}0 for property %1">; > > +def err_alignment_too_small : Error< > + "requested alignment must be %0 or greater">; > +def err_alignment_too_big : Error< > + "requested alignment must be %0 or smaller">; > def err_alignment_not_power_of_two : Error< >"requested alignment is not a power of 2">; > def err_alignment_dependent_typedef_name : Error< > > Modified: cfe/trunk/include/clang/Sema/Sema.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=285544=285543=285544=diff > == > --- cfe/trunk/include/clang/Sema/Sema.h (original) > +++ cfe/trunk/include/clang/Sema/Sema.h Mon Oct 31 00:37:48 2016 > @@ -9719,6 +9719,7 @@ public: > > private: >bool SemaBuiltinPrefetch(CallExpr *TheCall); > + bool SemaBuiltinAllocaWithAlign(CallExpr *TheCall); >bool SemaBuiltinAssume(CallExpr *TheCall); >bool SemaBuiltinAssumeAligned(CallExpr *TheCall); >bool SemaBuiltinLongjmp(CallExpr *TheCall); > > Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=285544=285543=285544=diff > == > --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Mon Oct 31 00:37:48 2016 > @@ -1147,6 +1147,19 @@ RValue CodeGenFunction::EmitBuiltinExpr( > AI->setAlignment(SuitableAlignmentInBytes); > return RValue::get(AI); >} > + > + case Builtin::BI__built
r285544 - Add support for __builtin_alloca_with_align
Author: majnemer Date: Mon Oct 31 00:37:48 2016 New Revision: 285544 URL: http://llvm.org/viewvc/llvm-project?rev=285544=rev Log: Add support for __builtin_alloca_with_align __builtin_alloca always uses __BIGGEST_ALIGNMENT__ for the alignment of the allocation. __builtin_alloca_with_align allows the programmer to specify the alignment of the allocation. This fixes PR30658. Added: cfe/trunk/test/Sema/builtin-alloca-with-align.c Modified: cfe/trunk/include/clang/Basic/Builtins.def cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/include/clang/Sema/Sema.h cfe/trunk/lib/CodeGen/CGBuiltin.cpp cfe/trunk/lib/Sema/SemaChecking.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp cfe/trunk/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp cfe/trunk/test/CodeGen/builtins-ms.c Modified: cfe/trunk/include/clang/Basic/Builtins.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Builtins.def?rev=285544=285543=285544=diff == --- cfe/trunk/include/clang/Basic/Builtins.def (original) +++ cfe/trunk/include/clang/Basic/Builtins.def Mon Oct 31 00:37:48 2016 @@ -512,6 +512,7 @@ BUILTIN(__builtin_unreachable, "v", "nr" BUILTIN(__builtin_shufflevector, "v." , "nc") BUILTIN(__builtin_convertvector, "v." , "nct") BUILTIN(__builtin_alloca, "v*z" , "Fn") +BUILTIN(__builtin_alloca_with_align, "v*zIz", "Fn") BUILTIN(__builtin_call_with_static_chain, "v.", "nt") // "Overloaded" Atomic operator builtins. These are overloaded to support data Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=285544=285543=285544=diff == --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Oct 31 00:37:48 2016 @@ -2440,6 +2440,10 @@ def err_no_accessor_for_property : Error def error_cannot_find_suitable_accessor : Error< "cannot find suitable %select{getter|setter}0 for property %1">; +def err_alignment_too_small : Error< + "requested alignment must be %0 or greater">; +def err_alignment_too_big : Error< + "requested alignment must be %0 or smaller">; def err_alignment_not_power_of_two : Error< "requested alignment is not a power of 2">; def err_alignment_dependent_typedef_name : Error< Modified: cfe/trunk/include/clang/Sema/Sema.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=285544=285543=285544=diff == --- cfe/trunk/include/clang/Sema/Sema.h (original) +++ cfe/trunk/include/clang/Sema/Sema.h Mon Oct 31 00:37:48 2016 @@ -9719,6 +9719,7 @@ public: private: bool SemaBuiltinPrefetch(CallExpr *TheCall); + bool SemaBuiltinAllocaWithAlign(CallExpr *TheCall); bool SemaBuiltinAssume(CallExpr *TheCall); bool SemaBuiltinAssumeAligned(CallExpr *TheCall); bool SemaBuiltinLongjmp(CallExpr *TheCall); Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=285544=285543=285544=diff == --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original) +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Mon Oct 31 00:37:48 2016 @@ -1147,6 +1147,19 @@ RValue CodeGenFunction::EmitBuiltinExpr( AI->setAlignment(SuitableAlignmentInBytes); return RValue::get(AI); } + + case Builtin::BI__builtin_alloca_with_align: { +Value *Size = EmitScalarExpr(E->getArg(0)); +Value *AlignmentValue = EmitScalarExpr(E->getArg(1)); +auto *AlignmentCI = cast(AlignmentValue); +unsigned Alignment = AlignmentCI->getZExtValue(); +const TargetInfo = getContext().getTargetInfo(); +unsigned AlignmentInBytes = Alignment / TI.getCharWidth(); +AllocaInst *AI = Builder.CreateAlloca(Builder.getInt8Ty(), Size); +AI->setAlignment(AlignmentInBytes); +return RValue::get(AI); + } + case Builtin::BIbzero: case Builtin::BI__builtin_bzero: { Address Dest = EmitPointerWithAlignment(E->getArg(0)); Modified: cfe/trunk/lib/Sema/SemaChecking.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=285544=285543=285544=diff == --- cfe/trunk/lib/Sema/SemaChecking.cpp (original) +++ cfe/trunk/lib/Sema/SemaChecking.cpp Mon Oct 31 00:37:48 2016 @@ -791,6 +791,10 @@ Sema::CheckBuiltinFunctionCall(FunctionD if (SemaBuiltinPrefetch(TheCall)) return ExprError(); break; + case Builtin::BI__builtin_alloca_with_align: +if (SemaBuiltinAllocaWithAlign(TheCall)) + return ExprError(); +break; case Builtin::BI__assume: case