freenode/#clasp - IRC Chatlog
Search
0:16:58
drmeister
../../src/core/compiler.cc:872:core__call_with_variable_bound The thunk is NOT a Function object!!!!! thunk.raw_() = 0x7ffcb0d263e5
0:18:22
drmeister
It might be a linux thing - but that doesn't really tell me anything - so I'm focusing on what's going on in the docker image. I have gdb installed and emacs - so I can work with it like a linux box.
0:19:24
drmeister
Yeah - the low bits #B101 - I see both 0x5 and 0xd in the last byte - both are consistent with a vaslist tagged pointer.
0:20:33
drmeister
Did I have to convert a regular pointer to a tagged pointer somewhere and assumed that if it's on the stack it's a vaslist? That's what this smells like.
0:28:25
drmeister
This is being done by the code generated by cleavir - right? It's invoking call-with-variable-bound with the symbol, the value and the thunk.
0:37:15
drmeister
Neat! I'm in the docker image, I installed emacs, I installed gdb. I'm debugging clasp with gdb and put a break on the return from cc_stack_enclose and I caught it returning a vaslist pointer!
0:39:23
drmeister
It's tagged with a vaslist tag. cc_stack_enclose should never return a tagged vaslist pointer.
0:39:44
Bike
er, i meant, "what process is undergone to give the result of cc_stack_enclose its tag"
0:40:26
drmeister
It's this line: https://github.com/clasp-developers/clasp/blob/dev/src/llvmo/intrinsics.cc#L390
1:52:06
drmeister
If it writes the header at rdi 0x7fff5b6206f4 then it will write the object at that +8 and then add 0x1 to the object start and return that as the pointer.
1:52:56
Bike
so we just need to change the... uh... i don't know. i think the memory is just from an alloca-i8*
1:53:30
drmeister
Yeah - the alloca instruction has an alignment argument - hang on - how does that work.
1:55:47
Bike
https://github.com/clasp-developers/clasp/blob/dev/src/lisp/kernel/cleavir/translate-instruction.lisp#L257
1:57:29
drmeister
Here is the alloca-i8 instruction ... https://github.com/clasp-developers/clasp/blob/dev/src/lisp/kernel/cleavir/ir.lisp#L97
2:02:02
drmeister
That calls this... https://github.com/clasp-developers/clasp/blob/dev/src/lisp/kernel/cleavir/ir.lisp#L72
2:04:24
drmeister
It's part of the llvm-ir instruction, but the IRBuilder call doesn't have an alignment argument.
2:04:40
drmeister
http://llvm.org/doxygen/classllvm_1_1IRBuilder.html#a6b59bf56f046cb7c408fb2e6c083f2eb
2:05:14
Bike
"Create an assume intrinsic call that represents an alignment assumption on the provided pointer. " oh this sounds super annoying
2:10:15
drmeister
Maybe I shouldn't be alloca'ing i8's - really i64's are more appropriate - but still - it should let me indicate the alignment somehow.
2:12:40
drmeister
Still - how do you connect the constraint to the alloca? Just do one after the other? That smells like spooky action-at-a-distance.
2:14:01
Bike
it's really dumb how llvm doesn't have real documentation for the actual api, just the text format
2:17:06
drmeister
I could create the AllocaInst directly - it has a constructor that takes alignment
2:24:45
drmeister
There are six constructors for AllocInst, three pairs where each pair takes either an instruction to insert before or a BasicBlock to insert at the end of.
2:26:24
drmeister
All six of the constructors bottom out on the one that takes alignment. The four that don't take alignment set it to 0 by default.
2:29:12
drmeister
This is from the llvm reference, talking about globals. There is similar prose for functions. Maybe it applies to alloca
2:29:12
drmeister
An explicit alignment may be specified for a global, which must be a power of 2. If not present, or if the alignment is set to zero, the alignment of the global is set by the target to whatever it feels convenient. If an explicit alignment is specified, the global is forced to have exactly that alignment.
2:31:13
drmeister
Yeah - this is how it's supposed to be done. The IRBuilder is just a porcelain for creating instructions.
2:32:44
drmeister
That's the code for IRBuilder::CreateAlloca - it's calling one of the constructors that doesn't explicitly take Align.
2:38:30
drmeister
Since the alignment of alloca's is currently left up to whatever llvm's tiny little brain wants it to be I'm going to create a new create-alloca-aligned instruction and switch everything to that. I don't want this to come up again.
2:39:57
drmeister
They are fascinating. He buys and opens and sometimes eats military rations from through the last century.
2:41:21
drmeister
Here's one where he's tries a British Emergency Ration from the 1899 Boer conflict. https://www.youtube.com/watch?v=jZoHuMwZwTk
2:58:42
drmeister
compnerd (who I met at the llvm meeting) says we can call setAlignment on the result of CreateAlloca
3:15:46
drmeister
I pushed the changes - so the buildbot has picked it up and will build the docker image. It will be 1h25m and then I can test it.
4:02:18
drmeister
NASA came out with a static analyzer for C++ https://www.reddit.com/r/C_Programming/comments/a5a5nc/ikos_21_an_open_source_static_analyzer_for_c_and_c/
4:23:52
drmeister
This is really starting to annoy me: ;;; Warning: compiled-function-file expected a function as argument - but it got NIL - there may not be any backtrace available
4:24:46
drmeister
Ok. The warning that is annoying me can be fixed now that we have call-with-backtrace
4:25:45
Bike
oh, i see. i forgot the no-applicable-methods case because we don't memoize it. i can fix that easily.
4:26:53
drmeister
So - clasp can dispatch on specialized types like core:simple-vector-double but the Common Lisp standard only allows specializing on 'vector - is that a problem?
6:04:41
drmeister
Now we have nice, clean backtraces. Coming soon to the docker image - (like 1.5 hours).