r310905 - Avoid PointerIntPair of constexpr EvalInfo structs

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 28 17:02:04 PDT 2017


Feels like this alignment attribute may be a bit of a death trap, then?
Should other uses of the attribute be scrutinized, or could we come up with
a portable way to use it safely? (using a different attribute on different
compilers - sounded like maybe one form worked with MSVC and a different
form worked with GCC? Maybe the attribute could be improved to use those as
appropriate?)

On Mon, Aug 14, 2017 at 6:18 PM Reid Kleckner via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: rnk
> Date: Mon Aug 14 18:17:47 2017
> New Revision: 310905
>
> URL: http://llvm.org/viewvc/llvm-project?rev=310905&view=rev
> Log:
> Avoid PointerIntPair of constexpr EvalInfo structs
>
> They are stack allocated, so their alignment is not to be trusted.
> 32-bit MSVC only guarantees 4 byte stack alignment, even though alignof
> would tell you otherwise. I tried fixing this with __declspec align, but
> that apparently upsets GCC. Hopefully this version will satisfy all
> compilers.
>
> See PR32018 for some info about the mingw issues.
>
> Should supercede https://reviews.llvm.org/D34873
>
> Modified:
>     cfe/trunk/lib/AST/ExprConstant.cpp
>
> Modified: cfe/trunk/lib/AST/ExprConstant.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=310905&r1=310904&r2=310905&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)
> +++ cfe/trunk/lib/AST/ExprConstant.cpp Mon Aug 14 18:17:47 2017
> @@ -537,7 +537,7 @@ namespace {
>    /// rules.  For example, the RHS of (0 && foo()) is not evaluated.  We
> can
>    /// evaluate the expression regardless of what the RHS is, but C only
> allows
>    /// certain things in certain situations.
> -  struct LLVM_ALIGNAS(/*alignof(uint64_t)*/ 8) EvalInfo {
> +  struct EvalInfo {
>      ASTContext &Ctx;
>
>      /// EvalStatus - Contains information about the evaluation.
> @@ -977,24 +977,22 @@ namespace {
>    /// RAII object used to optionally suppress diagnostics and
> side-effects from
>    /// a speculative evaluation.
>    class SpeculativeEvaluationRAII {
> -    /// Pair of EvalInfo, and a bit that stores whether or not we were
> -    /// speculatively evaluating when we created this RAII.
> -    llvm::PointerIntPair<EvalInfo *, 1, bool> InfoAndOldSpecEval;
> -    Expr::EvalStatus Old;
> +    EvalInfo *Info;
> +    Expr::EvalStatus OldStatus;
> +    bool OldIsSpeculativelyEvaluating;
>
>      void moveFromAndCancel(SpeculativeEvaluationRAII &&Other) {
> -      InfoAndOldSpecEval = Other.InfoAndOldSpecEval;
> -      Old = Other.Old;
> -      Other.InfoAndOldSpecEval.setPointer(nullptr);
> +      Info = Other.Info;
> +      OldStatus = Other.OldStatus;
> +      Other.Info = nullptr;
>      }
>
>      void maybeRestoreState() {
> -      EvalInfo *Info = InfoAndOldSpecEval.getPointer();
>        if (!Info)
>          return;
>
> -      Info->EvalStatus = Old;
> -      Info->IsSpeculativelyEvaluating = InfoAndOldSpecEval.getInt();
> +      Info->EvalStatus = OldStatus;
> +      Info->IsSpeculativelyEvaluating = OldIsSpeculativelyEvaluating;
>      }
>
>    public:
> @@ -1002,8 +1000,8 @@ namespace {
>
>      SpeculativeEvaluationRAII(
>          EvalInfo &Info, SmallVectorImpl<PartialDiagnosticAt> *NewDiag =
> nullptr)
> -        : InfoAndOldSpecEval(&Info, Info.IsSpeculativelyEvaluating),
> -          Old(Info.EvalStatus) {
> +        : Info(&Info), OldStatus(Info.EvalStatus),
> +          OldIsSpeculativelyEvaluating(Info.IsSpeculativelyEvaluating) {
>        Info.EvalStatus.Diag = NewDiag;
>        Info.IsSpeculativelyEvaluating = true;
>      }
>
>
> _______________________________________________
> 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/20170829/da66ca10/attachment.html>


More information about the cfe-commits mailing list