diff options
Diffstat (limited to 'gcc/config/i386/i386.c')
-rw-r--r-- | gcc/config/i386/i386.c | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 86be390..dab8341 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -7268,7 +7268,7 @@ output_set_got (rtx dest, rtx label ATTRIBUTE_UNUSED) /* Output the Mach-O "canonical" label name ("Lxx$pb") here too. This is what will be referenced by the Mach-O PIC subsystem. */ if (!label) - ASM_OUTPUT_LABEL (asm_out_file, machopic_function_base_name ()); + ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME); #endif (*targetm.asm_out.internal_label) (asm_out_file, "L", @@ -7290,7 +7290,7 @@ output_set_got (rtx dest, rtx label ATTRIBUTE_UNUSED) is what will be referenced by the Mach-O PIC subsystem. */ #if TARGET_MACHO if (!label) - ASM_OUTPUT_LABEL (asm_out_file, machopic_function_base_name ()); + ASM_OUTPUT_LABEL (asm_out_file, MACHOPIC_FUNCTION_BASE_NAME); else targetm.asm_out.internal_label (asm_out_file, "L", CODE_LABEL_NUMBER (label)); @@ -8557,19 +8557,8 @@ ix86_address_cost (rtx x, bool speed ATTRIBUTE_UNUSED) static bool darwin_local_data_pic (rtx disp) { - if (GET_CODE (disp) == MINUS) - { - if (GET_CODE (XEXP (disp, 0)) == LABEL_REF - || GET_CODE (XEXP (disp, 0)) == SYMBOL_REF) - if (GET_CODE (XEXP (disp, 1)) == SYMBOL_REF) - { - const char *sym_name = XSTR (XEXP (disp, 1), 0); - if (! strcmp (sym_name, "<pic base>")) - return true; - } - } - - return false; + return (GET_CODE (disp) == UNSPEC + && XINT (disp, 1) == UNSPEC_MACHOPIC_OFFSET); } /* Determine if a given RTX is a valid constant. We already know this @@ -8710,6 +8699,8 @@ legitimate_pic_operand_p (rtx x) x = XVECEXP (inner, 0, 0); return (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_EXEC); + case UNSPEC_MACHOPIC_OFFSET: + return legitimate_pic_address_disp_p (x); default: return false; } @@ -8972,7 +8963,8 @@ legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED, reason_rtx = disp; if (GET_CODE (disp) == CONST - && GET_CODE (XEXP (disp, 0)) == UNSPEC) + && GET_CODE (XEXP (disp, 0)) == UNSPEC + && XINT (XEXP (disp, 0), 1) != UNSPEC_MACHOPIC_OFFSET) switch (XINT (XEXP (disp, 0), 1)) { /* Refuse GOTOFF and GOT in 64bit mode since it is always 64bit when @@ -9935,6 +9927,12 @@ output_pic_addr_const (FILE *file, rtx x, int code) case UNSPEC_INDNTPOFF: fputs ("@INDNTPOFF", file); break; +#if TARGET_MACHO + case UNSPEC_MACHOPIC_OFFSET: + putc ('-', file); + machopic_output_function_base_name (file); + break; +#endif default: output_operand_lossage ("invalid UNSPEC as operand"); break; @@ -10055,7 +10053,7 @@ ix86_delegitimize_address (rtx orig_x) if (TARGET_MACHO && darwin_local_data_pic (x) && !MEM_P (orig_x)) - result = XEXP (x, 0); + result = XVECEXP (x, 0, 0); if (! result) return orig_x; @@ -11167,6 +11165,13 @@ output_addr_const_extra (FILE *file, rtx x) output_addr_const (file, op); fputs ("@INDNTPOFF", file); break; +#if TARGET_MACHO + case UNSPEC_MACHOPIC_OFFSET: + output_addr_const (file, op); + putc ('-', file); + machopic_output_function_base_name (file); + break; +#endif default: return false; |