Re: r285544 - Add support for __builtin_alloca_with_align

2016-10-31 Thread David Majnemer via cfe-commits
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

2016-10-31 Thread Hal Finkel via cfe-commits
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

2016-10-30 Thread David Majnemer via cfe-commits
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