I tried this on macOS 10.14.6 and both ORDER=1 and ORDER=2 compiled and ran
and produced the same result:

8: 8
7: 7
6: 6
5: 5
4: 4
3: 3
2: 2
1: 1
0: 0

i used TCC commit fb1fb8219ccf4813d63edf8c40fddc756e0c60cc.

i also learned that "The only compilation mode for TCC on MacOS is -run,
until someone provides an object file reader for Mach-O." which i wondered
about but never could find a definitive answer. i guess that means that
compiling TCC using TCC on macOS is not really possible for now as well,
right?

i appreciate the effort to make things work on macOS. i'm happy to test
other stuff.

thanks.

-- karl



On Tue, Apr 14, 2020 at 7:59 PM Michael Matz <matz....@frakked.de> wrote:

> Hi,
>
> On Wed, 15 Apr 2020, Robert Hölzl wrote:
>
> > Hello,
> >
> > I fixed the compilation problems of libtcc1.a on macOS (see commit ID
> > 1803762e3f86aff58d5cce78f7d4faf88e74cc6b).
>
> Uh, that breaks stdarg for everyone else on non-windows x86-64 and
> wouldn't work completely as is on MacOS either.  We need to approach this
> in a more systematic way:
>
> a) find our which layout of va_list is used
>     my bet is they're simply using GCC's definition as defacto standard,
>     i.e. __builtin_va_list as provided by GCC.  If so, then the current
>     definition of the layout of __va_list_struct is correct.
>     They most probably are not using your replacement void* type, as that
>     can't work with the provided va_copy.
> b) find out why the MacOS headers are unhappy with this definition when
>     compiled by TCC before including TCCs stdarg.h
>
> Also, have you read my answer to your mail from Saturday?  I.e. would the
> reordering of the <stdarg.h> include in tcc.h have been enough?
>
> For the time being, I fixed the problem for non-windows x86-64 on mob,
> but also have tried to retain the meat and spirit of the changes you did,
> specifically (if I did that right you should be no worse off than with
> your patch):
>
> * not define _VA_LIST_T anymore in stdarg.h (which was for trying to work
>    around the conflicting definition situation on MacOS, but obviously has
>    bitrotten)
> * don't define _ANSI_SOURCE anymore in CFLAGS
> * define __builtin_va_list to void *
> * typedef va_list to __builtin_va_list
>
> The latter two points only conditional on __APPLE__ being defined.  Note
> again that this definition of __builtin_va_list is _not_ going to work
> with the va_copy in our stdarg.h.
>
> I've reverted the changes in lib/va_list.c, though, as it was merely
> renaming variables after ignoring the dance with the type of the ap
> argument (not including "stdarg.h" makes this easier, the routines relied
> on the specific layout of it anyway, so we can just as well state the
> real type).
> (I've also moved the order of stdarg.h inclusion around in some files,
> maybe that helps as well)
>
> So, to get some progress on the two points above, do the following:
> given this small example:
> -------  stdarg1.c ---------
> #if ORDER == 1
> #include <stdarg.h>
> #include <stdio.h>
> #elif ORDER == 2
> #include <stdio.h>
> #include <stdarg.h>
> #else
> #error define ORDER to 1 or 2
> #endif
>
> void foo (int n, ...)
> {
>    va_list ap;
>    va_start(ap, n);
>    while (n--) {
>        int i = va_arg(ap, int);
>        printf("%d: %d\n", n, i);
>    }
>    va_end(ap);
> }
>
> int main()
> {
>    foo(9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
>    return 0;
> }
> ----------------------------
>
> compile and run this program with a just compiled TCC:
>
> % make
> % ./tcc -B. -run -DORDER=1 stdarg1.c
>
> does this fail already?  Does it fail with -DORDER=2?  If it fails, with
> which error? Capture the output of preprocessing in both cases (./tcc -B.
> -E -DORDER=1 stdarg1.c).  Possibly add '-dD' to the preprocess options to
> see which macros are defined where.  You can also send the two
> preprocessed files here.
>
> (My hope would be that it fails only with ORDER=2, and that we find some
> magic (macros or suchlike) that would make TCC find its own stdarg.h, even
> when system header are include)
>
> > But when creating a regular executable I get the following error
> > messages:
> >
> > tcc: error:  unrecognized file type
> > tcc: error:  file 'crt1.o' not found
> > tcc: error:  file 'crti.o' not found
> > tcc: error:  bad architecture
> > tcc: error:  library 'c' not found
> > tcc: error:  file 'crtn.o' not found
> >
> > It looks like tcc_load_ldscript() in tccelf.c failed when loading crt1.o
> > (ld_next() did not return LD_TOK_NAME).
> >
> > Again: older versions (i.e. commit id 944c) of tcc worked.
>
> Are you sure?  Which C library and crt*.o files was it finding at the
> time?  The thing is that TCC has no reader for Mach-O object files or
> libraries (and never had) so yes, it isn't able to load the runtime
> startup files or C library.  The only compilation mode for TCC on MacOS is
> -run, until someone provides an object file reader for Mach-O.
>
>
> 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