-ffreestanding option
Zheng Luo (Vic)
vicluo96 at gmail.com
Wed Jul 25 10:32:40 UTC 2018
On Wednesday, 25 July 2018 at 10:05:50 UTC, Mike Franklin wrote:
> On Wednesday, 25 July 2018 at 08:37:28 UTC, Zheng (Vic) Luo
> wrote:
>
>> Current implementation of compilers assumes the existence of
>> some symbols from libc, which leads to an infinite loop if we
>> want to implement primitives like "memset" with our own code
>> because the compiler will optimize consecutive set with
>> "memset". This suggests that we cannot write a freestanding
>> program without supports from compiler. With "-betterC" flag,
>> dmd/gdc/ldc also come into this issue[5], which also applies
>> to C/C++[1] and rust [2][3][4].
>
> GDC doesn't seem to be affected. See
> https://explore.dgnu.org/g/ZJVjAu i.e. no recursive calls to
> `memset`, but I don't know if I just got lucky with my
> implementation.
>
>> It would be better to provide a standard flag like
>> "-ffreestanding" (or -fno-builtin?) to disable such
>> optimizations to facilitate freestanding programming instead
>> of forcing the developers to hack around different compiler
>> implementations, so I was wondering is there any progress on
>> this problem?
>
> According to https://wiki.dlang.org/Using_GDC, `-fno-builtin`
> is already there.
>
> From my experience I haven't yet found a need for
> `-ffreestanding`, as GDC always seems to do the right thing for
> me. It does generate calls for `memset`, `memcmp`, etc..., but
> as long as I provide my own implementation with the correct
> symbol name as it expects (i.e. `memset` with no name mangling,
> a.k.a `extern(C) void* memset(void*, int, size_t)`) it seems to
> work fine.
>
> Mike
The real problem is that current D toolchain makes no promise
about the generation of calls to libc: When are they called/Which
subset is called/How to disable the calls? What if users embed
this memset snippet in their own function? Instead of forcing
developers to avoid memset-like access pattern in a freestanding
environment and increasing their mental burden, a universal flags
to disable these the generation of these calls will probably be a
better choice.
More information about the D.gnu
mailing list