Hi, this patch fixes the ICE. Problem is that va_arg type is pre-streamed and thus at stream-in time we have main variant constructed by LTO FE which is !CXX_ODR_P while vairants are ones comming from C++ FE which are ODR. It is safe to drop the flags here since we only care about main variants anyway.
I am testing the patch on aarch64 now. Honza Index: lto/lto-common.c =================================================================== --- lto/lto-common.c (revision 272846) +++ lto/lto-common.c (working copy) @@ -568,8 +568,17 @@ lto_register_canonical_types_for_odr_typ /* Register all remaining types. */ FOR_EACH_VEC_ELT (*types_to_register, i, t) - if (!TYPE_CANONICAL (t)) - gimple_register_canonical_type (t); + { + /* For pre-streamed types like va-arg it is possible that main variant + is !CXX_ODR_P while the variant (which is streamed) is. + Copy CXX_ODR_P to make type verifier happy. This is safe because + in canonical type calculation we only consider main variants. + However we can not change this flag before streaming is finished + to not affect tree merging. */ + TYPE_CXX_ODR_P (t) = TYPE_CXX_ODR_P (TYPE_MAIN_VARIANT (t)); + if (!TYPE_CANONICAL (t)) + gimple_register_canonical_type (t); + } }