Browse Source

gcc: fix ICEs generating PIEs

pull/6/head
Andrew Waterman 12 years ago
parent
commit
4f47e204fb
  1. 6
      gcc/gcc/config/riscv/riscv-protos.h
  2. 6
      gcc/gcc/config/riscv/riscv.c
  3. 14
      gcc/gcc/config/riscv/riscv.md

6
gcc/gcc/config/riscv/riscv-protos.h

@ -26,9 +26,11 @@ enum mips_symbol_type {
SYMBOL_ABSOLUTE,
SYMBOL_GOT_DISP,
SYMBOL_TLS,
SYMBOL_TLS_LE
SYMBOL_TLS_LE,
SYMBOL_TLS_IE,
SYMBOL_TLS_GD
};
#define NUM_SYMBOL_TYPES (SYMBOL_TLS_LE + 1)
#define NUM_SYMBOL_TYPES (SYMBOL_TLS_GD + 1)
extern bool mips_symbolic_constant_p (rtx, enum mips_symbol_type *);
extern int riscv_regno_mode_ok_for_base_p (int, enum machine_mode, bool);

6
gcc/gcc/config/riscv/riscv.c

@ -589,8 +589,7 @@ mips_symbolic_constant_p (rtx x, enum mips_symbol_type *symbol_type)
case SYMBOL_TLS_LE:
return (int32_t) INTVAL (offset) == INTVAL (offset);
case SYMBOL_TLS:
case SYMBOL_GOT_DISP:
default:
return false;
}
gcc_unreachable ();
@ -2873,7 +2872,10 @@ mips_init_relocs (void)
{
riscv_hi_relocs[SYMBOL_ABSOLUTE] = "%hi(";
riscv_lo_relocs[SYMBOL_ABSOLUTE] = "%lo(";
}
if (!flag_pic || flag_pie)
{
riscv_hi_relocs[SYMBOL_TLS_LE] = "%tprel_hi(";
riscv_lo_relocs[SYMBOL_TLS_LE] = "%tprel_lo(";
}

14
gcc/gcc/config/riscv/riscv.md

@ -33,10 +33,12 @@
UNSPEC_EH_RETURN
;; Symbolic accesses.
UNSPEC_ADDRESS_FIRST
UNSPEC_LOAD_GOT
UNSPEC_TLS_LE_ADD
UNSPEC_TLS_GD
UNSPEC_TLS
UNSPEC_TLS_LE
UNSPEC_TLS_IE
UNSPEC_TLS_GD
;; Blockage and synchronisation.
UNSPEC_BLOCKAGE
@ -1441,8 +1443,8 @@
(unspec:P [(match_operand:P 1 "register_operand" "r")
(match_operand:P 2 "register_operand" "r")
(match_operand:P 3 "symbolic_operand" "")]
UNSPEC_TLS_LE_ADD))]
"!flag_pic"
UNSPEC_TLS_LE))]
"!flag_pic || flag_pie"
"add\t%0,%1,%2,%%tprel_add(%3)"
[(set_attr "type" "arith")
(set_attr "mode" "<MODE>")])
@ -2386,7 +2388,3 @@
(include "sync.md")
(include "peephole.md")
(define_c_enum "unspec" [
UNSPEC_ADDRESS_FIRST
])

Loading…
Cancel
Save