r314226 - Sema: Windows/ARM __va_start is not const correct

David Majnemer via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 26 11:10:20 PDT 2017


Shouldn't you only loosen the check for things targeting the Windows SDK?
GNU platforms shouldn't need this.

On Tue, Sep 26, 2017 at 10:44 AM, Saleem Abdulrasool via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: compnerd
> Date: Tue Sep 26 10:44:10 2017
> New Revision: 314226
>
> URL: http://llvm.org/viewvc/llvm-project?rev=314226&view=rev
> Log:
> Sema: Windows/ARM __va_start is not const correct
>
> The `__va_start` intrinsic for Windows ARM does not account for const
> correctness when performing a check.  All local qualifiers are ignored
> when validating the invocation.  This was exposed by building the swift
> stdlib against the Windows 10586 SDK for ARM.  Simply expand out the
> check for the two parameters and ignore the qualifiers for the check.
>
> Modified:
>     cfe/trunk/lib/Sema/SemaChecking.cpp
>     cfe/trunk/test/SemaCXX/microsoft-varargs.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaChecking.cpp?rev=314226&r1=314225&r2=314226&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaChecking.cpp Tue Sep 26 10:44:10 2017
> @@ -3943,23 +3943,33 @@ bool Sema::SemaBuiltinVAStartARM(CallExp
>    if (checkVAStartIsInVariadicFunction(*this, Func))
>      return true;
>
> -  const struct {
> -    unsigned ArgNo;
> -    QualType Type;
> -  } ArgumentTypes[] = {
> -    { 1, Context.getPointerType(Context.CharTy.withConst()) },
> -    { 2, Context.getSizeType() },
> -  };
> -
> -  for (const auto &AT : ArgumentTypes) {
> -    const Expr *Arg = Call->getArg(AT.ArgNo)->IgnoreParens();
> -    if (Arg->getType().getCanonicalType() == AT.Type.getCanonicalType())
> -      continue;
> -    Diag(Arg->getLocStart(), diag::err_typecheck_convert_incompatible)
> -      << Arg->getType() << AT.Type << 1 /* different class */
> -      << 0 /* qualifier difference */ << 3 /* parameter mismatch */
> -      << AT.ArgNo + 1 << Arg->getType() << AT.Type;
> -  }
> +  // __va_start on Windows does not validate the parameter qualifiers
> +
> +  const Expr *Arg1 = Call->getArg(1)->IgnoreParens();
> +  const Type *Arg1Ty = Arg1->getType().getCanonicalType().getTypePtr();
> +
> +  const Expr *Arg2 = Call->getArg(2)->IgnoreParens();
> +  const Type *Arg2Ty = Arg2->getType().getCanonicalType().getTypePtr();
> +
> +  const QualType &ConstCharPtrTy =
> +      Context.getPointerType(Context.CharTy.withConst());
> +  if (!Arg1Ty->isPointerType() ||
> +      Arg1Ty->getPointeeType().withoutLocalFastQualifiers() !=
> Context.CharTy)
> +    Diag(Arg1->getLocStart(), diag::err_typecheck_convert_incompatible)
> +        << Arg1->getType() << ConstCharPtrTy
> +        << 1 /* different class */
> +        << 0 /* qualifier difference */
> +        << 3 /* parameter mismatch */
> +        << 2 << Arg1->getType() << ConstCharPtrTy;
> +
> +  const QualType SizeTy = Context.getSizeType();
> +  if (Arg2Ty->getCanonicalTypeInternal().withoutLocalFastQualifiers() !=
> SizeTy)
> +    Diag(Arg2->getLocStart(), diag::err_typecheck_convert_incompatible)
> +        << Arg2->getType() << SizeTy
> +        << 1 /* different class */
> +        << 0 /* qualifier difference */
> +        << 3 /* parameter mismatch */
> +        << 3 << Arg2->getType() << SizeTy;
>
>    return false;
>  }
>
> Modified: cfe/trunk/test/SemaCXX/microsoft-varargs.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> SemaCXX/microsoft-varargs.cpp?rev=314226&r1=314225&r2=314226&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/SemaCXX/microsoft-varargs.cpp (original)
> +++ cfe/trunk/test/SemaCXX/microsoft-varargs.cpp Tue Sep 26 10:44:10 2017
> @@ -20,3 +20,8 @@ int builtin(int i, ...) {
>    return __builtin_va_arg(ap, int);
>  }
>
> +void test___va_start_ignore_const(const char *format, ...) {
> +  va_list args;
> +  ((void)(__va_start(&args, (&const_cast<char &>(reinterpret_cast<const
> volatile char &>(format))), ((sizeof(format) + 4 - 1) & ~(4 - 1)),
> (&const_cast<char &>(reinterpret_cast<const volatile char &>(format))))));
> +}
> +
>
>
> _______________________________________________
> 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/20170926/9b14ad90/attachment-0001.html>


More information about the cfe-commits mailing list