• WANG Xuerui's avatar
    LoongArch: Tweak CFLAGS for Clang compatibility · 38b10b26
    WANG Xuerui authored
    Now the arch code is mostly ready for LLVM/Clang consumption, it is time
    to re-organize the CFLAGS a little to actually enable the LLVM build.
    Namely, all -G0 switches from CFLAGS are removed, and -mexplicit-relocs
    and -mdirect-extern-access are now wrapped with cc-option (with the
    related asm/percpu.h definition guarded against toolchain combos that
    are known to not work).
    
    A build with !RELOCATABLE && !MODULE is confirmed working within a QEMU
    environment; support for the two features are currently blocked on
    LLVM/Clang, and will come later.
    
    Why -G0 can be removed:
    
    In GCC, -G stands for "small data threshold", that instructs the
    compiler to put data smaller than the specified threshold in a dedicated
    "small data" section (called .sdata on LoongArch and several other
    arches).
    
    However, benefiting from this would require ABI cooperation, which is
    not the case for LoongArch; and current GCC behave the same whether -G0
    (equal to disabling this optimization) is given or not. So, remove -G0
    from CFLAGS altogether for one less thing to care about. This also
    benefits LLVM/Clang compatibility where the -G switch is not supported.
    
    Why -mexplicit-relocs can now be conditionally applied without
    regressions:
    
    Originally -mexplicit-relocs is unconditionally added to CFLAGS in case
    of CONFIG_AS_HAS_EXPLICIT_RELOCS, because not having it (i.e. old GCC +
    new binutils) would not work: modules will have R_LARCH_ABS_* relocs
    inside, but given the rarity of such toolchain combo in the wild, it may
    not be worthwhile to support it, so support for such relocs in modules
    were not added back when explicit relocs support was upstreamed, and
    -mexplicit-relocs is unconditionally added to fail the build early.
    
    Now that Clang compatibility is desired, given Clang is behaving like
    -mexplicit-relocs from day one but without support for the CLI flag, we
    must ensure the flag is not passed in case of Clang. However, explicit
    compiler flavor checks can be more brittle than feature detection: in
    this case what actually matters is support for __attribute__((model))
    when building modules. Given neither older GCC nor current Clang support
    this attribute, probing for the attribute support and #error'ing out
    would allow proper UX without checking for Clang, and also automatically
    work when Clang support for the attribute is to be added in the future.
    
    Why -mdirect-extern-access is now conditionally applied:
    
    This is actually a nice-to-have optimization that can reduce GOT
    accesses, but not having it is harmless either. Because Clang does not
    support the option currently, but might do so in the future, conditional
    application via cc-option ensures compatibility with both current and
    future Clang versions.
    
    Suggested-by: Xi Ruoyao <xry111@xry111.site> # cc-option changes
    Signed-off-by: default avatarWANG Xuerui <git@xen0n.name>
    Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
    38b10b26
percpu.h 5.98 KB