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