Commit 2f539596c for llama.cpp

commit 2f539596c6e9a977e91b6bc6344650422c6bc3b0
Author: Georgi Gerganov <ggerganov@gmail.com>
Date:   Mon Sep 14 13:03:41 2026 +0300

    ggml-cpu : disable PCH and fix CACHE_LINE_SIZE ambiguity to fix heap corruption (#28882)

    Disable the ggml-cpu precompiled header and remove the
    std::hardware_destructive_interference_size branch from CACHE_LINE_SIZE.

    The PCH force-includes ggml-impl.h before ops.h, which pulls in <new>
    via <array>/<vector> and defines __cpp_lib_hardware_interference_size.
    This makes the C++ kernels use CACHE_LINE_SIZE = 256 (hardware
    destructive interference size) while the C work-buffer sizing code in
    ggml-cpu.c always uses the fallback 64. The mismatch undersizes the
    rope work buffer by (CACHE_LINE_SIZE/4 - 16) * n_threads * 4 bytes,
    causing a heap-buffer-overflow that corrupts the heap and later crashes
    in ggml_compute_forward_rope_flt.

    Disabling the ggml-cpu PCH restores the natural include order so
    ops.h is processed before <new>, keeping CACHE_LINE_SIZE consistent.
    Removing the std::hardware_destructive_interference_size branch makes
    the value deterministic and include-order independent.

    ref: https://github.com/ggml-org/llama.cpp/issues/28858

    Assisted-by: pi:llama.cpp/DeepSeek-V4-Flash-Vision-Exp

diff --git a/ggml/src/ggml-cpu/CMakeLists.txt b/ggml/src/ggml-cpu/CMakeLists.txt
index 83088e147..1c7338eea 100644
--- a/ggml/src/ggml-cpu/CMakeLists.txt
+++ b/ggml/src/ggml-cpu/CMakeLists.txt
@@ -675,12 +675,6 @@ function(ggml_add_cpu_backend_variant_impl tag_name)
     target_compile_options(${GGML_CPU_NAME} PRIVATE ${ARCH_FLAGS})
     target_compile_definitions(${GGML_CPU_NAME} PRIVATE ${ARCH_DEFINITIONS})

-    if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT GGML_SYSTEM_ARCH STREQUAL "x86")
-        message(STATUS "Skipping PCH for ${GGML_CPU_NAME}: GCC PCH is only enabled for x86 (arch: ${GGML_SYSTEM_ARCH})")
-    else()
-        target_precompile_headers(${GGML_CPU_NAME} PRIVATE ggml-impl.h)
-    endif()
-
     if (EMSCRIPTEN)
         set_target_properties(${GGML_CPU_NAME} PROPERTIES COMPILE_FLAGS "-msimd128")
     endif()
diff --git a/ggml/src/ggml-cpu/ops.h b/ggml/src/ggml-cpu/ops.h
index ce2b3e870..2728b08b6 100644
--- a/ggml/src/ggml-cpu/ops.h
+++ b/ggml/src/ggml-cpu/ops.h
@@ -5,10 +5,10 @@
 //
 // cache line
 //
-
-#if defined(__cpp_lib_hardware_interference_size)
-#define CACHE_LINE_SIZE std::hardware_destructive_interference_size
-#else
+// TODO: rework CACHE_LINE_SIZE so std::hardware_destructive_interference_size
+// can be used consistently between C and C++ TUs; the previous macro form
+// diverged based on include order and undersized the work buffer.
+// ref: https://github.com/ggml-org/llama.cpp/pull/28882
 #if defined(__POWER9_VECTOR__)
 #define CACHE_LINE_SIZE 128
 #elif defined(__VXE__) || defined(__VXE2__)
@@ -16,17 +16,8 @@
 #else
 #define CACHE_LINE_SIZE 64
 #endif
-#endif

-// -Winterference-size was introduced in GCC 12
-#if defined(__cplusplus) && defined(__GNUC__) && !defined(__clang__) && __GNUC__ >= 12
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Winterference-size"
-#endif
 static const size_t CACHE_LINE_SIZE_F32 = CACHE_LINE_SIZE/sizeof(float);
-#if defined(__cplusplus) && defined(__GNUC__) && !defined(__clang__) && __GNUC__ >= 12
-#pragma GCC diagnostic pop
-#endif

 // Work buffer size for im2col operations in CONV2D
 #define GGML_IM2COL_WORK_SIZE (16 * 1024 * 1024)