Timm =?utf-8?q?Bäder?= <[email protected]>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/[email protected]>
================
@@ -2524,14 +2315,28 @@ static bool interp__builtin_object_size(InterpState &S,
CodePtr OpPC,
if (Call->getArg(0)->HasSideEffects(ASTCtx)) {
// "If there are any side effects in them, it returns (size_t) -1
// for type 0 or 1 and (size_t) 0 for type 2 or 3."
- pushInteger(S, Kind <= 1 ? -1 : 0, Call->getType());
+ pushInteger(S, Kind <= 1 ? (size_t)-1 : (size_t)0, Call->getType());
return true;
}
- if (auto Result = evaluateBuiltinObjectSize(ASTCtx, Kind, Ptr)) {
+ if (auto Result = evaluateBuiltinObjectSize(ASTCtx, Kind, Ptr,
+ Call->getArg(0), IsDynamic)) {
pushInteger(S, *Result, Call->getType());
return true;
}
+
+ switch (S.EvalMode) {
+ case EvaluationMode::ConstantExpression:
+ case EvaluationMode::ConstantFold:
+ case EvaluationMode::IgnoreSideEffects:
+ // Leave it to IR generation.
+ return Invalid(S, OpPC);
+ case EvaluationMode::ConstantExpressionUnevaluated:
+ // Reduce it to a constant now.
+ pushInteger(S, ((Kind & 2u) ? (size_t)0 : (size_t)-1), Call->getType());
----------------
tbaederr wrote:
Not sure what that is, this is just what the Kind/Type parameter to
`__builtin_object_size` is.
https://github.com/llvm/llvm-project/pull/213017
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits