Re: [Tinycc-devel] Tinycc from git still can't compile fossil-scm
First of all thanks for Daniel for the fix ! I followed the code on fossil-scm with printfs on va_start/va_end using the previous tcc stdargs implementation and it showed me that both the parent and child do va_end on the same pointer that's why the segfault. And as I looked on the generated code by gcc/clang/pcc all of then do not us alloc/call all is inlined so no problem of double free. So I'll not bother look any further on fossil-scm to find why it happens with the old tcc stdarg implementation. Thanks again for all of you for this great work ! On Sat, Mar 29, 2014 at 11:37 PM, Michael Matz matz@frakked.de wrote: Hi, On Sat, 29 Mar 2014, Domingo Alvarez Duarte wrote: clang and pcc also generates inline assembly instead of call/alloc. Yes. I haven't said the relevant stdarg functions have to use malloc. They just need to interoperate with what the ABI says (and that's passing by pointer). Daniel downthread is correct in that va_list itself doesn't have to be a pointer, that was merely TCCs way of fulfilling the ABI requirements. So he fixed it meanwhile, so I'm fine. The fossil-scm issue should still be investigated somewhen. TCCs old implementation of stdarg was conforming, so changing it to something else shouldn't affect any correctly written code (meaning that I'd suspect either some different bug in TCC that now is merely hidden, or a bug in fossil-scm (perhaps in their usage of stdarg functions) that's now hidden). 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
Re: [Tinycc-devel] Tinycc from git still can't compile fossil-scm
On Sun, Mar 30, 2014 at 04:10:48PM +0100, Domingo Alvarez Duarte wrote: I followed the code on fossil-scm with printfs on va_start/va_end using the previous tcc stdargs implementation and it showed me that both the parent and child do va_end on the same pointer that's why the segfault. As long as fossil-scm uses fork and not vfork, calling va_end in the parent and child can't be the reason for the segfault. Best regards, Daniel ___ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel
Re: [Tinycc-devel] Tinycc from git still can't compile fossil-scm
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. Actually sizeof(va_list) is 24 on x86_64 GCC although va_list is passed as a pointer. So we should typedef void *va_list[3]; and cast that to struct __va_list_struct as needed. Best regards, Daniel ___ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel
Re: [Tinycc-devel] Tinycc from git still can't compile fossil-scm
On Sat, Mar 29, 2014 at 11:46:26PM +0100, Daniel Glöckner wrote: Actually sizeof(va_list) is 24 on x86_64 GCC although va_list is passed as a pointer. So we should typedef void *va_list[3]; Or simply typedef struct __va_list_struct va_list[1]; ___ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel
Re: [Tinycc-devel] Tinycc from git still can't compile fossil-scm
On Sat, Mar 29, 2014 at 11:52:42PM +0100, Daniel Glöckner wrote: Or simply typedef struct __va_list_struct va_list[1]; Fixed in mob. ___ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel
Re: [Tinycc-devel] Tinycc from git still can't compile fossil-scm
Hi, On Sat, 29 Mar 2014, Domingo Alvarez Duarte 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; } No, that's not leaking memory, because a va_copy _must_ be paired with a va_end call in client code. And that one will release the allocated memory. 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. That's no double free, because the process space will be unshared after fork. I don't know what tool you used that pointed out a double free in this specific situation, but if it really thought this situation is a double free then it's buggy. Ciao, Michael.___ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel
Re: [Tinycc-devel] Tinycc from git still can't compile fossil-scm
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 ! On Thu, Mar 27, 2014 at 12:23 PM, Domingo Alvarez Duarte mingo...@gmail.com wrote: When I say that fossil-scm compiled with tcc segfault I mean on linux X86_64, but on linux 32bits it does compile and work fine. So it's something specific to 64 bits. Cheers ! On Thu, Mar 27, 2014 at 11:50 AM, Domingo Alvarez Duarte mingo...@gmail.com wrote: Hello ! Even with our latest bug fixes tinycc fail to compile fossil-scm, I mean it does compile but segfault after a few malloc calls. Cheers ! ___ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel