[clang] 22bf7c5 - [clang][Interp] Support __builtin_os_log_format_buffer_size
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 19 21:38:56 PDT 2024
Author: Timm Bäder
Date: 2024-04-20T06:13:32+02:00
New Revision: 22bf7c5e01e869bbbb3b2da722e1a33e69e931d6
URL: https://github.com/llvm/llvm-project/commit/22bf7c5e01e869bbbb3b2da722e1a33e69e931d6
DIFF: https://github.com/llvm/llvm-project/commit/22bf7c5e01e869bbbb3b2da722e1a33e69e931d6.diff
LOG: [clang][Interp] Support __builtin_os_log_format_buffer_size
Added:
Modified:
clang/lib/AST/Interp/InterpBuiltin.cpp
clang/test/AST/Interp/builtin-functions.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/InterpBuiltin.cpp b/clang/lib/AST/Interp/InterpBuiltin.cpp
index f562f9e1cb19fb..565c85bc2e0c21 100644
--- a/clang/lib/AST/Interp/InterpBuiltin.cpp
+++ b/clang/lib/AST/Interp/InterpBuiltin.cpp
@@ -9,6 +9,7 @@
#include "Boolean.h"
#include "Interp.h"
#include "PrimType.h"
+#include "clang/AST/OSLog.h"
#include "clang/AST/RecordLayout.h"
#include "clang/Basic/Builtins.h"
#include "clang/Basic/TargetInfo.h"
@@ -1088,6 +1089,17 @@ static bool interp__builtin_is_aligned_up_down(InterpState &S, CodePtr OpPC,
return false;
}
+static bool interp__builtin_os_log_format_buffer_size(InterpState &S,
+ CodePtr OpPC,
+ const InterpFrame *Frame,
+ const Function *Func,
+ const CallExpr *Call) {
+ analyze_os_log::OSLogBufferLayout Layout;
+ analyze_os_log::computeOSLogBufferLayout(S.getCtx(), Call, Layout);
+ pushInteger(S, Layout.size().getQuantity(), Call->getType());
+ return true;
+}
+
bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F,
const CallExpr *Call) {
const InterpFrame *Frame = S.Current;
@@ -1409,6 +1421,11 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const Function *F,
return false;
break;
+ case Builtin::BI__builtin_os_log_format_buffer_size:
+ if (!interp__builtin_os_log_format_buffer_size(S, OpPC, Frame, F, Call))
+ return false;
+ break;
+
default:
S.FFDiag(S.Current->getLocation(OpPC),
diag::note_invalid_subexpr_in_const_expr)
diff --git a/clang/test/AST/Interp/builtin-functions.cpp b/clang/test/AST/Interp/builtin-functions.cpp
index 1a29a664d7ce54..0cbab1fcd91d09 100644
--- a/clang/test/AST/Interp/builtin-functions.cpp
+++ b/clang/test/AST/Interp/builtin-functions.cpp
@@ -633,3 +633,9 @@ void test7(void) {
X = CFSTR("foo", "bar"); // both-error {{too many arguments to function call}}
#endif
}
+
+/// The actual value on my machine is 22, but I have a feeling this will be
diff erent
+/// on other targets, so just checking for != 0 here. Light testing is fine since
+/// the actual implementation uses analyze_os_log::computeOSLogBufferLayout(), which
+/// is tested elsewhere.
+static_assert(__builtin_os_log_format_buffer_size("%{mask.xyz}s", "abc") != 0, "");
More information about the cfe-commits
mailing list