> -----Original Message----- > From: Richard Earnshaw > Sent: Wednesday, November 13, 2013 17:49 > To: Joey Ye > Cc: gcc-patches@gcc.gnu.org > Subject: Re: [patch] [arm] New option for PIC offset unfixed > > On 13/11/13 06:18, Joey Ye wrote: > >> -----Original Message----- > >> From: Richard Earnshaw > >> Sent: Tuesday, November 12, 2013 18:49 > >> To: Joey Ye > >> Cc: gcc-patches@gcc.gnu.org > >> Subject: Re: [patch] [arm] New option for PIC offset unfixed > >> > >> The name of the option and the documentation highlights that the > >> option's concept is confusing. > >> > >> I think what you really need to do is to reverse the sense of the > >> option name and have > >> > >> -mpic-data-is-text-relative > >> > >> with the inverse (-mno-pic-data-is-text-relative) being the active > >> value that triggers for vxworks. That is, PIC data being > >> text-relative is the default for all targets except vxworks. > >> > >> R. > >> > >> Oh, and at run time, we should be talking about segments, not sections! > > Richard, Thanks for quick response. > > > > Updated patch renamed the option, variables and macro. Also use > > segments in document. OK? > > > > 2013-11-13 Joey Ye <joey...@arm.com> > > > > * config/arm/arm.c (arm_option_override): Error if > > -mpic-data-is-text-relative without -fpic, and set for > > VxWorks RTP. > > (legitimize_pic_address): Use arm_pic_data_is_text_relative > > (arm_assemble_integer): Likewise. > > * config/arm/arm.h > > (TARGET_DEFAULT_PIC_DATA_IS_TEXT_RELATIVE): New macro. > > * config/arm/arm.opt (mpic-data-is-text-relative): New option. > > * doc/invoke.texi (-mpic-data-is-text-relative): Doc for new option. > > > > > > pic_data_text_rel-1113.patch.txt > > > > > > diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index > > 7757e86..fdd5684 100644 > > --- a/gcc/config/arm/arm.c > > +++ b/gcc/config/arm/arm.c > > @@ -2504,6 +2504,13 @@ arm_option_override (void) > > arm_pic_register = pic_register; > > } > > > > + if (TARGET_VXWORKS_RTP) > > + arm_pic_data_is_text_relative = 0; > > Why is this needed? Surely, even a VxWorks user should have the right to > force the compiler to behave differently. You've set things up through the > default, now just accept what the user has asked for. The reason is that TARGET_VXWORKS_RTP isn't a compile time value to initiate arm.opt. Instead it is true only when -mrtp is specified in runtime. Also enable text relative may result in runtime error on vxworks, it is better to prevent it here. > > > > + > > + if (arm_pic_data_is_text_relative != > TARGET_DEFAULT_PIC_DATA_IS_TEXT_RELATIVE > > + && !flag_pic) > > + error ("-mpic-data-is-text-relative must be used with -fpic"); > > I'm not sure about this either. The option should just be ignored when not > PIC. It is ignored if -fpic isn't given. I'm OK to remove the error here, while Ramana preferred to error it.
> > > + > > /* Enable -mfix-cortex-m3-ldrd by default for Cortex-M3 cores. */ > > if (fix_cm3_ldrd == 2) > > { > > @@ -6020,7 +6027,7 @@ legitimize_pic_address (rtx orig, enum > machine_mode mode, rtx reg) > > || (GET_CODE (orig) == SYMBOL_REF && > > SYMBOL_REF_LOCAL_P (orig))) > > && NEED_GOT_RELOC > > - && !TARGET_VXWORKS_RTP) > > + && arm_pic_data_is_text_relative) > > insn = arm_pic_static_addr (orig, reg); > > else > > { > > @@ -21498,7 +21505,7 @@ arm_assemble_integer (rtx x, unsigned int size, > int aligned_p) > > { > > /* See legitimize_pic_address for an explanation of the > > TARGET_VXWORKS_RTP check. */ > > - if (TARGET_VXWORKS_RTP > > + if (!arm_pic_data_is_text_relative > > || (GET_CODE (x) == SYMBOL_REF && !SYMBOL_REF_LOCAL_P > (x))) > > fputs ("(GOT)", asm_out_file); > > else > > diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index > > 1781b75..dbd841e 100644 > > --- a/gcc/config/arm/arm.h > > +++ b/gcc/config/arm/arm.h > > @@ -568,6 +568,10 @@ extern int prefer_neon_for_64bits; > > #define NEED_PLT_RELOC 0 > > #endif > > > > +#ifndef TARGET_DEFAULT_PIC_DATA_IS_TEXT_RELATIVE > > +#define TARGET_DEFAULT_PIC_DATA_IS_TEXT_RELATIVE 1 #endif > > + > > /* Nonzero if we need to refer to the GOT with a PC-relative > > offset. In other words, generate > > > > diff --git a/gcc/config/arm/arm.opt b/gcc/config/arm/arm.opt index > > 9b74038..fa0839a 100644 > > --- a/gcc/config/arm/arm.opt > > +++ b/gcc/config/arm/arm.opt > > @@ -158,6 +158,10 @@ mlong-calls > > Target Report Mask(LONG_CALLS) > > Generate call insns as indirect calls, if necessary > > > > +mpic-data-is-text-relative > > +Target Report Var(arm_pic_data_is_text_relative) > > +Init(TARGET_DEFAULT_PIC_DATA_IS_TEXT_RELATIVE) > > +Assume data segments are relative to text segment. > ^ > Assume data segment will be loaded at a fixed relative offset to the text > segment. Accepted > > > + > > mpic-register= > > Target RejectNegative Joined Var(arm_pic_register_string) Specify > > the register to be used for PIC addressing diff --git > > a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 863e518..298fcc3 > > 100644 > > --- a/gcc/doc/invoke.texi > > +++ b/gcc/doc/invoke.texi > > @@ -12120,6 +12120,12 @@ before execution begins. > > Specify the register to be used for PIC addressing. The default is > > R10 unless stack-checking is enabled, when R9 is used. > > > > +@item -mpic-data-is-text-relative > > +@opindex mpic-data-is-text-relative > > +Assume that each data segments are relative to text segment at load time. > > > +Therefore, prevent PC relative and GOTOFF style relocations to > > +reference data. > > I think the sense of this sentence is now backwards. I'd also try to avoid > GOTOFF in the user part of the manual. How about "Therefore, prevent addressing data with relocation types that doesn't apply in such circumstance." > > > This is on by default for targets other than VxWorks RTP. > > + > > @item -mpoke-function-name > > @opindex mpoke-function-name > > Write the name of each function into the text section, directly > > > > R.