On Fri, Jan 31, 2025 at 2:36 PM H.J. Lu <hjl.to...@gmail.com> wrote:
>
> -fno-plt forces external call to indirect call via GOT memory.  But
> -mindirect-branch-register requires indirect call and jump via register.
> For -mindirect-branch-register, expanding indirect call via register and
> update call patterns and peepholes to disable indirect call via memory.
>
> gcc/
>
>         PR target/118713
>         * config/i386/i386-expand.cc (ix86_expand_call): Force indirect
>         call via register for -mindirect-branch-register.
>         * config/i386/i386.md (*call): Disable indirect call via memory
>         for -mindirect-branch-register.
>         (*call_got_x32): Likewise.
>         (*sibcall_GOT_32): Likewise.
>         (*sibcall): Likewise.
>         (*sibcall_memory): Likewise.
>         (*call_pop): Likewise.
>         (*sibcall_pop): Likewise.
>         (*sibcall_pop_memory): Likewise.
>         (*call_value): Likewise.
>         (*call_value_got_x32): Likewise.
>         (*sibcall_value_GOT_32): Likewise.
>         (*sibcall_value): Likewise.
>         (*sibcall_value_memory): Likewise.
>         (*call_value_pop): Likewise.
>         (*sibcall_value_pop): Likewise.
>         (*sibcall_value_pop_memory): Likewise.
>
> gcc/testsuite/
>
>         PR target/118713
>         * gcc.target/i386/pr118713-1-x32.c: New test.
>         * gcc.target/i386/pr118713-1.c: Likewise.
>         * gcc.target/i386/pr118713-2-x32.c: Likewise.
>         * gcc.target/i386/pr118713-2.c: Likewise.
>         * gcc.target/i386/pr118713-3-x32.c: Likewise.
>         * gcc.target/i386/pr118713-3.c: Likewise.
>         * gcc.target/i386/pr118713-4-x32.c: Likewise.
>         * gcc.target/i386/pr118713-4.c: Likewise.
>         * gcc.target/i386/pr118713-5-x32.c: Likewise.
>         * gcc.target/i386/pr118713-5.c: Likewise.
>         * gcc.target/i386/pr118713-6-x32.c: Likewise.
>         * gcc.target/i386/pr118713-6.c: Likewise.
>         * gcc.target/i386/pr118713-7-x32.c: Likewise.
>         * gcc.target/i386/pr118713-7.c: Likewise.
>         * gcc.target/i386/pr118713-8-x32.c: Likewise.
>         * gcc.target/i386/pr118713-8.c: Likewise.
>         * gcc.target/i386/pr118713-9-x32.c: Likewise.
>         * gcc.target/i386/pr118713-9.c: Likewise.
>         * gcc.target/i386/pr118713-10-x32.c: Likewise.
>         * gcc.target/i386/pr118713-10.c: Likewise.
>         * gcc.target/i386/pr118713-11-x32.c: Likewise.
>         * gcc.target/i386/pr118713-11.c: Likewise.
>         * gcc.target/i386/pr118713-12-x32.c: Likewise.
>         * gcc.target/i386/pr118713-12.c: Likewise.
>
> Co-Authored-By: Uros Bizjak <ubiz...@gmail.com>
> Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
> ---
>  gcc/config/i386/i386-expand.cc                | 20 ++--
>  gcc/config/i386/i386.md                       | 98 +++++++++++++------
>  .../gcc.target/i386/pr118713-1-x32.c          |  8 ++
>  gcc/testsuite/gcc.target/i386/pr118713-1.c    | 14 +++
>  .../gcc.target/i386/pr118713-10-x32.c         |  8 ++
>  gcc/testsuite/gcc.target/i386/pr118713-10.c   | 15 +++
>  .../gcc.target/i386/pr118713-11-x32.c         |  8 ++
>  gcc/testsuite/gcc.target/i386/pr118713-11.c   | 14 +++
>  .../gcc.target/i386/pr118713-12-x32.c         |  8 ++
>  gcc/testsuite/gcc.target/i386/pr118713-12.c   | 14 +++
>  .../gcc.target/i386/pr118713-2-x32.c          |  8 ++
>  gcc/testsuite/gcc.target/i386/pr118713-2.c    | 15 +++
>  .../gcc.target/i386/pr118713-3-x32.c          |  8 ++
>  gcc/testsuite/gcc.target/i386/pr118713-3.c    | 14 +++
>  .../gcc.target/i386/pr118713-4-x32.c          |  8 ++
>  gcc/testsuite/gcc.target/i386/pr118713-4.c    | 14 +++
>  .../gcc.target/i386/pr118713-5-x32.c          |  8 ++
>  gcc/testsuite/gcc.target/i386/pr118713-5.c    | 13 +++
>  .../gcc.target/i386/pr118713-6-x32.c          | 15 +++
>  gcc/testsuite/gcc.target/i386/pr118713-6.c    | 14 +++
>  .../gcc.target/i386/pr118713-7-x32.c          |  8 ++
>  gcc/testsuite/gcc.target/i386/pr118713-7.c    | 13 +++
>  .../gcc.target/i386/pr118713-8-x32.c          |  8 ++
>  gcc/testsuite/gcc.target/i386/pr118713-8.c    | 13 +++
>  .../gcc.target/i386/pr118713-9-x32.c          |  8 ++
>  gcc/testsuite/gcc.target/i386/pr118713-9.c    | 14 +++
>  26 files changed, 353 insertions(+), 35 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-1-x32.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-1.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-10-x32.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-10.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-11-x32.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-11.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-12-x32.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-12.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-2-x32.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-2.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-3-x32.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-3.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-4-x32.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-4.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-5-x32.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-5.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-6-x32.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-6.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-7-x32.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-7.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-8-x32.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-8.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-9-x32.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr118713-9.c
>
> diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
> index 117f6f6f7eb..1d1614d2ccc 100644
> --- a/gcc/config/i386/i386-expand.cc
> +++ b/gcc/config/i386/i386-expand.cc
> @@ -10223,15 +10223,21 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx 
> callarg1,
>        && GET_CODE (XEXP (fnaddr, 0)) == SYMBOL_REF
>        && !local_symbolic_operand (XEXP (fnaddr, 0), VOIDmode))
>      fnaddr = gen_rtx_MEM (QImode, construct_plt_address (XEXP (fnaddr, 0)));
> +  else if (TARGET_INDIRECT_BRANCH_REGISTER && MEM_P (fnaddr))
> +    {
> +      fnaddr = convert_to_mode (word_mode, XEXP (fnaddr, 0), 1);
> +      fnaddr = gen_rtx_MEM (QImode, copy_to_mode_reg (word_mode, fnaddr));
> +    }
>    /* Since x32 GOT slot is 64 bit with zero upper 32 bits, indirect
>       branch via x32 GOT slot is OK.  */
> -  else if (!(TARGET_X32
> -            && MEM_P (fnaddr)
> -            && GET_CODE (XEXP (fnaddr, 0)) == ZERO_EXTEND
> -            && GOT_memory_operand (XEXP (XEXP (fnaddr, 0), 0), Pmode))
> -          && (sibcall
> -              ? !sibcall_insn_operand (XEXP (fnaddr, 0), word_mode)
> -              : !call_insn_operand (XEXP (fnaddr, 0), word_mode)))
> +  if (TARGET_X32
> +      && MEM_P (fnaddr)
> +      && GET_CODE (XEXP (fnaddr, 0)) == ZERO_EXTEND
> +      && GOT_memory_operand (XEXP (XEXP (fnaddr, 0), 0), Pmode))
> +    ;
> +  else if (sibcall
> +          ? !sibcall_insn_operand (XEXP (fnaddr, 0), word_mode)
> +          : !call_insn_operand (XEXP (fnaddr, 0), word_mode))
>      {
>        fnaddr = convert_to_mode (word_mode, XEXP (fnaddr, 0), 1);
>        fnaddr = gen_rtx_MEM (QImode, copy_to_mode_reg (word_mode, fnaddr));
> diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
> index 52c02b6351a..0c9721bdc7a 100644
> --- a/gcc/config/i386/i386.md
> +++ b/gcc/config/i386/i386.md
> @@ -20122,18 +20122,23 @@ (define_expand "sibcall"
>  })
>
>  (define_insn "*call"
> -  [(call (mem:QI (match_operand:W 0 "call_insn_operand" "<c>BwBz"))
> +  [(call (mem:QI (match_operand:W 0 "call_insn_operand" "<c>,BwBz"))
>          (match_operand 1))]
>    "!SIBLING_CALL_P (insn)"
>    "* return ix86_output_call_insn (insn, operands[0]);"
> -  [(set_attr "type" "call")])
> +  [(set_attr "type" "call")
> +   (set (attr "enabled")
> +     (if_then_else
> +       (eq_attr "alternative" "1")
> +       (symbol_ref "!TARGET_INDIRECT_BRANCH_REGISTER")
> +       (const_string "*")))])

Did you read my previous message? You don't need to add "enabled"
attribute (and alternatives), because Bw and Bs already include:

(define_constraint "Bs"
  "@internal Sibcall memory operand."
  (ior (and (not (match_test "TARGET_INDIRECT_BRANCH_REGISTER"))
        (not (match_test "TARGET_X32"))
        (match_operand 0 "sibcall_memory_operand"))
       (and (match_test "TARGET_X32")
        (match_test "Pmode == DImode")
        (match_operand 0 "GOT_memory_operand"))))

(define_constraint "Bw"
  "@internal Call memory operand."
  (ior (and (not (match_test "TARGET_INDIRECT_BRANCH_REGISTER"))
        (not (match_test "TARGET_X32"))
        (match_operand 0 "memory_operand"))
       (and (match_test "TARGET_X32")
        (match_test "Pmode == DImode")
        (match_operand 0 "GOT_memory_operand"))))

"Bz" constraint does not mention TARGET_INDIRECT_BRANCH_REGISTER.

So, please investigate the condition and eventually fix Bs, Bw  and Bz
constraints. There is no need to introduce and disable alternatives
when corresponding constraints are disabled.

Uros.

>
>  ;; This covers both call and sibcall since only GOT slot is allowed.
>  (define_insn "*call_got_x32"
>    [(call (mem:QI (zero_extend:DI
>                    (match_operand:SI 0 "GOT_memory_operand" "Bg")))
>          (match_operand 1))]
> -  "TARGET_X32"
> +  "TARGET_X32 && !TARGET_INDIRECT_BRANCH_REGISTER"
>  {
>    rtx fnaddr = gen_const_mem (DImode, XEXP (operands[0], 0));
>    return ix86_output_call_insn (insn, fnaddr);
> @@ -20149,7 +20154,7 @@ (define_insn "*sibcall_GOT_32"
>                      (match_operand:SI 1 "GOT32_symbol_operand"))))
>          (match_operand 2))]
>    "!TARGET_MACHO
> -  && !TARGET_64BIT
> +  && !TARGET_64BIT && !TARGET_INDIRECT_BRANCH_REGISTER
>    && !TARGET_INDIRECT_BRANCH_REGISTER
>    && SIBLING_CALL_P (insn)"
>  {
> @@ -20160,17 +20165,23 @@ (define_insn "*sibcall_GOT_32"
>    [(set_attr "type" "call")])
>
>  (define_insn "*sibcall"
> -  [(call (mem:QI (match_operand:W 0 "sibcall_insn_operand" "UBsBz"))
> +  [(call (mem:QI (match_operand:W 0 "sibcall_insn_operand" "U,BsBz"))
>          (match_operand 1))]
>    "SIBLING_CALL_P (insn)"
>    "* return ix86_output_call_insn (insn, operands[0]);"
> -  [(set_attr "type" "call")])
> +  [(set_attr "type" "call")
> +   (set (attr "enabled")
> +     (if_then_else
> +       (eq_attr "alternative" "1")
> +       (symbol_ref "!TARGET_INDIRECT_BRANCH_REGISTER")
> +       (const_string "*")))])
>
>  (define_insn "*sibcall_memory"
>    [(call (mem:QI (match_operand:W 0 "memory_operand" "m"))
>          (match_operand 1))
>     (unspec [(const_int 0)] UNSPEC_PEEPSIB)]
> -  "!TARGET_X32 && !TARGET_INDIRECT_BRANCH_REGISTER"
> +  "!TARGET_X32 && !TARGET_INDIRECT_BRANCH_REGISTER
> +   && !TARGET_INDIRECT_BRANCH_REGISTER"
>    "* return ix86_output_call_insn (insn, operands[0]);"
>    [(set_attr "type" "call")])
>
> @@ -20218,24 +20229,34 @@ (define_expand "call_pop"
>  })
>
>  (define_insn "*call_pop"
> -  [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lBwBz"))
> +  [(call (mem:QI (match_operand:SI 0 "call_insn_operand" "l,BwBz"))
>          (match_operand 1))
>     (set (reg:SI SP_REG)
>         (plus:SI (reg:SI SP_REG)
> -                (match_operand:SI 2 "immediate_operand" "i")))]
> +                (match_operand:SI 2 "immediate_operand" "i,i")))]
>    "!TARGET_64BIT && !SIBLING_CALL_P (insn)"
>    "* return ix86_output_call_insn (insn, operands[0]);"
> -  [(set_attr "type" "call")])
> +  [(set_attr "type" "call")
> +   (set (attr "enabled")
> +     (if_then_else
> +       (eq_attr "alternative" "1")
> +       (symbol_ref "!TARGET_INDIRECT_BRANCH_REGISTER")
> +       (const_string "*")))])
>
>  (define_insn "*sibcall_pop"
> -  [(call (mem:QI (match_operand:SI 0 "sibcall_insn_operand" "UBsBz"))
> +  [(call (mem:QI (match_operand:SI 0 "sibcall_insn_operand" "U,BsBz"))
>          (match_operand 1))
>     (set (reg:SI SP_REG)
>         (plus:SI (reg:SI SP_REG)
> -                (match_operand:SI 2 "immediate_operand" "i")))]
> +                (match_operand:SI 2 "immediate_operand" "i,i")))]
>    "!TARGET_64BIT && SIBLING_CALL_P (insn)"
>    "* return ix86_output_call_insn (insn, operands[0]);"
> -  [(set_attr "type" "call")])
> +  [(set_attr "type" "call")
> +   (set (attr "enabled")
> +     (if_then_else
> +       (eq_attr "alternative" "1")
> +       (symbol_ref "!TARGET_INDIRECT_BRANCH_REGISTER")
> +       (const_string "*")))])
>
>  (define_insn "*sibcall_pop_memory"
>    [(call (mem:QI (match_operand:SI 0 "memory_operand" "Bs"))
> @@ -20244,7 +20265,7 @@ (define_insn "*sibcall_pop_memory"
>         (plus:SI (reg:SI SP_REG)
>                  (match_operand:SI 2 "immediate_operand" "i")))
>     (unspec [(const_int 0)] UNSPEC_PEEPSIB)]
> -  "!TARGET_64BIT"
> +  "!TARGET_64BIT && !TARGET_INDIRECT_BRANCH_REGISTER"
>    "* return ix86_output_call_insn (insn, operands[0]);"
>    [(set_attr "type" "call")])
>
> @@ -20325,11 +20346,16 @@ (define_expand "sibcall_value"
>
>  (define_insn "*call_value"
>    [(set (match_operand 0)
> -       (call (mem:QI (match_operand:W 1 "call_insn_operand" "<c>BwBz"))
> +       (call (mem:QI (match_operand:W 1 "call_insn_operand" "<c>,BwBz"))
>               (match_operand 2)))]
>    "!SIBLING_CALL_P (insn)"
>    "* return ix86_output_call_insn (insn, operands[1]);"
> -  [(set_attr "type" "callv")])
> +  [(set_attr "type" "callv")
> +   (set (attr "enabled")
> +     (if_then_else
> +       (eq_attr "alternative" "1")
> +       (symbol_ref "!TARGET_INDIRECT_BRANCH_REGISTER")
> +       (const_string "*")))])
>
>  ;; This covers both call and sibcall since only GOT slot is allowed.
>  (define_insn "*call_value_got_x32"
> @@ -20338,7 +20364,7 @@ (define_insn "*call_value_got_x32"
>                 (zero_extend:DI
>                   (match_operand:SI 1 "GOT_memory_operand" "Bg")))
>               (match_operand 2)))]
> -  "TARGET_X32"
> +  "TARGET_X32 && !TARGET_INDIRECT_BRANCH_REGISTER"
>  {
>    rtx fnaddr = gen_const_mem (DImode, XEXP (operands[1], 0));
>    return ix86_output_call_insn (insn, fnaddr);
> @@ -20355,7 +20381,7 @@ (define_insn "*sibcall_value_GOT_32"
>                           (match_operand:SI 2 "GOT32_symbol_operand"))))
>          (match_operand 3)))]
>    "!TARGET_MACHO
> -   && !TARGET_64BIT
> +   && !TARGET_64BIT && !TARGET_INDIRECT_BRANCH_REGISTER
>     && !TARGET_INDIRECT_BRANCH_REGISTER
>     && SIBLING_CALL_P (insn)"
>  {
> @@ -20367,18 +20393,24 @@ (define_insn "*sibcall_value_GOT_32"
>
>  (define_insn "*sibcall_value"
>    [(set (match_operand 0)
> -       (call (mem:QI (match_operand:W 1 "sibcall_insn_operand" "UBsBz"))
> +       (call (mem:QI (match_operand:W 1 "sibcall_insn_operand" "U,BsBz"))
>               (match_operand 2)))]
>    "SIBLING_CALL_P (insn)"
>    "* return ix86_output_call_insn (insn, operands[1]);"
> -  [(set_attr "type" "callv")])
> +  [(set_attr "type" "callv")
> +   (set (attr "enabled")
> +     (if_then_else
> +       (eq_attr "alternative" "1")
> +       (symbol_ref "!TARGET_INDIRECT_BRANCH_REGISTER")
> +       (const_string "*")))])
>
>  (define_insn "*sibcall_value_memory"
>    [(set (match_operand 0)
>         (call (mem:QI (match_operand:W 1 "memory_operand" "m"))
>               (match_operand 2)))
>     (unspec [(const_int 0)] UNSPEC_PEEPSIB)]
> -  "!TARGET_X32 && !TARGET_INDIRECT_BRANCH_REGISTER"
> +  "!TARGET_X32 && !TARGET_INDIRECT_BRANCH_REGISTER
> +   && !TARGET_INDIRECT_BRANCH_REGISTER"
>    "* return ix86_output_call_insn (insn, operands[1]);"
>    [(set_attr "type" "callv")])
>
> @@ -20432,25 +20464,35 @@ (define_expand "call_value_pop"
>
>  (define_insn "*call_value_pop"
>    [(set (match_operand 0)
> -       (call (mem:QI (match_operand:SI 1 "call_insn_operand" "lBwBz"))
> +       (call (mem:QI (match_operand:SI 1 "call_insn_operand" "l,BwBz"))
>               (match_operand 2)))
>     (set (reg:SI SP_REG)
>         (plus:SI (reg:SI SP_REG)
> -                (match_operand:SI 3 "immediate_operand" "i")))]
> +                (match_operand:SI 3 "immediate_operand" "i,i")))]
>    "!TARGET_64BIT && !SIBLING_CALL_P (insn)"
>    "* return ix86_output_call_insn (insn, operands[1]);"
> -  [(set_attr "type" "callv")])
> +  [(set_attr "type" "callv")
> +   (set (attr "enabled")
> +     (if_then_else
> +       (eq_attr "alternative" "1")
> +       (symbol_ref "!TARGET_INDIRECT_BRANCH_REGISTER")
> +       (const_string "*")))])
>
>  (define_insn "*sibcall_value_pop"
>    [(set (match_operand 0)
> -       (call (mem:QI (match_operand:SI 1 "sibcall_insn_operand" "UBsBz"))
> +       (call (mem:QI (match_operand:SI 1 "sibcall_insn_operand" "U,BsBz"))
>               (match_operand 2)))
>     (set (reg:SI SP_REG)
>         (plus:SI (reg:SI SP_REG)
> -                (match_operand:SI 3 "immediate_operand" "i")))]
> +                (match_operand:SI 3 "immediate_operand" "i,i")))]
>    "!TARGET_64BIT && SIBLING_CALL_P (insn)"
>    "* return ix86_output_call_insn (insn, operands[1]);"
> -  [(set_attr "type" "callv")])
> +  [(set_attr "type" "callv")
> +   (set (attr "enabled")
> +     (if_then_else
> +       (eq_attr "alternative" "1")
> +       (symbol_ref "!TARGET_INDIRECT_BRANCH_REGISTER")
> +       (const_string "*")))])
>
>  (define_insn "*sibcall_value_pop_memory"
>    [(set (match_operand 0)
> @@ -20460,7 +20502,7 @@ (define_insn "*sibcall_value_pop_memory"
>         (plus:SI (reg:SI SP_REG)
>                  (match_operand:SI 3 "immediate_operand" "i")))
>     (unspec [(const_int 0)] UNSPEC_PEEPSIB)]
> -  "!TARGET_64BIT"
> +  "!TARGET_64BIT && !TARGET_INDIRECT_BRANCH_REGISTER"
>    "* return ix86_output_call_insn (insn, operands[1]);"
>    [(set_attr "type" "callv")])
>
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-1-x32.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-1-x32.c
> new file mode 100644
> index 00000000000..c27ac93ae87
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-1-x32.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-require-effective-target maybe_x32 } */
> +/* { dg-options "-O2 -mx32 -fpic -fno-plt -mindirect-branch-register" } */
> +
> +#include "pr118713-1.c"
> +
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOTPCREL" } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-1.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-1.c
> new file mode 100644
> index 00000000000..56884f3d952
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-1.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch-register" } */
> +
> +extern void bar (void);
> +
> +void
> +foo (void)
> +{
> +  bar ();
> +}
> +
> +/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*bar@GOTPCREL" { target { ! 
> ia32 } } } } */
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOT\\(" { target ia32 } } } 
> */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-10-x32.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-10-x32.c
> new file mode 100644
> index 00000000000..30d25ad6d0e
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-10-x32.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-require-effective-target maybe_x32 } */
> +/* { dg-options "-O2 -mx32 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +#include "pr118713-10.c"
> +
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOTPCREL" } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-10.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-10.c
> new file mode 100644
> index 00000000000..a0e2ff3760b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-10.c
> @@ -0,0 +1,15 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +extern void bar (void);
> +
> +int
> +foo (void)
> +{
> +  bar ();
> +  return 0;
> +}
> +
> +/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*bar@GOTPCREL" { target { ! 
> ia32 } } } } */
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOT, " { target ia32 } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-11-x32.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-11-x32.c
> new file mode 100644
> index 00000000000..98afe50f42c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-11-x32.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-require-effective-target maybe_x32 } */
> +/* { dg-options "-O2 -mx32 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +#include "pr118713-11.c"
> +
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOTPCREL" } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-11.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-11.c
> new file mode 100644
> index 00000000000..deb0c0df3c7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-11.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +extern int bar (void);
> +
> +int
> +foo (void)
> +{
> +  return bar ();
> +}
> +
> +/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*bar@GOTPCREL" { target { ! 
> ia32 } } } } */
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOT, " { target ia32 } } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-12-x32.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-12-x32.c
> new file mode 100644
> index 00000000000..534ddab2344
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-12-x32.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-require-effective-target maybe_x32 } */
> +/* { dg-options "-O2 -mx32 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +#include "pr118713-12.c"
> +
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOTPCREL" } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-12.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-12.c
> new file mode 100644
> index 00000000000..333b9c813e5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-12.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +extern int bar (void);
> +
> +int
> +foo (void)
> +{
> +  return bar () + 1;
> +}
> +
> +/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*bar@GOTPCREL" { target { ! 
> ia32 } } } } */
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOT, " { target ia32 } } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-2-x32.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-2-x32.c
> new file mode 100644
> index 00000000000..4af932e68ed
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-2-x32.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-require-effective-target maybe_x32 } */
> +/* { dg-options "-O2 -mx32 -fpic -fno-plt -mindirect-branch-register" } */
> +
> +#include "pr118713-2.c"
> +
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOTPCREL" } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-2.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-2.c
> new file mode 100644
> index 00000000000..807724e0310
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-2.c
> @@ -0,0 +1,15 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch-register" } */
> +
> +extern void bar (void);
> +
> +int
> +foo (void)
> +{
> +  bar ();
> +  return 0;
> +}
> +
> +/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*bar@GOTPCREL" { target { ! 
> ia32 } } } } */
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOT\\(" { target ia32 } } } 
> */
> +/* { dg-final { scan-assembler "call\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-3-x32.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-3-x32.c
> new file mode 100644
> index 00000000000..90a0e66a10c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-3-x32.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-require-effective-target maybe_x32 } */
> +/* { dg-options "-O2 -mx32 -fpic -fno-plt -mindirect-branch-register" } */
> +
> +#include "pr118713-3.c"
> +
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOTPCREL" } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-3.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-3.c
> new file mode 100644
> index 00000000000..1cd3fcbdf66
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-3.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch-register" } */
> +
> +extern int bar (void);
> +
> +int
> +foo (void)
> +{
> +  return bar ();
> +}
> +
> +/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*bar@GOTPCREL" { target { ! 
> ia32 } } } } */
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOT\\(" { target ia32 } } } 
> */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-4-x32.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-4-x32.c
> new file mode 100644
> index 00000000000..7f02f6003ea
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-4-x32.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-require-effective-target maybe_x32 } */
> +/* { dg-options "-O2 -mx32 -fpic -fno-plt -mindirect-branch-register" } */
> +
> +#include "pr118713-4.c"
> +
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOTPCREL" } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-4.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-4.c
> new file mode 100644
> index 00000000000..86d13b73bfc
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-4.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fpic -fno-plt -mindirect-branch-register" } */
> +
> +extern int bar (void);
> +
> +int
> +foo (void)
> +{
> +  return bar () + 1;
> +}
> +
> +/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*bar@GOTPCREL" { target { ! 
> ia32 } } } } */
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOT\\(" { target ia32 } } } 
> */
> +/* { dg-final { scan-assembler "call\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-5-x32.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-5-x32.c
> new file mode 100644
> index 00000000000..dfaf247ce06
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-5-x32.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-require-effective-target maybe_x32 } */
> +/* { dg-options "-O2 -mx32 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +#include "pr118713-5.c"
> +
> +/* { dg-final { scan-assembler "movl\[ \t\]*\\\$bar, " } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-5.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-5.c
> new file mode 100644
> index 00000000000..7b1f8c17c2d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-5.c
> @@ -0,0 +1,13 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +extern void bar (void) __attribute__((visibility("hidden")));
> +
> +void
> +foo (void)
> +{
> +  bar ();
> +}
> +
> +/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*\\\$bar, " } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-6-x32.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-6-x32.c
> new file mode 100644
> index 00000000000..f728b15db77
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-6-x32.c
> @@ -0,0 +1,15 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-require-effective-target maybe_x32 } */
> +/* { dg-options "-O2 -mx32 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +extern void bar (void) __attribute__((visibility("hidden")));
> +
> +int
> +foo (void)
> +{
> +  bar ();
> +  return 0;
> +}
> +
> +/* { dg-final { scan-assembler "movl\[ \t\]*\\\$bar, " } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-6.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-6.c
> new file mode 100644
> index 00000000000..a4f3b68f3e7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-6.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +extern void bar (void) __attribute__((visibility("hidden")));
> +
> +int
> +foo (void)
> +{
> +  bar ();
> +  return 0;
> +}
> +
> +/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*\\\$bar, " } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-7-x32.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-7-x32.c
> new file mode 100644
> index 00000000000..443930cc6f1
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-7-x32.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-require-effective-target maybe_x32 } */
> +/* { dg-options "-O2 -mx32 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +#include "pr118713-7.c"
> +
> +/* { dg-final { scan-assembler "movl\[ \t\]*\\\$bar, " } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-7.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-7.c
> new file mode 100644
> index 00000000000..fdc0db951bf
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-7.c
> @@ -0,0 +1,13 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +extern int bar (void) __attribute__((visibility("hidden")));
> +
> +int
> +foo (void)
> +{
> +  return bar ();
> +}
> +
> +/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*\\\$bar, " } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-8-x32.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-8-x32.c
> new file mode 100644
> index 00000000000..5dd873502d3
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-8-x32.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-require-effective-target maybe_x32 } */
> +/* { dg-options "-O2 -mx32 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +#include "pr118713-8.c"
> +
> +/* { dg-final { scan-assembler "movl\[ \t\]*\\\$bar, " } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-8.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-8.c
> new file mode 100644
> index 00000000000..03d5f008e0d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-8.c
> @@ -0,0 +1,13 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +extern int bar (void) __attribute__((visibility("hidden")));
> +
> +int
> +foo (void)
> +{
> +  return bar () + 1;
> +}
> +
> +/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*\\\$bar, " } } */
> +/* { dg-final { scan-assembler "call\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-9-x32.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-9-x32.c
> new file mode 100644
> index 00000000000..85819aa3380
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-9-x32.c
> @@ -0,0 +1,8 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-require-effective-target maybe_x32 } */
> +/* { dg-options "-O2 -mx32 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +#include "pr118713-9.c"
> +
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOTPCREL" } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*\\*%" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr118713-9.c 
> b/gcc/testsuite/gcc.target/i386/pr118713-9.c
> new file mode 100644
> index 00000000000..365f65fb194
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr118713-9.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fno-pic -fno-plt -mindirect-branch-register" } */
> +
> +extern void bar (void);
> +
> +void
> +foo (void)
> +{
> +  bar ();
> +}
> +
> +/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*bar@GOTPCREL" { target { ! 
> ia32 } } } } */
> +/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOT, " { target ia32 } } } */
> +/* { dg-final { scan-assembler "jmp\[ \t\]*\\*%" } } */
> --
> 2.48.1
>

Reply via email to