jank
jank copied to clipboard
Missing definitions for forward declarations
jank health check
jank(83888,0x1ef34e0c0) malloc: nano zone abandoned due to inability to reserve vm space.
─ system ───────────────────────────────────────────────────────────────────────────────────────────
─ ✅ operating system: macos
─ ✅ default triple: arm64-apple-darwin24.6.0
─ jank install ─────────────────────────────────────────────────────────────────────────────────────
─ ✅ jank version: jank-0.1-3030dd41153e206cac6010c5b5b376f9dcefc15e
─ ✅ jank assertions are enabled; performance will be impacted
─ ✅ jank resource dir: ../lib/jank/0.1 (not found)
─ ✅ jank resolved resource dir: /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/../lib/jank/0.1 (ignored for dev build)
─ ✅ jank user cache dir: /Users/shantanusardesai/.cache/jank/arm64-apple-darwin24.6.0-320ce541ee50e1892ec4607bc7683ce2d738eb4a7a77e4c0fcdd1b215ffa791d (not found)
─ ✅ jank pch path: /Users/shantanusardesai/.cache/jank/arm64-apple-darwin24.6.0-320ce541ee50e1892ec4607bc7683ce2d738eb4a7a77e4c0fcdd1b215ffa791d (found)
─ clang install ────────────────────────────────────────────────────────────────────────────────────
─ ✅ configured clang path: /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/llvm-install/usr/local/bin/clang++ (found)
─ ✅ configured clang resource dir: /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/llvm-install/usr/local/lib/clang/21 (found)
─ jank runtime ─────────────────────────────────────────────────────────────────────────────────────
─ ✅ jank runtime initialized
─ ✅ jank can jit compile c++
─ ✅ jank can jit compile llvm ir
Description of the issue with reproduction steps
Currently jank crashes if we only provide forward declarations but no actual definitions. This behaviour makes sense from the C++ perspective but should be handled more gracefully by jank.
user=> (cpp/raw "struct foo { void bar(); };")
user=> (cpp/.bar (cpp/foo)) ;; Boom!
Adding the error message printed before jank exits:
JIT session error: Symbols not found: [ __ZN3foo3barEv ]
Failure value returned from cantFail wrapped call
Failed to materialize symbols: { (main, { _user_cpp_member_call_8_0, _user_repl_fn_10_0, _user_jank_global_init_12, ___cf_1, $.user-user$user_cpp_member_call_8-13.__inits.0, ___cf_2, __ZN4jank7runtime7convertIvE11into_objectEv, ___cf_0, ____orc_init_func.user-user$user_cpp_member_call_8-13 }) }
UNREACHABLE executed at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/llvm-install/usr/local/include/llvm/Support/Error.h:779!
Additional details printed by the debugger:
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
frame #0: 0x0000000181382388 libsystem_kernel.dylib`__pthread_kill + 8
libsystem_kernel.dylib`__pthread_kill:
-> 0x181382388 <+8>: b.lo 0x1813823a8 ; <+40>
0x18138238c <+12>: pacibsp
0x181382390 <+16>: stp x29, x30, [sp, #-0x10]!
0x181382394 <+20>: mov x29, sp
Target 0: (jank) stopped.
Stack trace
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
* frame #0: 0x0000000181382388 libsystem_kernel.dylib`__pthread_kill + 8
frame #1: 0x00000001813bb88c libsystem_pthread.dylib`pthread_kill + 296
frame #2: 0x00000001812c4a3c libsystem_c.dylib`abort + 124
frame #3: 0x000000011125109c libLLVM.dylib`llvm::llvm_unreachable_internal(char const*, char const*, unsigned int) + 552
frame #4: 0x000000010030cfec jank`llvm::cantFail(Err=(Payload = 0x000060400021a450), Msg="Failure value returned from cantFail wrapped call\nFailed to materialize symbols: { (main, { _user_cpp_member_call_8_0, _user_repl_fn_10_0, _user_jank_global_init_12, ___cf_1, $.user-user$user_cpp_member_call_8-13.__inits.0, ___cf_2, __ZN4jank7runtime7convertIvE11into_objectEv, ___cf_0, ____orc_init_func.user-user$user_cpp_member_call_8-13 }) }") at Error.h:779:5
frame #5: 0x0000000101df431c jank`llvm::raw_ostream::operator<<(this=0x00000001022394f2, N=0) - 18446744069383175395
frame #6: 0x0000000101b8a518 jank`jank::evaluate::eval(expr=<unavailable>) at evaluate.cpp:598:25
frame #7: 0x0000000101b9b7e0 jank`jank::evaluate::eval(expr=jank::analyze::expr::cpp_member_call_ref @ 0x000000016fdfad70) at evaluate.cpp:759:25
frame #8: 0x0000000101c38b40 jank`_ZZN4jank8evaluate4evalEN3jtl3refINS_7analyze10expressionEEEENK3$_0clINS2_INS3_4expr15cpp_member_callEEEEEDaT_(this=0x000000016fdfb3e0, typed_ex=jtl::ref<jank::analyze::expr::cpp_member_call> @ 0x000000016fdfae08) at evaluate.cpp:273:52
frame #9: 0x0000000101b79828 jank`auto jank::analyze::visit_expr<jank::evaluate::eval(jtl::ref<jank::analyze::expression>)::$_0>(f=0x000000016fdfb3e0, e=jank::analyze::expression_ref @ 0x000000016fdfae40) at visit.hpp:101:16
frame #10: 0x0000000101b78e5c jank`jank::evaluate::eval(ex=jank::analyze::expression_ref @ 0x000000016fdfb4b8) at evaluate.cpp:273:5
frame #11: 0x0000000101217494 jank`jank::runtime::context::eval_string(this=0x000000010473dc00, code=0x000000016fdfcc90) at context.cpp:176:13
frame #12: 0x0000000101216778 jank`jank::runtime::context::eval_file(this=0x000000010473dc00, path=0x000000016fdfd8f0) at context.cpp:159:12
frame #13: 0x00000001000078f4 jank`jank::repl() at main.cpp:199:34
frame #14: 0x0000000100005544 jank`main::$_0::operator()(this=0x000000016fdfe060, argc=2, argv=0x000000016fdfeaa0) const at main.cpp:336:9
frame #15: 0x0000000100004fe0 jank`main::$_0::__invoke(argc=2, argv=0x000000016fdfeaa0) at main.cpp:293:60
frame #16: 0x00000001004703a4 jank`jank_init(argc=2, argv=0x000000016fdfeaa0, init_default_ctx='\0', fn=(jank`main::$_0::__invoke(int, char const**) at main.cpp:293)) at c_api.cpp:1000:14
frame #17: 0x0000000100003c08 jank`main(argc=2, argv=0x000000016fdfeaa0) at main.cpp:293:10
frame #18: 0x000000018101ab98 dyld`start + 6076
There's not much we can do about this right now, certainly not for the alpha. Clang gets into a bad state when JIT linking fails. This will ultimately need upstream Clang fixes to be as graceful as we want.