Follow aarch64 and riscv ports by using (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel for -fno-pic code. This avoids a canonical PLT entry for a personality reference in .eh_frame and a copy relocation for a typeinfo reference in .gcc_except_table, when the definition is in libstdc++.so.6.
gcc/ PR target/108622 * config/i386/i386.cc (asm_preferred_eh_data_format): Always use the PIC encoding. Use DW_EH_PE_indirect if global. --- gcc/config/i386/i386.cc | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index 3cacf738c4a..b572dd46a62 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -22851,22 +22851,13 @@ ix86_stack_protect_fail (void) int asm_preferred_eh_data_format (int code, int global) { - /* PE-COFF is effectively always -fPIC because of the .reloc section. */ - if (flag_pic || TARGET_PECOFF || !ix86_direct_extern_access) - { - int type = DW_EH_PE_sdata8; - if (ptr_mode == SImode - || ix86_cmodel == CM_SMALL_PIC - || (ix86_cmodel == CM_MEDIUM_PIC && (global || code))) - type = DW_EH_PE_sdata4; - return (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | type; - } - - if (ix86_cmodel == CM_SMALL - || (ix86_cmodel == CM_MEDIUM && code)) - return DW_EH_PE_udata4; - - return DW_EH_PE_absptr; + int type = DW_EH_PE_sdata8; + if (ptr_mode == SImode || ix86_cmodel == CM_SMALL || + ix86_cmodel == CM_SMALL_PIC || + (ix86_cmodel == CM_MEDIUM && code) || + (ix86_cmodel == CM_MEDIUM_PIC && (global || code))) + type = DW_EH_PE_sdata4; + return (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | type; } /* Implement targetm.vectorize.builtin_vectorization_cost. */ -- 2.39.1.456.gfc5497dd1b-goog