Skip to content

Commit

Permalink
Merge pull request #10130 from michal-shalev/reduce-stack-frame-size-…
Browse files Browse the repository at this point in the history
…in-gtest-macros

GTEST: reduce stack frame size in gtest macros
  • Loading branch information
michal-shalev authored Sep 30, 2024
2 parents 13af469 + 98ef61e commit eb36149
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 9 deletions.
15 changes: 11 additions & 4 deletions test/gtest/common/googletest/gtest-param-test.h
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,11 @@ internal::CartesianProductHolder<Generator...> Combine(const Generator&... g) {
#define GTEST_GET_FIRST_(first, ...) first
#define GTEST_GET_SECOND_(first, second, ...) second

// Modified to reduce stack frame size per test file.
// The registration logic is moved to a separate function (gen_##prefix##test_suite_name)
// to minimize the complexity of static initialization.
// This defers execution of complex logic, reduces the initial stack frame,
// and prevents inlining, leading to a more efficient initialization process.
#define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, ...) \
static ::testing::internal::ParamGenerator<test_suite_name::ParamType> \
gtest_##prefix##test_suite_name##_EvalGenerator_() { \
Expand All @@ -478,17 +483,19 @@ internal::CartesianProductHolder<Generator...> Combine(const Generator&... g) {
::testing::internal::DefaultParamName<test_suite_name::ParamType>, \
DUMMY_PARAM_))))(info); \
} \
static int gtest_##prefix##test_suite_name##_dummy_ \
GTEST_ATTRIBUTE_UNUSED_ = \
::testing::UnitTest::GetInstance() \
int __attribute__((noinline)) gen_##prefix##test_suite_name() { \
return ::testing::UnitTest::GetInstance() \
->parameterized_test_registry() \
.GetTestSuitePatternHolder<test_suite_name>( \
#test_suite_name, \
::testing::internal::CodeLocation(__FILE__, __LINE__)) \
->AddTestSuiteInstantiation( \
#prefix, &gtest_##prefix##test_suite_name##_EvalGenerator_, \
&gtest_##prefix##test_suite_name##_EvalGenerateName_, \
__FILE__, __LINE__)
__FILE__, __LINE__); \
} \
static int gtest_##prefix##test_suite_name##_dummy_ \
GTEST_ATTRIBUTE_UNUSED_ = gen_##prefix##test_suite_name();

// Legacy API is deprecated but still available
#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_
Expand Down
12 changes: 7 additions & 5 deletions test/gtest/common/test.h
Original file line number Diff line number Diff line change
Expand Up @@ -287,11 +287,8 @@ class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public test_case_name
static ::testing::TestInfo* const test_info_;\
GTEST_DISALLOW_COPY_AND_ASSIGN_(\
GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
}; \
\
::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
::test_info_ = \
::testing::internal::MakeAndRegisterTestInfo( \
static ::testing::TestInfo* GTEST_NO_INLINE_ create_test_info() { \
return ::testing::internal::MakeAndRegisterTestInfo( \
#test_case_name, \
(num_threads == 1) ? #test_name : #test_name "/mt_" #num_threads, \
"", "", \
Expand All @@ -301,6 +298,11 @@ ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
test_case_name::TearDownTestCase, \
new ::testing::internal::TestFactoryImpl< \
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>); \
} \
}; \
\
::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
::test_info_ = create_test_info(); \
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::test_body()


Expand Down

0 comments on commit eb36149

Please sign in to comment.