@@ -13,70 +13,73 @@ include_guard(GLOBAL)
1313
1414message (CHECK_START "Checking for Zend memory manager alignment and log values" )
1515
16+ if (
17+ (NOT DEFINED ZEND_MM_EXITCODE OR NOT DEFINED ZEND_MM_EXITCODE__TRYRUN_OUTPUT)
18+ AND CMAKE_CROSSCOMPILING
19+ AND NOT CMAKE_CROSSCOMPILING_EMULATOR
20+ )
21+ # Set some sensible defaults when cross-compiling.
22+ set (ZEND_MM_EXITCODE 0)
23+ set (ZEND_MM_EXITCODE__TRYRUN_OUTPUT "(size_t)8 (size_t)3 0" )
24+ endif ()
25+
1626block()
17- if (NOT CMAKE_CROSSCOMPILING )
18- try_run (
19- ZEND_MM_RUN_RESULT
20- ZEND_MM_COMPILE_RESULT
21- SOURCE_FROM_CONTENT src.c [[
22- #include <stdio.h>
23- #include <stdlib.h>
24-
25- typedef union _mm_align_test {
26- void *ptr;
27- double dbl;
28- long lng;
29- } mm_align_test;
30-
31- #if (defined (__GNUC__) && __GNUC__ >= 2)
32- # define ZEND_MM_ALIGNMENT (__alignof__ (mm_align_test))
33- #else
34- # define ZEND_MM_ALIGNMENT (sizeof(mm_align_test))
35- #endif
36-
37- int main(void) {
38- size_t i = ZEND_MM_ALIGNMENT;
39- int zeros = 0;
40-
41- while (i & ~0x1) {
42- zeros++;
43- i = i >> 1;
44- }
45-
46- printf(
47- "(size_t)%zu (size_t)%d %d\n",
48- ZEND_MM_ALIGNMENT,
49- zeros,
50- ZEND_MM_ALIGNMENT < 4
51- );
52-
53- return 0;
27+ try_run (
28+ ZEND_MM_EXITCODE
29+ ZEND_MM_COMPILED
30+ SOURCE_FROM_CONTENT src.c [[
31+ #include <stdio.h>
32+ #include <stdlib.h>
33+
34+ typedef union _mm_align_test {
35+ void *ptr;
36+ double dbl;
37+ long lng;
38+ } mm_align_test;
39+
40+ #if (defined (__GNUC__) && __GNUC__ >= 2)
41+ # define ZEND_MM_ALIGNMENT (__alignof__ (mm_align_test))
42+ #else
43+ # define ZEND_MM_ALIGNMENT (sizeof(mm_align_test))
44+ #endif
45+
46+ int main(void)
47+ {
48+ size_t i = ZEND_MM_ALIGNMENT;
49+ int zeros = 0;
50+
51+ while (i & ~0x1) {
52+ zeros++;
53+ i = i >> 1;
5454 }
55- ]]
56- RUN_OUTPUT_STDOUT_VARIABLE ZEND_MM_OUTPUT
57- )
58-
59- if (ZEND_MM_RUN_RESULT EQUAL 0 AND ZEND_MM_COMPILE_RESULT)
60- message (CHECK_PASS "Success" )
61-
62- string (STRIP "${ZEND_MM_OUTPUT} " ZEND_MM_OUTPUT)
63- string (REPLACE " " ";" ZEND_MM_OUTPUT "${ZEND_MM_OUTPUT} " )
64-
65- list (GET ZEND_MM_OUTPUT 0 zend_mm_alignment)
66- list (GET ZEND_MM_OUTPUT 1 zend_mm_alignment_log2)
67- list (GET ZEND_MM_OUTPUT 2 zend_mm_need_eight_byte_realignment)
68- else ()
69- message (CHECK_FAIL "Failed" )
70- message (
71- FATAL_ERROR
72- "ZEND_MM alignment defines failed. Please, check CMake logs." )
73- endif ()
74- else ()
75- message (CHECK_FAIL "Using defaults (cross-compiling)" )
7655
77- set (zend_mm_alignment "(size_t)8" )
78- set (zend_mm_alignment_log2 "(size_t)3" )
79- set (zend_mm_need_eight_byte_realignment 0)
56+ printf(
57+ "(size_t)%zu (size_t)%d %d\n",
58+ ZEND_MM_ALIGNMENT,
59+ zeros,
60+ ZEND_MM_ALIGNMENT < 4
61+ );
62+
63+ return 0;
64+ }
65+ ]]
66+ RUN_OUTPUT_VARIABLE ZEND_MM_OUTPUT
67+ )
68+
69+ if (ZEND_MM_COMPILED AND ZEND_MM_EXITCODE EQUAL 0 AND ZEND_MM_OUTPUT)
70+ message (CHECK_PASS "Success" )
71+
72+ string (STRIP "${ZEND_MM_OUTPUT} " ZEND_MM_OUTPUT)
73+ string (REPLACE " " ";" ZEND_MM_OUTPUT "${ZEND_MM_OUTPUT} " )
74+
75+ list (GET ZEND_MM_OUTPUT 0 zend_mm_alignment)
76+ list (GET ZEND_MM_OUTPUT 1 zend_mm_alignment_log2)
77+ list (GET ZEND_MM_OUTPUT 2 zend_mm_need_eight_byte_realignment)
78+ else ()
79+ message (CHECK_FAIL "Failed" )
80+ message (
81+ FATAL_ERROR
82+ "ZEND_MM alignment defines failed. Please, check CMake logs." )
8083 endif ()
8184
8285 set (
0 commit comments