blob: 0adff3c6601eddbc5aeca028bf89915467028097 [file] [log] [blame]
// Copyright 2024 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// PRESUBMIT_INTENTIONALLY_MISSING_INCLUDE_GUARD
#ifdef V8_CODEGEN_CODE_STUB_ASSEMBLER_MACROS_DEFINED
#error \
"Assembler macros already defined. Did you forget to #include \"src/codegen/undef-code-stub-assembler-macros.inc\" in a previous file?"
#endif
#define V8_CODEGEN_CODE_STUB_ASSEMBLER_MACROS_DEFINED 1
#ifdef DEBUG
#define CSA_CHECK(csa, x) (csa)->Check([&]() -> TNode<BoolT> { return x; }, #x)
#define CSA_CHECK_AT(csa, loc, x) \
(csa)->Check([&]() -> TNode<BoolT> { return x; }, #x, {}, loc)
#else
#define CSA_CHECK(csa, x) (csa)->FastCheck(x)
#define CSA_CHECK_AT(csa, loc, x) (csa)->FastCheck(x)
#endif
// This is a check that always calls into the runtime if it aborts.
// This also exits silently when --hole-fuzzing is enabled.
#define CSA_HOLE_SECURITY_CHECK(csa, x) \
(csa)->Check([&]() -> TNode<BoolT> { return x; }, #x)
#ifdef DEBUG
// CSA_DCHECK_ARGS generates an
// std::initializer_list<CodeStubAssembler::ExtraNode> from __VA_ARGS__. It
// currently supports between 0 and 2 arguments.
#define CSA_DCHECK_0_ARGS(...) {}
#define CSA_DCHECK_1_ARG(a, ...) {{a, #a}}
#define CSA_DCHECK_2_ARGS(a, b, ...) {{a, #a}, {b, #b}}
#define SWITCH_CSA_DCHECK_ARGS(a, b, FUNC, ...) FUNC(a, b)
#define CSA_DCHECK_ARGS(...) \
SWITCH_CSA_DCHECK_ARGS(__VA_ARGS__ __VA_OPT__(, ) CSA_DCHECK_2_ARGS, \
CSA_DCHECK_1_ARG, CSA_DCHECK_0_ARGS)
// CSA_DCHECK(csa, <condition>, <extra values to print...>)
#define CSA_DCHECK(csa, condition_node, ...) \
(csa)->Dcheck(condition_node, #condition_node, CSA_DCHECK_ARGS(__VA_ARGS__))
#define CSA_DCHECK_AT(csa, loc, condition_node, ...) \
(csa)->Dcheck(condition_node, #condition_node, CSA_DCHECK_ARGS(__VA_ARGS__), loc)
#define CSA_DCHECK_JS_ARGC_EQ(csa, expected) \
(csa)->Dcheck( \
[&]() -> TNode<BoolT> { \
const TNode<Word32T> argc = (csa)->UncheckedParameter<Word32T>( \
Descriptor::kJSActualArgumentsCount); \
return (csa)->Word32Equal( \
argc, (csa)->Int32Constant(i::JSParameterCount(expected))); \
}, \
"argc == " #expected, \
{{SmiFromInt32((csa)->UncheckedParameter<Int32T>( \
Descriptor::kJSActualArgumentsCount)), \
"argc"}})
#define CSA_DEBUG_INFO(name) \
{ #name, __FILE__, __LINE__ }
#define BIND(label) Bind(label, CSA_DEBUG_INFO(label))
#define TYPED_VARIABLE_DEF(type, name, ...) \
TVariable<UNPAREN(type)> name(CSA_DEBUG_INFO(name), __VA_ARGS__)
#define TYPED_VARIABLE_CONSTRUCTOR(name, ...) \
name(CSA_DEBUG_INFO(name), __VA_ARGS__)
#else // DEBUG
#define CSA_DCHECK(csa, ...) ((void)0)
#define CSA_DCHECK_AT(csa, ...) ((void)0)
#define CSA_DCHECK_JS_ARGC_EQ(csa, expected) ((void)0)
#define BIND(label) Bind(label)
#define TYPED_VARIABLE_DEF(type, name, ...) TVariable<UNPAREN(type)> name(__VA_ARGS__)
#define TYPED_VARIABLE_CONSTRUCTOR(name, ...) name(__VA_ARGS__)
#endif // DEBUG
#define TVARIABLE(...) EXPAND(TYPED_VARIABLE_DEF(__VA_ARGS__, this))
#define TVARIABLE_CONSTRUCTOR(...) \
EXPAND(TYPED_VARIABLE_CONSTRUCTOR(__VA_ARGS__, this))
#ifdef ENABLE_SLOW_DCHECKS
#define CSA_SLOW_DCHECK(csa, ...) \
if (v8_flags.enable_slow_asserts) { \
CSA_DCHECK(csa, __VA_ARGS__); \
}
#else
#define CSA_SLOW_DCHECK(csa, ...) ((void)0)
#endif
// Similar to SBXCHECK in C++, these become a CSA_CHECK in sandbox-enabled
// builds, otherwise a CSA_DCHECK.
#ifdef V8_ENABLE_SANDBOX
#define CSA_SBXCHECK(csa, ...) CSA_CHECK(csa, __VA_ARGS__)
#else
#define CSA_SBXCHECK(csa, ...) CSA_DCHECK(csa, __VA_ARGS__)
#endif