comparison auto/cc/sunc @ 9309:92e14ce71b72

Configure: adjusted optimization level for Sun C. With "-fast" (and with "-xbuiltin=%all -xO4"), Sun C miscompiles ngx_http_script_add_copy_code(), which is inlined into ngx_http_script_compile(). From the assembly code it looks like the code uses uninitialized register when calculating new p value after memcpy: movq %r15,%rdi call _memcpy leaq (%r15,rbx),%rax movq (%r12),%rbx movb $0x0000000000000000,(%rax) Note that %rax is set to (%r15 + %rbx), but %rbx is only set after it is used. As such, "*p = '\0'" tries to modify an unrelated memory address, leading to a segmentation fault. The issue was seen in tests which use null-terminated complex values: proxy_ssl_certificate_vars.t, uwsgi_ssl_certificate_vars.t, stream_proxy_ssl_certificate_vars.t. Tested with Sun C compilers from Sun Studio 12.3, 12.4, 12.5, and 12.6. Restructuring code, such as splitting ngx_cpymem() with a separate "p += value->len" increment, fixes things, but it is not clear if its the only place where such miscompilation can happen. Fix is to use "-fast -xO3". Since IPO requires "-xO5", it is commented out.
author Maxim Dounin <mdounin@mdounin.ru>
date Wed, 07 Aug 2024 03:56:23 +0300
parents d2b87352e5a7
children
comparison
equal deleted inserted replaced
9308:d2b87352e5a7 9309:92e14ce71b72
71 # optimizations 71 # optimizations
72 72
73 # 20736 == 0x5100, Sun Studio 12.1 73 # 20736 == 0x5100, Sun Studio 12.1
74 74
75 if [ "$ngx_sunc_ver" -ge 20736 ]; then 75 if [ "$ngx_sunc_ver" -ge 20736 ]; then
76 ngx_fast="-fast" 76 ngx_fast="-fast -xO3"
77 77
78 else 78 else
79 # older versions had problems with bit-fields 79 # older versions had problems with bit-fields
80 ngx_fast="-fast -xalias_level=any" 80 ngx_fast="-fast -xO3 -xalias_level=any"
81 fi 81 fi
82 82
83 IPO=-xipo 83 IPO=
84 #IPO=-xipo
85
84 CFLAGS="$CFLAGS $ngx_fast $IPO" 86 CFLAGS="$CFLAGS $ngx_fast $IPO"
85 CORE_LINK="$CORE_LINK $ngx_fast $IPO" 87 CORE_LINK="$CORE_LINK $ngx_fast $IPO"
86 88
87 89
88 case $CPU in 90 case $CPU in