diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index f18451d3663..27c1d8dd73e 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -235,14 +235,9 @@ pic_label_operand (op, mode) { case LABEL_REF: return 1; - case SYMBOL_REF: - return (read_only_operand (op) && !FUNCTION_NAME_P (XSTR (op, 0))); case CONST: op = XEXP (op, 0); - return (((GET_CODE (XEXP (op, 0)) == SYMBOL_REF - && read_only_operand (XEXP (op, 0)) - && !FUNCTION_NAME_P (XSTR (XEXP (op, 0), 0))) - || GET_CODE (XEXP (op, 0)) == LABEL_REF) + return (GET_CODE (XEXP (op, 0)) == LABEL_REF && GET_CODE (XEXP (op, 1)) == CONST_INT); default: return 0; @@ -477,7 +472,7 @@ legitimize_pic_address (orig, mode, reg) { rtx pic_ref = orig; - /* Lables and read-only data need special handling. */ + /* Lables need special handling. */ if (pic_label_operand (orig)) { emit_insn (gen_pic_load_label (reg, orig)); diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index de602f26fc2..1bd3bd1d98a 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -1728,10 +1728,19 @@ do { fprintf (FILE, "\t.SPACE $PRIVATE$\n\ #define EXTRA_SECTIONS in_bss, in_readonly_data -/* FIXME: GAS doesn't grok expressions involving two symbols in different - segments (aka subspaces). Two avoid creating such expressions, we place - readonly data into the $CODE$ subspace when generating PIC code. If - GAS ever handles such expressions, this hack can disappear. */ +/* FIXME: HPUX ld generates incorrect GOT entries for "T" fixups + which reference data within the $TEXT$ space (for example constant + strings in the $LIT$ subspace). + + The assemblers (GAS and HP as) both have problems with handling + the difference of two symbols which is the other correct way to + reference constant data during PIC code generation. + + So, there's no way to reference constant data which is in the + $TEXT$ space during PIC generation. Instead place all constant + data into the $PRIVATE$ subspace (this reduces sharing, but it + works correctly). */ + #define EXTRA_SECTION_FUNCTIONS \ void \ bss_section () \ @@ -1748,7 +1757,7 @@ readonly_data () \ if (in_section != in_readonly_data) \ { \ if (flag_pic) \ - fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP); \ + fprintf (asm_out_file, "%s\n", DATA_SECTION_ASM_OP); \ else \ fprintf (asm_out_file, "%s\n", READONLY_DATA_ASM_OP); \ in_section = in_readonly_data; \