[PATCH] D34158: For Linux/gnu compatibility, preinclude <stdc-predef.h> if the file is available
Joerg Sonnenberger via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 9 12:08:23 PDT 2017
joerg added a comment.
In https://reviews.llvm.org/D34158#836026, @jyknight wrote:
> In https://reviews.llvm.org/D34158#827178, @joerg wrote:
>
> > (2) It adds magic behavior that can make debugging more difficult. Partially preprocessed sources for example could be compiled with plain -c before, now they need a different command line.
>
>
> If this is a problem, making it be Linux-only does _nothing_ to solve it. But I don't actually see how this is a substantively new problem? Compiling with plain -c before
> would get #defines for those predefined macros that the compiler sets, even though you may not have wanted those. Is this fundamentally different?
It makes it a linux-only problem. As such, it is something *I* only care about secondary. A typical use case I care about a lot is pulling the crash report sources from my (NetBSD) build machine,
extracting the original command line to rerun the normal compilation with -save-temps. I don't necessarily have the (same) system headers on the machine I use for debugging and that's exactly
the kind of use case this change breaks. All other predefined macros are driven by the target triple and remain stable.
>> (3) It seems to me that the GNU userland (and maybe Windows) is the exception to a well integrated tool chain. Most other platforms have a single canonical
>> libc, libm and libpthread implementation and can as such directly define all the relevant macros directly in the driver.
>
> I don't think this is accurate. There's many platforms out there, and for almost none of them do we have exact knowledge of the features of the libc encoded
> into the compiler. I'd note that not only do you need this for every (OS, libc) combination, you'd need it for every (OS, libc-VERSION) combination.
Not really. The feature set is rarely changing and generally will have only a cut-off version.
>> Given that many of the macros involved are already reflected by the compiler behavior anyway, they can't be decoupled. I.e. the questionable
>> concept of locale-independent wchar_t is already hard-coded in the front end as soon as any long character literals are used.
>
> AFAICT, this example is not actually the case. The frontend only needs to know *a* valid encoding for wide-character literals in some
> implementation-defined locale (for example, it might always emit them as unicode codepoints, as clang does). Standard says:
> "the array elements [...] are initialized with the sequence of wide characters corresponding to the multibyte character sequence, as
> defined by the mbstowcs function with an implementation defined current locale."
I know what the standard says. It doesn't make much sense if you do not have a fixed wchar_t encoding.
> On the other hand, I believe the intent of this macro is to guarantee that _no matter what_ the locale is,
> that a U+0100 character (say, translated with mbrtowc from the locale encoding) gets represented as 0x100.
Yes, so it is essentially "we have screwed up by creating a language mechanism that adds a major constraint, so let's go all the way".
> Thus, it's "fine" for the frontend to always emit wchar_t literals as unicode, yet, the libc may sometimes use an arbitrary different
> internal encoding, depending on the locale used at runtime. (Obviously using wide character literals with such a libc would be a poor
> user experience, and such a libc probably ought to reconsider its choices, but that's a different discussion.)
One of the biggest opponents of that was Itojun. It's not a decision that should be made here as it is only indirectly related to this discussion.
>> As such, please move the command line additions back into the target-specific files for targets that actually want to get this behavior.
>
> Without even a suggestion of a better solution to use for other targets, I find it is to be a real shame to push for this to be linux-only,
> and leave everyone else hanging. I find that that _most_ of these defines are effectively library decisions. I further would claim that these
> are likely to vary over the lifetime of even a single libc, and that as such we would be better served by allowing the libc to set them directly, rather than encoding it into the compiler.
>
> TTBOMK, no targets except linux/glibc/gcc actually comply with this part of the C99/C11 standard today, and so this feature would be useful to have available across all targets.
>
> (I very much dislike that the C standard has started adding all these new predefined macros, instead of exposing them from a header, but there's not much to be done about that...)
Exactly. It's not like this is a lot of target logic. It should be a single call for targets that want to get this functionality. But that's my point -- it should be opt-in, not opt-out.
https://reviews.llvm.org/D34158
More information about the cfe-commits
mailing list