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

jim.cromie at gmail.com jim.cromie at gmail.com
Sun Jan 23 11:46:41 EST 2022


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