Skip to content

[cppinterop] Upgrade to latest for cppyy migration#22728

Open
aaronj0 wants to merge 7 commits into
root-project:masterfrom
aaronj0:cppinterop-upgrade
Open

[cppinterop] Upgrade to latest for cppyy migration#22728
aaronj0 wants to merge 7 commits into
root-project:masterfrom
aaronj0:cppinterop-upgrade

Conversation

@aaronj0

@aaronj0 aaronj0 commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Test and land the latest upgrade, required to rebase the cppyy migration PR on top

@aaronj0 aaronj0 requested a review from guitargeek June 29, 2026 12:18
@aaronj0 aaronj0 self-assigned this Jun 29, 2026
@github-actions

github-actions Bot commented Jun 29, 2026

Copy link
Copy Markdown

Test Results

    23 files      23 suites   3d 12h 10m 37s ⏱️
 3 874 tests  3 836 ✅   0 💤 38 ❌
78 801 runs  78 656 ✅ 107 💤 38 ❌

For more details on these failures, see this check.

Results for commit 3427288.

♻️ This comment has been updated with latest results.

@vgvassilev

Copy link
Copy Markdown
Member

@aaronj0, I believe we need to also move Box.h to ROOTSYS/etc

@aaronj0

aaronj0 commented Jun 29, 2026

Copy link
Copy Markdown
Contributor Author

@aaronj0, I believe we need to also move Box.h to ROOTSYS/etc

Yes, I have that obvious change and more patches in the pipeline.. (adapting to the new types, etc)
Will push all at once, when my local build is green

aaronj0 added 7 commits July 2, 2026 20:31
The latest CppInterOp upgrade introduces opaque-handle structs Cpp::ObjectRef, Cpp::DeclRef, and Cpp::InterpRef (CppInterOpTypes.h) to replace void*/typedef pointer arguments.
The latest CppInterOp upgrade changes UseExternalInterpreter
to also install a CppInteropDiagConsumer onto Cling's DiagnosticsEngine.
Rootcling later wraps the current diag client with CheckModuleBuildClient via
DiagnosticsEngine::setClient which deletes CppInterOp's previously-owned client.
This leads to CheckModuleBuildClient holding a dangling fChild pointer.

Without this patch, cling::Interpreter::ShutDown crashes. Since rootcling does not use CppInterOp, we can avoid registering the
interpreter with CppInterOp if we are running in rootcling.
In this test, the handle-taking pointer comes from dlsym at runtime, so
the compiler cannot see through it. Here the pointer is a compile-time
constant and GCC 11 exploits the type mismatch (which is UB) to constant-
fold the call giving a wrong reslt. Route the call through a volatile local so the
compiler treats the pointer as runtime-opaque, matching dispatch
… MSVC

Add __thiscall to the bitcast type on _M_IX86 so the caller reproduces the compiler's virtual-dispatch ABI
CreateInterpreter built ClingArgv from pointers of function-local strings
(main executable path, extracted resource dir, libc++ include dir,
CPPINTEROP_EXTRA_INTERPRETER_ARGS). But the interpreter keeps the raw argv
pointers for its whole lifetime (cling::CompilerOptions, analagous for
clang-repl), so asan reports accesses to them after CreateInterpreter returns.

Fix: Collect owned copies of every argument and store it as a part of
per-interpreter info, so it is released when DeleteInterpreter is called
@aaronj0 aaronj0 force-pushed the cppinterop-upgrade branch from 7fa2272 to 3427288 Compare July 2, 2026 18:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

2 participants