From 98ef61e9cca792808ccf72dcca8a9dadf38b1ded Mon Sep 17 00:00:00 2001 From: Michal Shalev Date: Sun, 30 Jun 2024 17:30:29 +0300 Subject: [PATCH] GTEST: reduce stack frame size in gtest macros --- test/gtest/common/googletest/gtest-param-test.h | 15 +++++++++++---- test/gtest/common/test.h | 12 +++++++----- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/test/gtest/common/googletest/gtest-param-test.h b/test/gtest/common/googletest/gtest-param-test.h index 3bd14a67f52..d7029ab8708 100644 --- a/test/gtest/common/googletest/gtest-param-test.h +++ b/test/gtest/common/googletest/gtest-param-test.h @@ -457,6 +457,11 @@ internal::CartesianProductHolder 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 \ gtest_##prefix##test_suite_name##_EvalGenerator_() { \ @@ -478,9 +483,8 @@ internal::CartesianProductHolder Combine(const Generator&... g) { ::testing::internal::DefaultParamName, \ 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, \ @@ -488,7 +492,10 @@ internal::CartesianProductHolder Combine(const Generator&... g) { ->AddTestSuiteInstantiation( \ #prefix, >est_##prefix##test_suite_name##_EvalGenerator_, \ >est_##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_ diff --git a/test/gtest/common/test.h b/test/gtest/common/test.h index a50341a4e5e..6a50069311f 100644 --- a/test/gtest/common/test.h +++ b/test/gtest/common/test.h @@ -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, \ "", "", \ @@ -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()