From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 66863 invoked by alias); 1 Feb 2016 00:38:55 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 66838 invoked by uid 89); 1 Feb 2016 00:38:53 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 spammy=similarity, recompiling, FPRs, fprs X-HELO: mail-pf0-f182.google.com Received: from mail-pf0-f182.google.com (HELO mail-pf0-f182.google.com) (209.85.192.182) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Mon, 01 Feb 2016 00:38:51 +0000 Received: by mail-pf0-f182.google.com with SMTP id n128so72891241pfn.3 for ; Sun, 31 Jan 2016 16:38:50 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-type:content-disposition:in-reply-to :user-agent; bh=ZcIDqcCIKRUqsYT/jPDnQHB8zBJpgo/TcQsYeNrUWZA=; b=hbPdT0ARGcZGmOCoHVN3ogwJLujdzR6jjknm11/6MzTvtVD/20kW2kFAHBnW61gBvj GnO6oQY7fsKaiS57zniDHXqLzWrY/eXf29oGICub9BX68ld6hblfagg22pEBkJdUL3c0 ZAYMvKHjSjYNutJZzVgxBwAPK+Wxt72eY2FBHDHH8jDFOCyEoUGOIfM3X7h26veDK6Ut OOEPgL85EQK2qDLcrihAtgEaHxAlRzTFPEap5bRCVh3o63L/jyis/PC64Z+AZD3GcSUX cJIwpO8BJJ4h6UMLSWk0z3gYL6IrbGmdv7V/IopYAhUmQ+qv+chSXKqIs5Iv1H3UsMS6 tIBw== X-Gm-Message-State: AG10YORSUG9Qyyy2uloDM1oqb9owsTNjSmTFkioaQ6SYkVISbqGBlVgHIMIKw4bS6qzq+Q== X-Received: by 10.98.42.74 with SMTP id q71mr33216909pfq.18.1454287129341; Sun, 31 Jan 2016 16:38:49 -0800 (PST) Received: from bubble.grove.modra.org (CPE-58-160-163-67.gqzg1.fli.bigpond.net.au. [58.160.163.67]) by smtp.gmail.com with ESMTPSA id b63sm38423349pfj.25.2016.01.31.16.38.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 31 Jan 2016 16:38:48 -0800 (PST) Received: by bubble.grove.modra.org (Postfix, from userid 1000) id 0D128EA017B; Mon, 1 Feb 2016 11:08:43 +1030 (ACDT) Date: Mon, 01 Feb 2016 00:38:00 -0000 From: Alan Modra To: gcc-patches@gcc.gnu.org Cc: David Edelsohn Subject: Re: [RS6000] ABI_V4 init of toc section Message-ID: <20160201003843.GY17028@bubble.grove.modra.org> References: <20160129163824.GQ17028@bubble.grove.modra.org> <20160130094408.GR17028@bubble.grove.modra.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160130094408.GR17028@bubble.grove.modra.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-IsSubscribed: yes X-SW-Source: 2016-02/txt/msg00002.txt.bz2 This is the more comprehensive fix for PR68662, the one I'm a little nervous about applying during stage4. OK for when stage1 opens? Applying this patch makes https://gcc.gnu.org/ml/gcc-patches/2016-01/msg02325.html redundant, but I'm inclined to leave it in: Not initializing the toc symbol at file start results in smaller assembly and object files when the TOC is not used. ================= For ABI_V4, -mrelocatable and -fPIC both generate position independent code, with some extra "fixup" output for -mrelocatable. The similarity of these two options has led to the situation where the sysv4.h SUBTARGET_OVERRIDE_OPTIONS sets flag_pic on seeing -mrelocatable, and sets TARGET_RELOCATABLE on seeing -fPIC. That prevents LTO from properly optimizing position dependent executables, because the mutual dependence of the flags and the fact that LTO streaming records the state of rs6000_isa_flags, result in flag_pic being set when it shouldn't be. So, don't set TARGET_RELOCATABLE when -fPIC. Places that currently test TARGET_RELOCATABLE can instead test TARGET_RELOCATABLE || (DEFAULT_ABI == ABI_V4 && flag_pic > 1) or since TARGET_RELOCATABLE can only be enabled when ABI_V4, DEFAULT_ABI == ABI_V4 && (TARGET_RELOCATABLE || flag_pic > 1). Also, since flag_pic is set by -mrelocatable, a number of places that currently test TARGET_RELOCATABLE can be simplified. I also made -mrelocatable set TARGET_NO_FP_IN_TOC, allowing TARGET_RELOCATABLE to be removed from ASM_OUTPUT_SPECIAL_POOL_ENTRY_P. Reducing occurrences of TARGET_RELOCATABLE is a good thing. PR target/68662 * config/rs6000/sysv4.h (SUBTARGET_OVERRIDE_OPTIONS): Don't set OPTION_MASK_RELOCATABLE when flag_pic == 2. Set TARGET_NO_FP_IN_TOC for -mrelocatable. (MINIMAL_TOC_SECTION_ASM_OP): Remove redundant TARGET_RELOCATABLE test. (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Likewise. (ASM_PREFERRED_EH_DATA_FORMAT): Likewise. * config/rs6000/linux64.h (MINIMAL_TOC_SECTION_ASM_OP): Likewise. (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Likewise. (ASM_PREFERRED_EH_DATA_FORMAT): Likewise. * config/rs6000/freebsd64.h (MINIMAL_TOC_SECTION_ASM_OP): Likewise. (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Likewise. (ASM_PREFERRED_EH_DATA_FORMAT): Likewise. * config/rs6000/predicates.md (easy_fp_constant): Likewise. * config/rs6000/rs6000.c (rs6000_elf_output_toc_section_asm_op): Likewise. (rs6000_assemble_integer): Update TARGET_RELOCATABLE test. (rs6000_stack_info): Likewise. (rs6000_elf_asm_out_constructor): Likewise. (rs6000_elf_asm_out_destructor): Likewise. (rs6000_elf_declare_function_name): Likewise. * config/rs6000/rs6000.md (load_toc_aix_di): Likewise. * config/rs6000/rs6000.h (MASK_RELOCATABLE, MASK_MINIMAL_TOC): Don't define. diff --git a/gcc/config/rs6000/freebsd64.h b/gcc/config/rs6000/freebsd64.h index 899b858..3038c43 100644 --- a/gcc/config/rs6000/freebsd64.h +++ b/gcc/config/rs6000/freebsd64.h @@ -349,7 +349,7 @@ extern int dot_symbols; true if the symbol may be affected by dynamic relocations. */ #undef ASM_PREFERRED_EH_DATA_FORMAT #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ - ((TARGET_64BIT || flag_pic || TARGET_RELOCATABLE) \ + (TARGET_64BIT || flag_pic \ ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel \ | (TARGET_64BIT ? DW_EH_PE_udata8 : DW_EH_PE_sdata4)) \ : DW_EH_PE_absptr) @@ -384,7 +384,7 @@ extern int dot_symbols; #define MINIMAL_TOC_SECTION_ASM_OP \ (TARGET_64BIT \ ? "\t.section\t\".toc1\",\"aw\"" \ - : ((TARGET_RELOCATABLE || flag_pic) \ + : (flag_pic \ ? "\t.section\t\".got2\",\"aw\"" \ : "\t.section\t\".got1\",\"aw\"")) @@ -422,7 +422,6 @@ extern int dot_symbols; && ! TARGET_NO_FP_IN_TOC))) \ || (!TARGET_64BIT \ && !TARGET_NO_FP_IN_TOC \ - && !TARGET_RELOCATABLE \ && SCALAR_FLOAT_MODE_P (GET_MODE (X)) \ && BITS_PER_WORD == HOST_BITS_PER_INT))))) diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h index fefa0c4..e86b5d5 100644 --- a/gcc/config/rs6000/linux64.h +++ b/gcc/config/rs6000/linux64.h @@ -489,7 +489,7 @@ extern int dot_symbols; #define MINIMAL_TOC_SECTION_ASM_OP \ (TARGET_64BIT \ ? "\t.section\t\".toc1\",\"aw\"" \ - : ((TARGET_RELOCATABLE || flag_pic) \ + : (flag_pic \ ? "\t.section\t\".got2\",\"aw\"" \ : "\t.section\t\".got1\",\"aw\"")) @@ -585,7 +585,6 @@ extern int dot_symbols; && ! TARGET_NO_FP_IN_TOC))) \ || (!TARGET_64BIT \ && !TARGET_NO_FP_IN_TOC \ - && !TARGET_RELOCATABLE \ && SCALAR_FLOAT_MODE_P (GET_MODE (X)) \ && BITS_PER_WORD == HOST_BITS_PER_INT))))) @@ -594,7 +593,7 @@ extern int dot_symbols; true if the symbol may be affected by dynamic relocations. */ #undef ASM_PREFERRED_EH_DATA_FORMAT #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ - ((TARGET_64BIT || flag_pic || TARGET_RELOCATABLE) \ + (TARGET_64BIT || flag_pic \ ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel \ | (TARGET_64BIT ? DW_EH_PE_udata8 : DW_EH_PE_sdata4)) \ : DW_EH_PE_absptr) diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index 302303c..ef104d5 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -538,13 +538,6 @@ if (flag_pic && DEFAULT_ABI == ABI_V4) return 0; -#ifdef TARGET_RELOCATABLE - /* Similarly if we are using -mrelocatable, consider all constants - to be hard. */ - if (TARGET_RELOCATABLE) - return 0; -#endif - /* If we have real FPRs, consider floating point constants hard (other than 0.0 under VSX), so that the constant gets pushed to memory during the early RTL phases. This has the advantage that double precision constants diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 4ea4efb..1befd58 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -20404,7 +20404,8 @@ rs6000_assemble_integer (rtx x, unsigned int size, int aligned_p) don't need to mark it here. We used to skip the text section, but it should never be valid for relocated addresses to be placed in the text section. */ - if (TARGET_RELOCATABLE + if (DEFAULT_ABI == ABI_V4 + && (TARGET_RELOCATABLE || flag_pic > 1) && in_section != toc_section && !recurse && !CONST_SCALAR_INT_P (x) @@ -23599,7 +23600,9 @@ rs6000_stack_info (void) && !TARGET_PROFILE_KERNEL) || (DEFAULT_ABI == ABI_V4 && cfun->calls_alloca) #ifdef TARGET_RELOCATABLE - || (TARGET_RELOCATABLE && (get_pool_size () != 0)) + || (DEFAULT_ABI == ABI_V4 + && (TARGET_RELOCATABLE || flag_pic > 1) + && (get_pool_size () != 0)) #endif || rs6000_ra_ever_killed ()) info_ptr->lr_save_p = 1; @@ -31067,30 +31070,30 @@ rs6000_ms_bitfield_layout_p (const_tree record_type) static void rs6000_elf_output_toc_section_asm_op (const void *data ATTRIBUTE_UNUSED) { - if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2) - && TARGET_MINIMAL_TOC - && !TARGET_RELOCATABLE) + if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2) { - if (!toc_initialized) + if (TARGET_MINIMAL_TOC) { - toc_initialized = 1; - fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP); - (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0); - fprintf (asm_out_file, "\t.tc "); - ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],"); - ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); - fprintf (asm_out_file, "\n"); - - fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP); - ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); - fprintf (asm_out_file, " = .+32768\n"); + if (!toc_initialized) + { + toc_initialized = 1; + fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP); + (*targetm.asm_out.internal_label) (asm_out_file, "LCTOC", 0); + fprintf (asm_out_file, "\t.tc "); + ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1[TC],"); + ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); + fprintf (asm_out_file, "\n"); + + fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP); + ASM_OUTPUT_INTERNAL_LABEL_PREFIX (asm_out_file, "LCTOC1"); + fprintf (asm_out_file, " = .+32768\n"); + } + else + fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP); } else - fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP); + fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP); } - else if ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2) - && !TARGET_RELOCATABLE) - fprintf (asm_out_file, "%s\n", TOC_SECTION_ASM_OP); else { fprintf (asm_out_file, "%s\n", MINIMAL_TOC_SECTION_ASM_OP); @@ -31672,7 +31675,8 @@ rs6000_elf_asm_out_constructor (rtx symbol, int priority) switch_to_section (get_section (section, SECTION_WRITE, NULL)); assemble_align (POINTER_SIZE); - if (TARGET_RELOCATABLE) + if (DEFAULT_ABI == ABI_V4 + && (TARGET_RELOCATABLE || flag_pic > 1)) { fputs ("\t.long (", asm_out_file); output_addr_const (asm_out_file, symbol); @@ -31702,7 +31706,8 @@ rs6000_elf_asm_out_destructor (rtx symbol, int priority) switch_to_section (get_section (section, SECTION_WRITE, NULL)); assemble_align (POINTER_SIZE); - if (TARGET_RELOCATABLE) + if (DEFAULT_ABI == ABI_V4 + && (TARGET_RELOCATABLE || flag_pic > 1)) { fputs ("\t.long (", asm_out_file); output_addr_const (asm_out_file, symbol); @@ -31744,7 +31749,8 @@ rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl) return; } - if (TARGET_RELOCATABLE + if (DEFAULT_ABI == ABI_V4 + && (TARGET_RELOCATABLE || flag_pic > 1) && !TARGET_SECURE_PLT && (get_pool_size () != 0 || crtl->profile) && uses_TOC ()) diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 8c6bd07..94606aa 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -635,18 +635,10 @@ extern int rs6000_vector_align[]; #define MASK_64BIT OPTION_MASK_64BIT #endif -#ifdef TARGET_RELOCATABLE -#define MASK_RELOCATABLE OPTION_MASK_RELOCATABLE -#endif - #ifdef TARGET_LITTLE_ENDIAN #define MASK_LITTLE_ENDIAN OPTION_MASK_LITTLE_ENDIAN #endif -#ifdef TARGET_MINIMAL_TOC -#define MASK_MINIMAL_TOC OPTION_MASK_MINIMAL_TOC -#endif - #ifdef TARGET_REGNAMES #define MASK_REGNAMES OPTION_MASK_REGNAMES #endif diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index fe19853..563d92c 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -9496,12 +9496,8 @@ char buf[30]; extern int need_toc_init; need_toc_init = 1; -#ifdef TARGET_RELOCATABLE ASM_GENERATE_INTERNAL_LABEL (buf, \"LCTOC\", - !TARGET_MINIMAL_TOC || TARGET_RELOCATABLE); -#else - ASM_GENERATE_INTERNAL_LABEL (buf, \"LCTOC\", 1); -#endif + !TARGET_ELF || !TARGET_MINIMAL_TOC); if (TARGET_ELF) strcat (buf, \"@toc\"); operands[1] = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf)); diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h index cbf9097..a4009c3 100644 --- a/gcc/config/rs6000/sysv4.h +++ b/gcc/config/rs6000/sysv4.h @@ -192,16 +192,25 @@ do { \ error ("-msecure-plt not supported by your assembler"); \ } \ \ - /* Treat -fPIC the same as -mrelocatable. */ \ if (flag_pic > 1 && DEFAULT_ABI == ABI_V4) \ { \ - rs6000_isa_flags |= OPTION_MASK_RELOCATABLE | OPTION_MASK_MINIMAL_TOC; \ + /* Note: flag_pic should not change any option flags that would \ + be invalid with or pessimise -fno-PIC code. LTO turns off \ + flag_pic when linking/recompiling a fixed position executable. \ + However, if the objects were originally compiled with -fPIC, \ + then other target options forced on here by -fPIC are restored \ + when recompiling those objects without -fPIC. In particular \ + TARGET_RELOCATABLE must not be enabled here by flag_pic. */ \ + rs6000_isa_flags |= OPTION_MASK_MINIMAL_TOC; \ TARGET_NO_FP_IN_TOC = 1; \ } \ \ - else if (TARGET_RELOCATABLE) \ - if (!flag_pic) \ - flag_pic = 2; \ + if (TARGET_RELOCATABLE) \ + { \ + if (!flag_pic) \ + flag_pic = 2; \ + TARGET_NO_FP_IN_TOC = 1; \ + } \ } while (0) #ifndef RS6000_BI_ARCH @@ -317,8 +326,7 @@ do { \ /* Put PC relative got entries in .got2. */ #define MINIMAL_TOC_SECTION_ASM_OP \ - (TARGET_RELOCATABLE || (flag_pic && DEFAULT_ABI == ABI_V4) \ - ? "\t.section\t\".got2\",\"aw\"" : "\t.section\t\".got1\",\"aw\"") + (flag_pic ? "\t.section\t\".got2\",\"aw\"" : "\t.section\t\".got1\",\"aw\"") #define SDATA_SECTION_ASM_OP "\t.section\t\".sdata\",\"aw\"" #define SDATA2_SECTION_ASM_OP "\t.section\t\".sdata2\",\"a\"" @@ -352,7 +360,6 @@ do { \ || (GET_CODE (X) == CONST_INT \ && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode)) \ || (!TARGET_NO_FP_IN_TOC \ - && !TARGET_RELOCATABLE \ && GET_CODE (X) == CONST_DOUBLE \ && SCALAR_FLOAT_MODE_P (GET_MODE (X)) \ && BITS_PER_WORD == HOST_BITS_PER_INT))) @@ -941,9 +948,10 @@ ncrtn.o%s" /* Select a format to encode pointers in exception handling data. CODE is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is true if the symbol may be affected by dynamic relocations. */ -#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \ - ((flag_pic || TARGET_RELOCATABLE) \ - ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4) \ +#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ + (flag_pic \ + ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel \ + | DW_EH_PE_sdata4) \ : DW_EH_PE_absptr) #define DOUBLE_INT_ASM_OP "\t.quad\t" -- Alan Modra Australia Development Lab, IBM