clang and pcc also generates inline assembly instead of call/alloc.

gcc -E -o check-va-gcc.c check-va.c
gcc -S -o check-va-gcc.asm check-va.c
gcc -o check-va-gcc check-va.c

clang -E -o check-va-clang.c check-va.c
clang -S -o check-va-clang.asm check-va.c
clang -o check-va-clang check-va.c

pcc -E -o check-va-pcc.c check-va.c
pcc -S -o check-va-pcc.asm check-va.c
#pcc -o check-va-pcc check-va.c

../tcc -B.. -I.. -I../include -E -o check-va-tcc.c check-va.c
../tcc -B.. -I.. -I../include  -o check-va-tcc check-va.c
./check-va-gcc
./check-va-tcc


On Sat, Mar 29, 2014 at 9:38 PM, Domingo Alvarez Duarte
<mingo...@gmail.com>wrote:

> Asking gcc to generate assembler code from your test code I can see that
> gcc do not call/malloc any builtin it generates inline code so there is
> nothing to free.
> -----
> .file "check-va.c"
>  .text
> .type passdown, @function
> passdown:
> .LFB0:
>  .cfi_startproc
> pushq %rbp
> .cfi_def_cfa_offset 16
>  .cfi_offset 6, -16
> movq %rsp, %rbp
> .cfi_def_cfa_register 6
>  subq $48, %rsp
> movq %rdi, -40(%rbp)
>  movq %rsi, -48(%rbp)
> leaq -32(%rbp), %rax
>  movq -48(%rbp), %rdx
> movq (%rdx), %rcx
>  movq %rcx, (%rax)
> movq 8(%rdx), %rcx
>  movq %rcx, 8(%rax)
> movq 16(%rdx), %rdx
>  movq %rdx, 16(%rax)
> leaq -32(%rbp), %rdx
>  movq -40(%rbp), %rax
> movq %rdx, %rsi
>  movq %rax, %rdi
> call vprintf
>  movl %eax, -4(%rbp)
> movl -4(%rbp), %eax
>  leave
> .cfi_def_cfa 7, 8
> ret
> .cfi_endproc
> .LFE0:
> .size passdown, .-passdown
> .type myprintf, @function
> myprintf:
> .LFB1:
> .cfi_startproc
> pushq %rbp
>  .cfi_def_cfa_offset 16
> .cfi_offset 6, -16
> movq %rsp, %rbp
>  .cfi_def_cfa_register 6
> subq $224, %rsp
> movq %rsi, -168(%rbp)
>  movq %rdx, -160(%rbp)
> movq %rcx, -152(%rbp)
>  movq %r8, -144(%rbp)
> movq %r9, -136(%rbp)
>  testb %al, %al
> je .L3
>  movaps %xmm0, -128(%rbp)
> movaps %xmm1, -112(%rbp)
>  movaps %xmm2, -96(%rbp)
> movaps %xmm3, -80(%rbp)
>  movaps %xmm4, -64(%rbp)
> movaps %xmm5, -48(%rbp)
>  movaps %xmm6, -32(%rbp)
> movaps %xmm7, -16(%rbp)
> .L3:
> movq %rdi, -216(%rbp)
> movl $8, -200(%rbp)
>  movl $48, -196(%rbp)
> leaq 16(%rbp), %rax
>  movq %rax, -192(%rbp)
> leaq -176(%rbp), %rax
>  movq %rax, -184(%rbp)
> leaq -200(%rbp), %rdx
>  movq -216(%rbp), %rax
> movq %rdx, %rsi
>  movq %rax, %rdi
> call passdown
>  leave
> .cfi_def_cfa 7, 8
> ret
> .cfi_endproc
> .LFE1:
> .size myprintf, .-myprintf
> .section .rodata
> .LC1:
> .string "bla"
> .LC2:
> .string "%s %i %f\n"
>  .text
> .globl main
> .type main, @function
> main:
> .LFB2:
> .cfi_startproc
> pushq %rbp
>  .cfi_def_cfa_offset 16
> .cfi_offset 6, -16
> movq %rsp, %rbp
>  .cfi_def_cfa_register 6
> movsd .LC0(%rip), %xmm0
> movl $42, %edx
>  movl $.LC1, %esi
> movl $.LC2, %edi
>  movl $1, %eax
> call myprintf
>  movl $0, %eax
> popq %rbp
>  .cfi_def_cfa 7, 8
> ret
> .cfi_endproc
> .LFE2:
>  .size main, .-main
> .section .rodata
>  .align 8
> .LC0:
> .long 2576980378
> .long 1071225241
>  .ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
> .section .note.GNU-stack,"",@progbits
>
>
>
> On Sat, Mar 29, 2014 at 9:33 PM, Domingo Alvarez Duarte <
> mingo...@gmail.com> wrote:
>
>> Thanks for pointing it and show an example to test !
>>
>> Now going back to the original problem the original tcc implementation
>> leaks memory on:
>> ----
>> void *__va_copy(struct __va_list_struct *src)
>> {
>>     struct __va_list_struct *dest =
>>         (struct __va_list_struct *)malloc(sizeof(struct
>> __va_list_struct));
>>     *dest = *src;
>>     return dest;
>> }
>> ----
>>
>> And I'll continue investigating a way to make it work with fossil-scm for
>> the X86_64, the problem that I saw is that there is a double free when the
>> process fork somehow the fossil compiled by tcc seem to not duplicate the
>> malloced strioneng and both the parent and child free the same string.
>>
>> Sounds crazy because the os should do that.
>>
>> Any idea on the memory leak and the process fork ?
>>
>> Again thanks for you time and attention !
>>
>>
>> On Sat, Mar 29, 2014 at 5:53 PM, Michael Matz <matz....@frakked.de>wrote:
>>
>>> Hello,
>>>
>>>
>>> On Fri, 28 Mar 2014, Domingo Alvarez Duarte wrote:
>>>
>>>  I found that on X86_64 linux if I do not free the memory on __va_end(),
>>>> the
>>>> compiled fossil-scm server works, I suspect is something with the
>>>> fork/threads.---
>>>> void __va_end(struct __va_list_struct *ap)
>>>> {
>>>>     //free(ap);
>>>> }
>>>>
>>>> Cheers !
>>>>
>>>
>>> Errr.  I see you now fiddled with that on mob.  Commit c025478d7c03,
>>> rewriting va* to not use malloc.  That's completely wrong.  You've
>>> effectively changed the ABI of stdarg, and hence interoperability with
>>> every non-TCC compiler.  The public va_list on x86_64 _must_ be a pointer.
>>> To see it breaking try e.g. this:
>>>
>>> % cat vatest.c
>>> #include <stdio.h>
>>> #include <stdarg.h>
>>>
>>> static int passdown (const char *str, va_list ap)
>>> {
>>>   int ret;
>>>   va_list ap2;
>>>   va_copy (ap2, ap);
>>>   ret = vprintf (str, ap2);
>>>   va_end (ap2);
>>>   return ret;
>>> }
>>>
>>> static int myprintf (const char *str, ...)
>>> {
>>>   va_list ap;
>>>   va_start (ap, str);
>>>   passdown (str, ap);
>>>   va_end (ap);
>>> }
>>>
>>> int main ()
>>> {
>>>   myprintf ("%s %i %f\n", "bla", 42, 0.4);
>>>   return 0;
>>> }
>>>
>>> When executed it must print:
>>> bla 42 0.400000
>>>
>>> Before your patch it does, after your patch it prints garbage (on my
>>> system " 134514261 0.000000") (without the va_copy and ap2 it even just
>>> segfaults now, though strictly speaking that's invalid stdarg usage).
>>> Please revert.
>>>
>>> If you could please _discuss_ changes in parts you don't completely
>>> understand on the list before making nilly-willy changes?  Just because
>>> fossil-scm "works" after your patching doesn't mean much if you don't know
>>> _why_ fossil-scm didn't work before, and especially doesn't mean that the
>>> change was even correct.
>>>
>>>
>>> Ciao,
>>> Michael.
>>> _______________________________________________
>>> Tinycc-devel mailing list
>>> Tinycc-devel@nongnu.org
>>> https://lists.nongnu.org/mailman/listinfo/tinycc-devel
>>>
>>>
>>
>
_______________________________________________
Tinycc-devel mailing list
Tinycc-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to