adding GCC optimze O0 to early_fixmap_init causes compiler error (BUILD_BUG failed)

Chan Kim ckim at etri.re.kr
Sun Jan 23 20:25:33 EST 2022


Hi, As I sent already the error message shows the discrepancy starts from include/linux/cache.h,
So I added the same #pragma thing around that #include <linux/cache.h> and the compile error is gone.
This is only for debugging a boot failure in a qemu machine (which is for a real fpga board), so I can follow the code with gdb.
And I needed to analyzing what kernel does until the problem occurs, though it isn't an easy task for me to follow.(but I think it's worth it.)
Thanks for the comments.
Chan

> -----Original Message-----
> From: jim.cromie at gmail.com <jim.cromie at gmail.com>
> Sent: Monday, January 24, 2022 1:47 AM
> To: Chan Kim <ckim at etri.re.kr>
> Cc: kernelnewbies <kernelnewbies at kernelnewbies.org>
> Subject: Re: adding GCC optimze O0 to early_fixmap_init causes compiler
> error (BUILD_BUG failed)
> 
> On Sun, Jan 23, 2022 at 4:23 AM Chan Kim <ckim at etri.re.kr> wrote:
> >
> > Hello all,
> >
> > In linux 5.4.21, when tell the compiler to use no optimzation for
> > function early_fixmap_init as below,
> >
> > (I need to compile with O0 to follow what’s happening here using gdb.)
> >
> > #pragma GCC push_options
> >
> > #pragma GCC optimze ("O0")
> >
> > void __init early_fixmap_init(void)
> >
> > {
> >
> > ...
> >
> > }
> >
> > #pragma GCC pop_options
> >
> >
> >
> > I get this compiler error below. (make ARCH=arm64
> > CROSS_COMPILE=aarch64-none-elf- Image -j24)
> >
> > CALL    scripts/atomic/check-atomics.sh
> >
> >   CALL    scripts/checksyscalls.sh
> >
> >   CHK     include/generated/compile.h
> >
> >   CC      arch/arm64/mm/mmu.o
> >
> >   CC      drivers/irqchip/irq-gic-v3.o
> >
> > In file included from ./include/linux/build_bug.h:5,
> >
> >                  from ./arch/arm64/include/asm/sysreg.h:758,
> >
> >                  from ./arch/arm64/include/asm/cputype.h:126,
> >
> >                  from ./arch/arm64/include/asm/cache.h:8,
> >
> >                  from ./include/linux/cache.h:6,
> >
> >                  from arch/arm64/mm/mmu.c:9:
> >
> > ./arch/arm64/include/asm/pgalloc.h: In function
> '__pgd_populate.constprop':
> >
> > ./include/linux/compiler.h:350:38: error: call to
> > '__compiletime_assert_88' declared with attribute error: BUILD_BUG
> > failed
> >
> >   350 |  _compiletime_assert(condition, msg, __compiletime_assert_,
> > __LINE__)
> >
> >       |                                      ^
> >
> > ./include/linux/compiler.h:331:4: note: in definition of macro
> '__compiletime_assert'
> >
> >   331 |    prefix ## suffix();    \
> >
> >       |    ^~~~~~
> >
> > ./include/linux/compiler.h:350:2: note: in expansion of macro
> '_compiletime_assert'
> >
> >   350 |  _compiletime_assert(condition, msg, __compiletime_assert_,
> > __LINE__)
> >
> >       |  ^~~~~~~~~~~~~~~~~~~
> >
> > ./include/linux/build_bug.h:39:37: note: in expansion of macro
> 'compiletime_assert'
> >
> >    39 | #define BUILD_BUG_ON_MSG(cond, msg)
> > compiletime_assert(!(cond), msg)
> >
> >       |                                     ^~~~~~~~~~~~~~~~~~
> >
> > ./include/linux/build_bug.h:59:21: note: in expansion of macro
> 'BUILD_BUG_ON_MSG'
> >
> >    59 | #define BUILD_BUG() BUILD_BUG_ON_MSG(1, "BUILD_BUG failed")
> >
> >       |                     ^~~~~~~~~~~~~~~~
> >
> > ./arch/arm64/include/asm/pgalloc.h:88:2: note: in expansion of macro
> 'BUILD_BUG'
> >
> >    88 |  BUILD_BUG();
> >
> >       |  ^~~~~~~~~
> >
> > make[2]: *** [scripts/Makefile.build:265: arch/arm64/mm/mmu.o] Error 1
> >
> > make[1]: *** [scripts/Makefile.build:509: arch/arm64/mm] Error 2
> >
> > make: *** [Makefile:1652: arch/arm64] Error 2
> >
> > make: *** Waiting for unfinished jobs....
> >
> >   AR      drivers/irqchip/built-in.a
> >
> > AR      drivers/built-in.
> >
> >
> >
> > What does this mean and what should I do?
> >
> 
> it means that some precondition failed, and you reached a known broken
> setup.
> Instead of giving you a broken kernel, its told you that you have to fix
> this 1st.
> 
> try making an intermediate output, forex:
>     make init/main.i
> 
> that should provide hints as to how you got to the BUILD_BUG
> 
> I dont think banging on -O compile options will help, at least not after
> seeing GregKH opine on it.
> 
> > Thanks!
> >
> > Chan Kim
> >
> >
> >
> > _______________________________________________
> > Kernelnewbies mailing list
> > Kernelnewbies at kernelnewbies.org
> > https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies







More information about the Kernelnewbies mailing list