Hello,

If you go into your LLVM IR dump and look at the place where the function
is defined, you'll see a reference to an attribute set, e.g.

  define void @main.foo(i8* nest %nest.1) #0 !dbg !16 {

Here "#0" refers to this attribute set (appearing later in the dump):

attributes #0 = { "disable-tail-calls"="true" "frame-pointer"="none"
"null-pointer-is-valid"="true" "split-stack" "target-cpu"="x86-64"
"target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" }

One of these attributes is "split-stack". When this attribute is set, the
LLVM back end will emit a stack check in the prolog with a call to expand
the stack if needed.

You can find this code at

https://github.com/llvm/llvm-project/blob/25bb61649085c0a6e66630bbffe7faa54cd67829/llvm/lib/CodeGen/PrologEpilogInserter.cpp#L1128

Hope this helps.

Thanks, Than

On Wed, Jun 23, 2021 at 11:11 PM Kavindu Gimhan Zoysa <kavindu...@gmail.com>
wrote:

> Hi Kurtis,
>
> Thank you for your input.
>
> I am searching how do languages handle stack overflow. Languages like
> rust, handle this by catching SIGSEGV. In golang, as I found, it was
> handled by increasing the stack[1], [2] (Sorry if my terms are wrong). I
> have generated object dump(objdump -d) for go source code (just a function
> call) I can see that at the beginning of every function call it checks for
> the stack overflow and try to increase the stack(see //go:nosplit section
> of [2]). I am lloking how does gollvm handle this.
>
> *00000000004871a0 <main.foo>:*
> *  4871a0: 64 48 8b 0c 25 f8 ff mov    %fs:0xfffffffffffffff8,%rcx*
> *  4871a7: ff ff *
> *  4871a9: 48 8d 44 24 f8        lea    -0x8(%rsp),%rax*
> *  4871ae: 48 3b 41 10                  cmp    0x10(%rcx),%rax*
> *  4871b2: 0f 86 e1 00 00 00    jbe    487299 <main.foo+0xf9>*
> *                                                ........*
> *  487299: e8 62 80 fc ff                callq  44f300
> <runtime.morestack_noctxt>*
> *  48729e: e9 fd fe ff ff                jmpq   4871a0 <main.foo>*
>
> [1]:
> https://github.com/golang/go/blob/02ab8d1a1dc82ce019969221313bfa28911f54a1/src/runtime/stack.go#L28
> [2]: https://dave.cheney.net/2018/01/08/gos-hidden-pragmas
> On Thursday, 24 June 2021 at 08:17:33 UTC+5:30 Kurtis Rader wrote:
>
>> This might be an XY Problem <https://xyproblem.info/>, or your question
>> simply needs more context. Your sample program is an example of infinite
>> recursion. How that is detected is platform specific. It might be done via
>> a special signal. Or it might be done by a syscall to grow the stack
>> returning an error. So my question is, why are you asking how infinite
>> recursion is handled?
>>
>> On Wed, Jun 23, 2021 at 7:33 PM Kavindu Gimhan Zoysa <kavin...@gmail.com>
>> wrote:
>>
>>> Hi all,
>>>
>>> *package main*
>>>
>>> *func main() {*
>>> * foo()*
>>> *}*
>>>
>>> *func foo() {*
>>> * a := 5*
>>> * _ = a*
>>> * foo()*
>>> *}*
>>>
>>> I have generated the below llvm ir using the command `./bin/llvm-goc -S
>>> test.go -dump-ir`. I expected there are some llvm intrinsics that have been
>>> used to handle stack overflow. But it is not there. How does gollvm handle
>>> stackoverflow?
>>>
>>> *define void @main.main(i8* nest %nest.0) #0 !dbg !14 {*
>>> *entry:*
>>> *  call void @main.foo(i8* nest undef), !dbg !15*
>>> *  ret void*
>>> *}*
>>>
>>> *define void @main.foo(i8* nest %nest.1) #0 !dbg !16 {*
>>> *entry:*
>>> *  %a = alloca i64, align 8*
>>> *  %0 = bitcast i64* %a to i8**
>>> *  call void @llvm.lifetime.start.p0i8(i64 8, i8* %0)*
>>> *  store i64 5, i64* %a, align 8*
>>> *  call void @llvm.dbg.declare(metadata i64* %a, metadata !17, metadata
>>> !DIExpression()), !dbg !20*
>>> *  %a.ld.0 = load i64, i64* %a, align 8, !dbg !21*
>>> *  call void @main.foo(i8* nest undef), !dbg !22*
>>> *  %1 = bitcast i64* %a to i8**
>>> *  call void @llvm.lifetime.end.p0i8(i64 8, i8* %1)*
>>> *  ret void*
>>> *}*
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "golang-nuts" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to golang-nuts...@googlegroups.com.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/golang-nuts/0bbb1347-5ceb-4ed2-9622-cb695d29bc6dn%40googlegroups.com
>>> <https://groups.google.com/d/msgid/golang-nuts/0bbb1347-5ceb-4ed2-9622-cb695d29bc6dn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>
>>
>> --
>> Kurtis Rader
>> Caretaker of the exceptional canines Junior and Hank
>>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/53de3903-83a2-4b31-b73d-4d46504ca28cn%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/53de3903-83a2-4b31-b73d-4d46504ca28cn%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CA%2BUr55FYWC3UcCLLzz3Rzyfi5GU6viyEEmo2%3DFiKWk5Y%3Dqtbmw%40mail.gmail.com.

Reply via email to