freenode/#clasp - IRC Chatlog
Search
13:39:13
drmeister
Running arbitrary code on sbcl at compile time and keeping environments separated look like a huge problem.
13:40:40
drmeister
Bike can weigh in - he's been thinking about it the hardest - we have to redefine CL within CL.
13:40:42
Bike
and doing so is pretty involved. now, as far as i understand, if the host supported global environments it would be a lot easier
13:41:44
drmeister
beach: How long does it take to start up SICL with global environments within sbcl?
13:43:30
drmeister
So what about using SICL, with its first class global environments, to build cclasp?
13:44:26
drmeister
I think that's what it is - and if macros use macros - they are all clasp macros.
13:45:45
Bike
which SICL accomplishes by compiling everything to HIR, using a HIR-back-to-common-lisp translator, and then compiling that with the host compiler. right?
13:46:23
beach
The Common Lisp code is compiled and then "linked" to the first-class global environment.
13:48:47
Bike
if the host supported first class global environments, the code could be evaluated and compiled using the host evaluator/compiler directly with a special build environment, right?
13:52:36
Bike
so that part would be done in a clasp proto-lisp executable just smart enough to output and load LLVM
13:54:15
Bike
kind of the trick here is that a lot of the reason for cross compile would be, rather than build times (which are finicky), maintenance. right now we have bclasp, a full lisp compiler that is only used for building. a lot of code we don't really want to have
13:54:49
Bike
so if cross compiling means maintaining something like the HIR-to-CL it's less attractive as an alternative
13:55:25
Bike
but we're not really at the point of a final determination or anything, it's mostly that it's more work than it looked like. not unexpected.
13:56:59
Bike
the other thing beyond that is the question of how the code of the implementation (SICL or clasp) is actually organized
13:57:41
Bike
Like, as far as I understand, SICL has to compile a definition of every macro and every function used by a macro, in the host. Then it goes through again and compiles those things into fasls, in an environment with those definitions. right?
13:59:14
beach
Well, right now, SICL doesn't generate FASLs at all, but yes, something like that would have to be done I guess.
14:00:30
Bike
Actually I should probably look at how SBCL organizes its code... it has separate files like sxhash.lisp and target-sxhash.lisp, and i believe the former is compiled twice while the latter is only put in the product
14:03:20
beach
In the next step, it means create an instance of that instance. Now it's a SICL class represented as a host instance.
14:08:50
drmeister
We also have a time constraint. Currently (back of the envelope) we want to speed up something that is taking about an hour.
14:13:05
Bike
what i'm going to try to do, anyway, is first reorganize the code so that bclasp is separated from the LLVM bridge stuff we use in cclasp
14:13:17
Bike
and then maybe i'll look more into separating compile-time and run-time stuff as would be required for cross compiling
14:16:30
drmeister
Do you have new insight? Implement eval with Hir->CL and maintain a compilation environment?
14:16:56
Bike
maintaining a compilation environment has to be done for any kind of cross compiling of common lisp, i think
14:21:07
Bike
that i have to look more at. i don't totally understand what SICL is doing with the linking.
14:25:59
Bike
really, i want to go through the files to organize them for dependencies anyway. we do all kinds of stuff in a weird order.
14:56:50
beach
Trying to create a first-class global environment in the same way that I have been doing before.
14:59:42
beach
(let ((sicl-extrinsic-environment::*cache-p* t)) (make-instance 'sicl-extrinsic-environment:environment))
15:06:01
Bike
if i call sset-union with the same arguments that are causing an error in the backtrace, it doesn't signal an error
15:21:06
Bike
i'll start running that when i make cleavir changes, to make sure everything works... sorry about this.
15:23:10
Bike
i replaced it with cleavir-primop:multiple-value-call which assumes that its first argument is a function. which the special operator multiple-value-call should not do
15:24:08
Bike
So SICL has to provide some kind of definition for multiple-value-call, something like (defmacro multiple-value-call (function &rest arguments) `(cleavir-primop:multiple-value-call (coerce-to-function ,function) ,@arguments))
15:44:57
beach
By the way, the code in that system (sicl-extrinsic-environment) is basically the same as what you would need for Clasp.
16:20:03
Bike
drmeister: can we profile /easy/ compilations? like, i put in a bunch of inline definitions for cdar, second, etc., but there's a few dozen and each takes a few seconds, so overall it takes minutes
16:49:23
Bike
the only file in clasp/src/profiler is dot_sbclrc, it doesn't have any of those scripts you showed me.
16:56:09
drmeister
There is a way with dtrace to start timing when one function enters and stop when another enters - we can explore that.
1:14:47
drmeister
Ok - I can get the size of COMPILE'd functions in bytes - but it's a bit weird. The easiest thing would be to maintain a global thread-safe hash table with :test #'equal within which I associate function symbol (linux symbols) names with function sizes.
1:15:15
drmeister
Then disassemble can reference this to get the length of a function that you are trying to disassemble.
1:16:46
drmeister
Basically - if you COMPILE a function and then DISASSEMBLE it - you will get the disassembly of the function. Anything not COMPILE'd will give you the first 16 instructions and then you can ask for more.
1:18:57
drmeister
I think maybe if you load the bitcode of compile-file'd functions you will get this info.