changeset 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 ebebc1d68046
files auto/cc/sunc
diffstat 1 files changed, 5 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/auto/cc/sunc
+++ b/auto/cc/sunc
@@ -73,14 +73,16 @@ MODULE_LINK="-G"
 # 20736 == 0x5100, Sun Studio 12.1
 
 if [ "$ngx_sunc_ver" -ge 20736 ]; then
-    ngx_fast="-fast"
+    ngx_fast="-fast -xO3"
 
 else
     # older versions had problems with bit-fields
-    ngx_fast="-fast -xalias_level=any"
+    ngx_fast="-fast -xO3 -xalias_level=any"
 fi
 
-IPO=-xipo
+IPO=
+#IPO=-xipo
+
 CFLAGS="$CFLAGS $ngx_fast $IPO"
 CORE_LINK="$CORE_LINK $ngx_fast $IPO"