freenode/#clasp - IRC Chatlog
Search
21:18:05
paulapatience[m]
Ok, so I'm trying to build a debug version of clasp with ./waf build_cboehm_d, but I get a compilation error. (I didn't distclean the directory since my previous (successful) compilation of nondebug clasp; should I have?)
21:18:05
paulapatience[m]
My changes to wscript, my wscript.config, and the compilation log (with -v): http://ix.io/2gFM
21:20:36
paulapatience[m]
Ok I figured the undefined functions might be the problem, but it's true that no other error is mentioned
21:22:02
paulapatience[m]
Perhaps I'll try compiling from a clean checkout then. But I am right in assuming that ./waf build_cboehm_d builds the debug version?
21:24:01
drmeister
./waf build_cboehm_d does build the debug version. It's quite slow and I hardly use it because it is so slow.
21:24:16
paulapatience[m]
(I don't have the lldb/assembly chops to debug the -O3 optimized release version)
21:25:57
paulapatience[m]
I'm going to have to go to the store for some groceries but I'll be back in a bit
21:43:26
drmeister
It's not even necessary - it's lazy initializers failing that were initialized when clasp started.
22:06:34
paulapatience[m]
So it would be a Linux-only problem? (though I seem to recall kpoeck having the same problem on macOS)
22:58:18
drmeister
I'm not sure. On linux it's a static constructor that shouldn't be needed but is being invoked because I'm including clasp headers that declare it.
22:58:57
drmeister
Static constructors are getting a big refresh by llvm11 - but that's not ready yet.
22:59:16
drmeister
Another idea would be to compile and link the code with Clasp and load the dynamic library.
23:00:45
paulapatience[m]
Compile and link the cxx code with clasp rather than clang, you mean? Clasp can do that?
23:03:44
drmeister
Right now we are taking a short-cut. We are compiling the demo code to bitcode. The .bc file in each directory
23:05:25
drmeister
Here we are kind of spoofing that. We are compiling a C++ file to bitcode and making it look like a clasp generated bitcode file. But it's not a perfect spoof because we compile C++ header files that are declaring static initializers.
23:06:19
drmeister
When we load the bitcode into clasp it compiles the bitcode to native code and links it against symbols that are already loaded.
23:07:02
drmeister
Maybe it's the code model. Maybe the symbols are more than 2GB away and they can't be linked?
23:07:36
drmeister
The linux JIT linker is being rewritten as we speak. By llvm11 this will be a lot easier.
23:07:54
drmeister
They are making the JIT linker work very much like the system linker. Right now everything is hacked together.
23:08:26
drmeister
That's my understanding. But it's informed by long discussions with Lang Hames - the developer of the new ORC JIT.
23:13:04
paulapatience[m]
ACTION sent a long message: < https://matrix.org/_matrix/media/r0/download/matrix.org/umdQtPUqjIZDjoLWKCOVkbUd >
23:16:08
paulapatience[m]
what command did you run to get that output? I can't seem to get the disassembly around frame #1
23:18:59
drmeister
It's putting 0x0 in %rax and then calling it two instructions later - that's crazy. So it makes me think the $0x0 should be an address that failed to link.
23:20:20
paulapatience[m]
I naively assumed that since we compile clasp with llvm we should debug it with lldb
23:20:28
drmeister
There's nothing wrong with calling 0x0 - until you get there and hit a page fault.
23:21:01
drmeister
Sure - but lldb needs to be installed on linux and I often don't take the trouble.
23:23:09
paulapatience[m]
I used to use gdb a lot when debugging microcontrollers a few years ago, but it's the kind of stuff you forget from lack of use...
23:25:33
drmeister
That's why I think the problem is linking. The linker should be putting an address in there.
23:35:49
drmeister
call void @_ZN3reg7type_idC2ERKSt9type_info(%"class.reg::type_id"* %1, %"class.std::type_info"* dereferenceable(16) bitcast (i8** @_ZTIN4core6Real_OE to %"class.std::type_info"*))
23:35:57
drmeister
Followed by %5 = call i64 @_ZN3reg17allocate_class_idERKNS_7type_idE(%"class.reg::type_id"* dereferenceable(8) %1)
23:40:43
paulapatience[m]
Ok those are the functions that we should be calling but that are called as 0 instead?
23:42:11
drmeister
There are only two calls, the first one seems to be to a reasonable address, the second one to 0x0
23:47:46
drmeister
Here's something interesting. When I compile it to an object file. A bunch of __cxx_global_var_init.xxx functions don't appear to generate code.
23:56:21
paulapatience[m]
I'm getting 0s for a bunch of other functions too, though. Is that normal?
0:01:49
paulapatience[m]
but the cxx_global_var_init ones are in the text section so I would imagine they don't get overridden. but i do not have much experience in this.
0:02:39
drmeister
I disassemble the startup function and it's full of 0x0 - it isn't linking at all.
0:06:41
drmeister
Lines 9, 14, 54 - You can search for $0x0,%rax and then see a call to *$rax right after that.
0:21:22
drmeister
I think the linking on linux is going to be broken until the JITLinker is completed for linux in llvm11
0:22:10
drmeister
I had this stuff working on linux at one point - but it's the hardest stuff to keep working - even though it's a signature feature of clasp.
0:23:42
drmeister
When we load bitcode - it needs to link the addresses in the native code generated from the bitcode to symbols in the executable - yes.
0:24:09
drmeister
We could use the system linker - but then we need to generate a clasp dynamic library to link against - we don't have that. We generate a clasp executable.
0:51:46
paulapatience[m]
You mentioned that the static initializers are already initialized when we call runStaticConstructorsDestructors (if I understood correctly). Would it be possible to disable the reinitialization somehow?
1:28:15
drmeister
No - because our static initializer is in the list of static initializers. It's just that we picked up a bunch more from header files.
2:31:12
Bike
fixup is called for effect, so it just needs to call fixup on value-old before returning it
2:47:52
Bike
you could just pass (lambda (object) (circle-subst object mapping)) to make-record-matcher
6:29:35
kpoeck
Loading #P""/Users/karstenpoeck/lisp/compiler/clasp-karsten/build/boehm/fasl/aclasp-boehm-bitcode/src/lisp/kernel/lsp/defstruct.faso""