David, apropos your comment that we can assume clang will catch any
real problems; your comment reminds me of a lesson we learned on
Harvey-OS.

What we learned on Harvey-OS, when we were compiling a working kernel
across 3 versions of gcc, and 3 versions of clang, was that at one
time or another, one of these 6 compilers gave us a warning on some
critical code issue in Harvey-0S, that the other 5 did not. Older
compilers warned of something a newer one did not; gcc and clang each
had warnings the other missed.

This was surprising and a useful lesson to us. It's also why I'll
never be able to accept the idea that coreboot should be written in a
gcc-specific dialect. But that's another argument for another day.

On Mon, May 16, 2022 at 9:53 PM David Hendricks
<[email protected]> wrote:
>
> Thanks for digging up all that useful information, Martin! So `#pragma once` 
> is not the clear winner after all. Too bad since we could eliminate some 
> boilerplate code with that approach.
>
> Is there another way to solve the problem Arthur raised in this thread? The 
> LMKL thread had a python script and people were also talking about adding 
> something to checkpatch.pl. Maybe these days it's sufficient to assume clang 
> will catch any real problems (CB:62173).
>
>
>
> On Mon, May 16, 2022 at 1:03 PM ron minnich <[email protected]> wrote:
>>
>> we have, in the past, used Linux kernel style as our guideline on
>> coreboot style.
>>
>> I'd say, based on Martin's note, that #pragma once is not such a good
>> idea after all. If we decide NOT to use it, however, let's put a note
>> about it in our style guide?
>>
>> This is not the first time this question has come up.
>>
>>
>> On Mon, May 16, 2022 at 12:34 PM Martin Roth <[email protected]> wrote:
>> >
>> > After reading what I've included below, I'm going to have to vote to keep 
>> > the guards.
>> > Martin
>> >
>> > May 16, 2022, 10:59 by [email protected]:
>> >
>> > > On Mon, May 16, 2022 at 8:59 AM ron minnich <[email protected]> wrote:
>> > >
>> > >>
>> > >> btw, sometimes this has gone the other direction ..
>> > >> https://github.com/lowRISC/opentitan/pull/5693
>> > >>
>> > >
>> > > It looks like they did that solely to conform to Google's style guide
>> > > which, dogmatic as it may appear, makes sense since OpenTitan is a
>> > > Google-lead project.
>> > >
>> > The question then is 'why does Google require the use of guards?'.  
>> > Whatever you think of google, they're not going to mandate something like 
>> > this without a good reason.
>> >
>> > I went searching for where this rule came from, and found this:
>> >
>> > ```
>> > If you trust our in-house C++ compiler gurus, here's the most salient part 
>> > of the whole thread linked above.Matt Austern (4/11/2013): If you talk to 
>> > the authors of [most C++] compilers, I think you'll find that most of them 
>> > consider "#pragma once" (or the equivalent #import) to be a flaky feature 
>> > -- something that works almost all of the time and that can cause 
>> > seriously annoying bugs when it doesn't work.
>> >
>> > Chandler Carruth (4/12/2013): As one of the authors of one of those 
>> > compilers, I couldn't agree more.
>> > ```
>> > any interested Googlers can find this here:
>> >    https://yaqs.corp.google.com/eng/q/5768278562045952
>> >
>> >
>> > Further digging:
>> > ```
>> > To support #pragma once, the compiler tries to identify duplicate 
>> > encounters with the same file, but the check gcc actually performs to 
>> > establish the identity of the file is weak. Here's someone who made two 
>> > copies of the same header with different names, each with a #pragma once, 
>> > and it screwed up his build.
>> >
>> >  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52566
>> >
>> > The two headers had the same size, same content, and same timestamps 
>> > because he had run "touch *" on them, but they were intended to both be 
>> > included. Only one was included, and the other was falsely identified as a 
>> > re-inclusion and ignored.One might say he was asking for trouble by 
>> > running "touch *", but timestamp collisions are EASY to come by. First of 
>> > all, they're only 1sec resolution. You might patch all the relevant files 
>> > and they'd have matching timestamps. You might be using a network 
>> > filesystem that just doesn't bother with timestamps (common).
>> > ```
>> >
>> > Now both of these are almost a decade old, so things might have changed 
>> > quite a bit since then.
>> >
>> >
>> > Linux kernel threads:
>> > https://lkml.iu.edu/hypermail/linux/kernel/1401.0/02048.html
>> > https://lore.kernel.org/lkml/CAHk-=wi54descexxpmro+q2nag_tup+y5ybhc_9_xglerfp...@mail.gmail.com/
>> >
>> > ```
>> > On Sun, Feb 28, 2021 at 11:34 AM Alexey Dobriyan <[email protected]> 
>> > wrote:>> >> > End result: #pragma is fundamentally less reliable than the> 
>> > > traditional #ifdef guard. The #ifdef guard works fine even if you> > 
>> > re-read the file for whatever reason, while #pragma relies on some> > kind 
>> > of magical behavior.You continue to not even answer this very fundamental 
>> > question."#pragma once" doesn't seem to have a _single_ actual real 
>> > advantage.Everybody already does the optimization of not even opening - 
>> > muchless reading and re-parsing - headers that have the traditional 
>> > #ifdefguard.And even if you _don't_ do that optimization, the #ifdef 
>> > guardfundmentally semantically guarantyees the right behavior.So the 
>> > #ifdef guard is (a) standard (b) simple (c) reliable (d) traditionaland 
>> > you have yet to explain a _single_ advantage of "#pragma once".Why add 
>> > this incredible churn that has no upside?So no. We're not using #pragma 
>> > once unless y9ou can come up with somevery strong argument for itA
 nd no, having to come up with a name for the #ifdef guard is not astrong 
argument. It's simply not that complicated.               Linus
>> > ```
>> >
>> >
>> >
>> >
_______________________________________________
coreboot mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to