Skip to content

Case 112: LP64 โ†’ ILP64 integer-model switch (oneMKL MKL_INT 32โ†’64)

Field Value
Verdict ๐Ÿ”ด BREAKING
Category Breaking
Platforms Linux
Flags ABI break
Detected ChangeKinds integer_model_changed
Source files examples/case112_lp64_ilp64/

Category: Binary ABI break / numerical-library ABI hazard | Verdict: ๐Ÿ”ด BREAKING

What changed

v1 is the LP64 interface: MKL_INT is int (32-bit). v2 is the ILP64 interface: MKL_INT is long (64-bit). Every public entry point that takes a dimension, stride, or count โ€” and the functions that return one โ€” flips its integer width at the same time. The function names are unchanged (they are extern "C"), so a consumer linked against the LP64 build resolves the ILP64 symbols at load time but passes/reads integers with the wrong width: array indices and lengths are silently truncated or sign-extended.

This is the highest-value numerical-library ABI hazard: for example oneMKL ships both interfaces and they are not interchangeable.

How abicheck catches it

integer_model_changed fires because a large fraction of public integer parameters/returns flip width together and the MKL_INT integer typedef changes its underlying size (int โ†’ long), which is the signature of an LP64โ†”ILP64 switch. Individual func_params_changed / func_return_changed findings are still reported per symbol; the grouped diagnostic names the root cause.

Files

  • v1.h / v2.h โ€” the LP64 and ILP64 header versions
  • v1.c / v2.c โ€” the two library builds
  • app.c โ€” consumer built against the LP64 interface

Source files

  • CMakeLists.txt
  • app.c
  • v1.c
  • v1.h
  • v2.c
  • v2.h

See also: Examples overview ยท All BREAKING cases ยท Category: Breaking.