Hello Michael,

I have attached the patch as well,
(the same as in :
https://github.com/andrewsadek/microblaze-pic-data-text-rel/blob/pic_data_text_rel/PATCH_BUNDLE/gcc.patch)

On Thu, Mar 22, 2018 at 8:37 PM, Andrew Sadek <andrew.sadek...@gmail.com> wrote:
> Hello Michael,
>
> I have adapted the test cases.
>
> Please find the patch below with Change log, description and test results.
>
> Description:
> ------------------
>
> This branch is regarding a new implemented feature in GCC Microblaze
> that allows Position Independent Code to run using Data Text Relative
> addressing instead of using Global Offset Table.
>
> Its aim was to make 'PIC' more efficient and flexible as elf size
> excess/ performance overhead were noticed when using GOT due to the
> indirect addressing.
> The change was tested with the dhrystone benchmark on a real Hardware
> (Xilinx FPGA Spartan 6) and the test report went successfully for all
> optimization levels.
>
> Indeed, Microblaze does not support PC-relative addressing in Hardware like 
> ARM.
> The idea was to store the start address of current text section in
> 'r20' instead of GOT, in the function prologue. Correspondingly, data
> references will be an offset from the original reference value to the
> start of text thus being added to the 'r20' base register will resolve
> the actual address.
>
> Henceforth, 2 new relocations have been created:
> - 'R_MICROBLAZE_TEXTPCREL_64': resolves offset of current PC to start
> of text in order to set r20
> - 'R_MICROBLAZE_TEXTREL_64': resolves offset of mentioned data
> reference to start of text
>
> Accordingly, both assembler and linker (binutils) have been adapted.
>
> For extra details:
> https://github.com/andrewsadek/microblaze-pic-data-text-rel/blob/pic_data_text_rel/README.md
>
> Change Log:
> ---------------------
>
> 2018-03-22 Andrew Sadek  <andrew.sadek...@gmail.com>
>
>     Microblaze Target: PIC data text relative
>     * gcc/config/microblaze/microblaze.opt: add new option
> -mpic-data-text-rel.
>     * gcc/config/microblaze/microblaze-protos.h 
> (microblaze_constant_address_p):
>     Add microblaze_constant_address_p function instead of the macro in
> microblaze.h
>     * gcc/config/microblaze/microblaze.c (TARGET_PIC_DATA_TEXT_REL):
> New addressing mode
>     for data-text relative position indepenedent code.
>     (microblaze_classify_unspec): add 'UNSPEC_TEXT' case ->
> 'ADDRESS_SYMBOLIC_TXT_REL'.
>     (microblaze_classify_address): add handling for UNSPEC + CONST_INT.
>     (microblaze_legitimate_pic_operand): exclude function calls from
> pic operands
>     in case of TARGET_PIC_DATA_TEXT_REL option.
>     (microblaze_legitimize_address): generate 'UNSPEC_TEXT' for all possible
>     addresses cases.
>     (microblaze_address_insns): add 'ADDRESS_SYMBOLIC_TXT_REL' case.
>     (print_operand): add 'ADDRESS_SYMBOLIC_TXT_REL' case.
>     (print_operand_address): add 'ADDRESS_SYMBOLIC_TXT_REL' case + handling 
> for
>     'address + offset'.
>     (microblaze_expand_prologue): add new function prologue call for
> 'r20' assignation.
>     (microblaze_asm_generate_pic_addr_dif_vec): override new target hook
>    'TARGET_ASM_GENERATE_PIC_ADDR_DIFF_VEC' to disable address diff vector
>     table in case of TARGET_PIC_DATA_TEXT_REL.
>     (expand_pic_symbol_ref): add handling for 'UNSPEC_TEXT'.
>     * gcc/config/microblaze/microblaze.md (TARGET_PIC_DATA_TEXT_REL):
> Add new macros 'UNSPEC_TEXT',
>     'UNSPEC_SET_TEXT' + add rule for setting r20 in function prologue
> + exclude function calls
>     from 'UNSPEC_PLT' in case of data text relative mode.
>     * gcc/doc/tm.texi.in (TARGET_ASM_GENERATE_PIC_ADDR_DIFF_VEC): Add
> new target hook for generating
>     address diff vector tables in case of flag_pic.
>     * gcc/doc/tm.texi : Regenerate.
>     * gcc/stmt.c (TARGET_ASM_GENERATE_PIC_ADDR_DIFF_VEC): append new condition
>     'targetm.asm_out.generate_pic_addr_diff_vec' to flag_pic in case
> of addr diff vector generation.
>     * gcc/target.def (TARGET_ASM_GENERATE_PIC_ADDR_DIFF_VEC): add
> target hook definition.
>     * gcc/targhooks.h, gcc/targhooks.c 
> (TARGET_ASM_GENERATE_PIC_ADDR_DIFF_VEC):
>     add default function for generate_pic_addr_diff_vec -> flag_pic.
>     * gcc/doc/invoke.texi (Add new pic option): Add new microblaze pic
> option for data text relative.
>
>
> Test Results (using qemu microblaze little endian):
> ----------------------------------------------------------------------------
>
>         === gcc Summary ===
>
> # of expected passes        90874
> # of unexpected failures    1317
> # of unexpected successes    3
> # of expected failures        207
> # of unresolved testcases    115
> # of unsupported tests        2828
>
> Full summary:
> https://raw.githubusercontent.com/andrewsadek/microblaze-pic-data-text-rel/pic_data_text_rel/PATCH_BUNDLE/gcc.sum
>
> Patch:
> ----------
>
> Actually, I found that gmail transforms tabs to spaces even plain text
> mode, also I can not attach the patch as I receive error from
> sourceware server,
> so for now kindly find the patch in the link below,, if you have
> solution for that please advise.
>
>
> https://github.com/andrewsadek/microblaze-pic-data-text-rel/blob/pic_data_text_rel/PATCH_BUNDLE/gcc.patch
>
> On Tue, Mar 20, 2018 at 5:30 PM, Michael Eager <ea...@eagerm.com> wrote:
>> Hi Andrew --
>>
>> I just do a visual check.  The script can help.
>>
>> On 03/20/2018 07:13 AM, Andrew Sadek wrote:
>>>
>>> Many Thanks Michael for the updates .. I was actually looking for
>>> something
>>> similar for my test case .. I m currently revising the Gnu code
>>> conventions
>>> on the patches then will send them again.
>>> I m actually running the 'check_GNU_Style' in contrib folder,, is this the
>>> correct way ? Is it enough ?
>>>
>>> Andrew
>>>
>>> On Tue, Mar 20, 2018, 03:30 Michael Eager <ea...@eagerm.com> wrote:
>>>
>>>> Also check the { dg-skip-if } directive.
>>>> https://gcc.gnu.org/onlinedocs/gccint/Directives.html
>>>>
>>>> On 03/19/2018 06:14 PM, Michael Eager wrote:
>>>>>
>>>>> Hi Andrew --
>>>>>
>>>>> Please take a look at the test case description:
>>>>> https://gcc.gnu.org/wiki/HowToPrepareATestcase
>>>>> and see if you can do one of the following:
>>>>>     - Modify the regex expression in the scan-assembler to accept
>>>>>       either format of generated output
>>>>> or
>>>>>     - Add { dg-option } directives to turn off your new options
>>>>>       if specified.  (You should be able to specify -mno-pic....)
>>>>> or
>>>>>     - Duplicate the test cases and add { dg-option } directives
>>>>>       to specify the correct options, with and without your
>>>>>       new options.
>>>>> or
>>>>>     - Add test cases with a { dg-option } directive with your
>>>>>       new options.
>>>>>
>>>>> This is not required -- your patch appears to work OK.  Normally,
>>>>> the new PIC Data options would not be used when running the test
>>>>> suite, so the tests would not fail.  It's just nice to have the
>>>>> test suite updated when new options are added.
>>>>>
>>>>> On 03/19/2018 01:07 PM, Michael Eager wrote:
>>>>>>
>>>>>> Hi Andrew --
>>>>>>
>>>>>> Good work.
>>>>>>
>>>>>> Please submit your updated patch.  Check that you follow
>>>>>> GNU coding standards.  Also make sure that the new options
>>>>>> are documented in gcc/doc/invoke.texi.
>>>>>>
>>>>>> On 03/18/18 03:27, Andrew Sadek wrote:
>>>>>>>
>>>>>>> Hello Michael,
>>>>>>>
>>>>>>> I have run the test using the new PIC options.
>>>>>>> Actually, I have discovered 2 unhandled cases in
>>>>>>> 'microblaze_expand_move' + missing conditions in linker relax
>>>>>>> leading some test cases execution to fail.
>>>>>>> After fixing them, I made a re-run for the whole regression, and the
>>>>>>> results analogy below:
>>>>>>>
>>>>>>> Original, without my patch:
>>>>>>>           === gcc Summary ===
>>>>>>>
>>>>>>> # of expected passes        90776
>>>>>>> # of unexpected failures    1317
>>>>>>> # of unexpected successes    3
>>>>>>> # of expected failures        207
>>>>>>> # of unresolved testcases    115
>>>>>>> # of unsupported tests        2828
>>>>>>>
>>>>>>> With my patch, calling '-fPIE - mpic-data-text-rel'
>>>>>>>           === gcc Summary ===
>>>>>>>
>>>>>>> # of expected passes        90843
>>>>>>> # of unexpected failures    1256
>>>>>>> # of unexpected successes    3
>>>>>>> # of expected failures        207
>>>>>>> # of unresolved testcases    115
>>>>>>> # of unsupported tests        2853
>>>>>>>
>>>>>>> After running the 'dg-cmp-results.sh' in contrib folder, the
>>>>>>> PASS->FAIL are below:
>>>>>>>
>>>>>>> PASS->FAIL: gcc.dg/uninit-19.c (test for excess errors)
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -O2 -flto
>>>>>>> -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -O2 -flto
>>>>>>> -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -O2 -flto
>>>>>>> -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -O2 -flto
>>>>>>> -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -O2 -flto
>>>>>>> -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -O2 -flto
>>>>>>> -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -O2 -flto
>>>>>>> -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -O2 -flto
>>>>>>> -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -O2 -flto
>>>>>>> -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -O2 -flto
>>>>>>> -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -O2 -flto
>>>>>>> -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -O2 -flto
>>>>>>> -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c   -O2
>>>>>>> -flto -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c   -O2
>>>>>>> -flto -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c   -O2
>>>>>>> -flto -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c   -O2
>>>>>>> -flto -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>> lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>> PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>
>>>>>>> the 'gcc.dg/uninit-19.c ' already fails with -fPIE, and for the
>>>>>>> others in microblaze,
>>>>>>> expectation is r0 or r13 as a base register which is not the case
>>>>>>> here 'r20', and these tests also fails with -fPIE.
>>>>>>> Moreover, the test cases that failed due 'unresolved
>>>>>>> GLOBAL_OFFSET_TABLE' now pass as we do not have GOT in data text
>>>>>>> relative.
>>>>>>>
>>>>>>> Please tell me if any adjustments needed or If I need to re-run
>>>>
>>>> nything.
>>>>>>>
>>>>>>>
>>>>>>> Thanks
>>>>>>>
>>>>>>> On Sun, Mar 18, 2018 at 12:25 PM, Andrew Sadek
>>>>>>> <andrew.sadek...@gmail.com <mailto:andrew.sadek...@gmail.com>> wrote:
>>>>>>>
>>>>>>>      Hello Michael,
>>>>>>>
>>>>>>>      I have run the test using the new PIC options.
>>>>>>>      Actually, I have discovered 2 unhandled cases in
>>>>>>>      'microblaze_expand_move' + missing conditions in linker relax
>>>>>>>      leading some test cases execution to fail.
>>>>>>>      After fixing them, I made a re-run for the whole regression, and
>>>>
>>>> the
>>>>>>>
>>>>>>>      results analogy below:
>>>>>>>
>>>>>>>      Original, without my patch:
>>>>>>>               === gcc Summary ===
>>>>>>>
>>>>>>>      # of expected passes        90776
>>>>>>>      # of unexpected failures    1317
>>>>>>>      # of unexpected successes    3
>>>>>>>      # of expected failures        207
>>>>>>>      # of unresolved testcases    115
>>>>>>>      # of unsupported tests        2828
>>>>>>>
>>>>>>>      With my patch, calling '-fPIE - mpic-data-text-rel'
>>>>>>>               === gcc Summary ===
>>>>>>>
>>>>>>>      # of expected passes        90843
>>>>>>>      # of unexpected failures    1256
>>>>>>>      # of unexpected successes    3
>>>>>>>      # of expected failures        207
>>>>>>>      # of unresolved testcases    115
>>>>>>>      # of unsupported tests        2853
>>>>>>>
>>>>>>>      After running the 'dg-cmp-results.sh' in contrib folder, the
>>>>>>>      PASS->FAIL are below:
>>>>>>>
>>>>>>>      PASS->FAIL: gcc.dg/uninit-19.c (test for excess errors)
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -O2 -flto
>>>>>>>      -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -O2 -flto
>>>>>>>      -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var1.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -O2 -flto
>>>>>>>      -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -O2 -flto
>>>>>>>      -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/data_var2.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r0
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -O2 -flto
>>>>>>>      -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -O2 -flto
>>>>>>>      -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var1.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -O2 -flto
>>>>>>>      -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -O2 -flto
>>>>>>>      -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var2.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -O2 -flto
>>>>>>>      -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -O2 -flto
>>>>>>>      -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var4.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -O0
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -O1
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -O2 -flto
>>>>>>>      -fno-use-linker-plugin -flto-partition=none   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -O2 -flto
>>>>>>>      -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -O2
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -O3 -g
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/sdata_var5.c   -Os
>>>>>>> scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c
>>>>>>> -O0     scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c
>>>>>>> -O1     scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c
>>>>>>> -O2
>>>>>>>      -flto -fno-use-linker-plugin -flto-partition=none
>>>>>>> scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c
>>>>>>> -O2
>>>>>>>      -flto -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c
>>>>>>> -O2     scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c
>>>>>>> -O3
>>>>>>>      -g   scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst1_gpopt.c
>>>>>>> -Os     scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c
>>>>>>> -O0     scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c
>>>>>>> -O1     scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c
>>>>>>> -O2
>>>>>>>      -flto -fno-use-linker-plugin -flto-partition=none
>>>>>>> scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c
>>>>>>> -O2
>>>>>>>      -flto -fuse-linker-plugin -fno-fat-lto-objects   scan-assembler
>>>>>>>      lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c
>>>>>>> -O2     scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c
>>>>>>> -O3
>>>>>>>      -g   scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>      PASS->FAIL: gcc.target/microblaze/others/string_cst2_gpopt.c
>>>>>>> -Os     scan-assembler lwi\tr([0-9]|[1-2][0-9]|3[0-1]),r13
>>>>>>>
>>>>>>>      the 'gcc.dg/uninit-19.c ' already fails with -fPIE, and for the
>>>>>>>      others in microblaze,
>>>>>>>      expectation is r0 or r13 as a base register which is not the case
>>>>>>>      here 'r20', and these tests also fails with -fPIE.
>>>>>>>      Moreover, the test cases that failed due 'unresolved
>>>>>>>      GLOBAL_OFFSET_TABLE' now pass as we do not have GOT in data text
>>>>>>>      relative.
>>>>>>>
>>>>>>>      Attached the compare output of the scripit with verbosity 2.
>>>>>>>      Please tell me if any adjustments needed or If I need to re-run
>>>>>>> nything.
>>>>>>>
>>>>>>>      Thanks
>>>>>>>
>>>>>>>
>>>>>>>      On Tue, Mar 13, 2018 at 10:44 PM, Michael Eager <ea...@eagerm.com
>>>>>>>      <mailto:ea...@eagerm.com>> wrote:
>>>>>>>
>>>>>>>          On 03/13/18 00:56, Andrew Sadek wrote:
>>>>>>>
>>>>>>>              Ok, so you mean with '-fPIC -mpic-data-text-relative' as
>>>>>>> I
>>>>>>>              do in my test case ?
>>>>>>>              If all is Ok, execution and compilation shall ideally
>>>>>>> pass
>>>>>>>              for the test cases.
>>>>>>>
>>>>>>>
>>>>>>>          Correct.
>>>>>>>
>>>>>>>          I want to make sure of two things:
>>>>>>>             -- Your patch doesn't break anything (i.e., cause a
>>>>>>>          regression) when
>>>>>>>                you don't use the options.  This seems complete.
>>>>>>>             -- Your patch works as intended when you do use the
>>>>>>> options.
>>>>>>>
>>>>>>>              But I have noticed that there are some output pattern
>>>>
>>>> checks
>>>>>>>
>>>>>>>              done in some test cases and this may fail since the
>>>>>>> output
>>>>>>>              assembly is different,
>>>>>>>              anyway I shall give it a try and send you the results
>>>>>>> with
>>>>>>>              the new options.
>>>>>>>
>>>>>>>
>>>>>>>          There should be no target dependencies in the generic GCC
>>>>
>>>> tests.
>>>>>>>
>>>>>>>          Different instruction patterns which generate the correct
>>>>>>>          results should
>>>>>>>          not be a problem.
>>>>>>>
>>>>>>>
>>>>>>>          --         Michael Eager ea...@eagerm.com
>>>>>>> <mailto:ea...@eagerm.com>
>>>>>>>          1960 Park Blvd., Palo Alto, CA 94306
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>      --
>>>>>>>      Andrew
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>>
>>>>>>> Andrew
>>>>>>
>>>>>>
>>>>>
>>>>
>>>> --
>>>> Michael Eager    ea...@eagerm.com
>>>> 1960 Park Blvd., Palo Alto, CA 94306
>>>>
>>>
>>
>> --
>> Michael Eager    ea...@eagerm.com
>> 1960 Park Blvd., Palo Alto, CA 94306
>
>
>
> --
>
> Andrew



-- 

Andrew
Index: gcc/config/microblaze/microblaze-protos.h
===================================================================
--- gcc/config/microblaze/microblaze-protos.h   (revision 258413)
+++ gcc/config/microblaze/microblaze-protos.h   (working copy)
@@ -24,6 +24,7 @@
 
 #ifdef RTX_CODE
 extern int pic_address_needs_scratch (rtx);
+extern bool microblaze_constant_address_p (rtx x);
 extern void expand_block_move        (rtx *);
 extern void microblaze_expand_prologue (void);
 extern void microblaze_expand_epilogue (void);
Index: gcc/config/microblaze/microblaze.c
===================================================================
--- gcc/config/microblaze/microblaze.c  (revision 258413)
+++ gcc/config/microblaze/microblaze.c  (working copy)
@@ -91,7 +91,8 @@ enum microblaze_address_type
   ADDRESS_SYMBOLIC,
   ADDRESS_GOTOFF,
   ADDRESS_PLT,
-  ADDRESS_TLS
+  ADDRESS_TLS,
+  ADDRESS_SYMBOLIC_TXT_REL
 };
 
 /* Classifies symbols
@@ -650,6 +651,10 @@ microblaze_classify_unspec (struct microblaze_addr
       info->type = ADDRESS_TLS;
       info->tls_type = tls_reloc (INTVAL (XVECEXP (x, 0, 1)));
     }
+  else if (XINT (x, 1) == UNSPEC_TEXT)
+    {
+         info->type = ADDRESS_SYMBOLIC_TXT_REL;
+    }
   else
     {
       return false;
@@ -728,6 +733,7 @@ microblaze_classify_address (struct microblaze_add
 {
   rtx xplus0;
   rtx xplus1;
+  rtx offset;
 
   info->type = ADDRESS_INVALID;
   info->regA = NULL;
@@ -735,6 +741,7 @@ microblaze_classify_address (struct microblaze_add
   info->offset = NULL;
   info->symbol = NULL;
   info->symbol_type = SYMBOL_TYPE_INVALID;
+  offset = NULL;
 
   switch (GET_CODE (x))
     {
@@ -795,9 +802,14 @@ microblaze_classify_address (struct microblaze_add
                /* for (plus x const_int) just look at x.  */
                if (GET_CODE (xconst0) == PLUS
                    && GET_CODE (XEXP (xconst0, 1)) == CONST_INT
-                   && SMALL_INT (XEXP (xconst0, 1)))
+                   && (SMALL_INT (XEXP (xconst0, 1))
+                      || GET_CODE (XEXP (xconst0, 0)) == UNSPEC))
                  {
-                   /* This is ok as info->symbol is set to xplus1 the full
+                        /* Hold CONST_INT Value in offset in case of
+                      UNSPEC + CONST_INT.  */
+                       offset = XEXP (xconst0, 1);
+
+                       /* This is ok as info->symbol is set to xplus1 the full
                       const-expression below.  */
                    xconst0 = XEXP (xconst0, 0);
                  }
@@ -814,6 +826,15 @@ microblaze_classify_address (struct microblaze_add
                    return true;
                  }
 
+               if (GET_CODE (xconst0) == UNSPEC && TARGET_PIC_DATA_TEXT_REL)
+                 {
+                   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
+                     return false;
+
+                   info->offset = offset;
+                   return microblaze_classify_unspec (info, xconst0);
+                 }
+
                /* Not base + symbol || base + UNSPEC.  */
                return false;
 
@@ -858,6 +879,16 @@ microblaze_classify_address (struct microblaze_add
             return !(flag_pic && pic_address_needs_scratch (x));
          }
 
+       /* Avoid error in print_operand_address in case UNSPEC
+        is removed from SYMBOL or LABEL REFS during optimization.  */
+       if ((GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
+               && flag_pic && TARGET_PIC_DATA_TEXT_REL
+               && strict == 2)
+         {
+           info->type = ADDRESS_SYMBOLIC_TXT_REL;
+           return true;
+         }
+
        if (flag_pic == 2)
          return false;
        else if (microblaze_tls_symbol_p(x))
@@ -891,8 +922,18 @@ microblaze_legitimate_address_p (machine_mode mode
   struct microblaze_address_info addr;
 
   return microblaze_classify_address (&addr, x, mode, strict);
+
 }
 
+bool
+microblaze_constant_address_p (rtx x)
+{
+  return ((GET_CODE (x) == LABEL_REF) || (GET_CODE (x) == SYMBOL_REF)
+                 || GET_CODE (x) == CONST_INT
+                 || (GET_CODE (x) == CONST
+                 && ! (flag_pic && pic_address_needs_scratch (x))));
+}
+
 int
 microblaze_valid_pic_const (rtx x)
 {
@@ -910,9 +951,11 @@ microblaze_valid_pic_const (rtx x)
 int
 microblaze_legitimate_pic_operand (rtx x)
 {
-  if (flag_pic == 2 && (symbol_mentioned_p(x) || label_mentioned_p(x)))
+  if (flag_pic == 2 && (symbol_mentioned_p (x) || label_mentioned_p (x))
+      && !(TARGET_PIC_DATA_TEXT_REL && call_insn_operand (x,VOIDmode)))
     return 0;
 
+
   if (microblaze_tls_referenced_p(x))
     return 0;
 
@@ -1022,7 +1065,7 @@ microblaze_legitimize_address (rtx x, rtx oldx ATT
 
                  return result;
                }
-             else if (flag_pic == 2)
+             else if (flag_pic == 2 && !TARGET_PIC_DATA_TEXT_REL)
                {
                  rtx pic_ref, reg;
                  reg = gen_reg_rtx (Pmode);
@@ -1036,7 +1079,19 @@ microblaze_legitimize_address (rtx x, rtx oldx ATT
                  result = gen_rtx_PLUS (Pmode, xplus0, reg);
                  return result;
                }
+             else if (flag_pic == 2 && TARGET_PIC_DATA_TEXT_REL)
+           {
+             rtx pic_ref, reg;
+             reg = gen_reg_rtx (Pmode);
+                 pic_ref = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xplus1),
+                                           UNSPEC_TEXT);
+             pic_ref = gen_rtx_CONST (Pmode, pic_ref);
+             emit_insn (gen_addsi3 (reg, pic_offset_table_rtx, xplus0));
+             result = gen_rtx_PLUS (Pmode, reg, pic_ref);
+             return result;
+
            }
+           }
        }
     }
 
@@ -1047,7 +1102,7 @@ microblaze_legitimize_address (rtx x, rtx oldx ATT
         {
           reg = microblaze_legitimize_tls_address (xinsn, NULL_RTX);
         }
-      else
+      else if (flag_pic == 2 && !TARGET_PIC_DATA_TEXT_REL)
         {
           rtx pic_ref;
 
@@ -1060,6 +1115,19 @@ microblaze_legitimize_address (rtx x, rtx oldx ATT
           pic_ref = gen_const_mem (Pmode, pic_ref);
           reg = pic_ref;
         }
+      else if (flag_pic == 2 && TARGET_PIC_DATA_TEXT_REL)
+           {
+         rtx pic_ref;
+
+         if (reload_in_progress)
+                 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
+
+         pic_ref = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xinsn), UNSPEC_TEXT);
+         pic_ref = gen_rtx_CONST (Pmode, pic_ref);
+         pic_ref = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, pic_ref);
+         reg = pic_ref;
+
+           }
       return reg;
     }
 
@@ -1388,6 +1456,7 @@ microblaze_address_insns (rtx x, machine_mode mode
        case ADDRESS_REG_INDEX:
          return 1;
        case ADDRESS_SYMBOLIC:
+       case ADDRESS_SYMBOLIC_TXT_REL:
        case ADDRESS_GOTOFF:
          return 2;
        case ADDRESS_TLS:
@@ -2066,7 +2135,7 @@ compute_frame_size (HOST_WIDE_INT size)
 
   total_size = var_size + args_size;
 
-  if (flag_pic == 2)
+  if (flag_pic == 2 && !TARGET_PIC_DATA_TEXT_REL)
     /* force setting GOT.  */
     df_set_regs_ever_live (MB_ABI_PIC_ADDR_REGNUM, true);
 
@@ -2322,6 +2391,7 @@ print_operand (FILE * file, rtx op, int letter)
            case ADDRESS_REG:
            case ADDRESS_CONST_INT:
            case ADDRESS_SYMBOLIC:
+           case ADDRESS_SYMBOLIC_TXT_REL:
            case ADDRESS_GOTOFF:
            case ADDRESS_TLS:
              fputs ("i", file);
@@ -2489,7 +2559,7 @@ print_operand_address (FILE * file, rtx addr)
 {
   struct microblaze_address_info info;
   enum microblaze_address_type type;
-  if (!microblaze_classify_address (&info, addr, GET_MODE (addr), 1))
+  if (!microblaze_classify_address (&info, addr, GET_MODE (addr), 2))
     fatal_insn ("insn contains an invalid address !", addr);
 
   type = info.type;
@@ -2515,6 +2585,7 @@ print_operand_address (FILE * file, rtx addr)
       output_addr_const (file, info.offset);
       break;
     case ADDRESS_SYMBOLIC:
+    case ADDRESS_SYMBOLIC_TXT_REL:
     case ADDRESS_GOTOFF:
     case ADDRESS_PLT:
     case ADDRESS_TLS:
@@ -2529,6 +2600,16 @@ print_operand_address (FILE * file, rtx addr)
        {
          fputs ("@PLT", file);
        }
+      else if (type == ADDRESS_SYMBOLIC_TXT_REL)
+    {
+      if (info.offset != NULL && CONST_INT_P (info.offset)
+             && INTVAL (info.offset) > 0)
+       {
+         fprintf (file, "+");
+         output_addr_const (file, info.offset);
+       }
+      fputs ("@TXTREL", file);
+    }
       else if (type == ADDRESS_TLS)
        {
          switch (info.tls_type)
@@ -2960,8 +3041,19 @@ microblaze_expand_prologue (void)
   if ((flag_pic == 2 || TLS_NEEDS_GOT )
       && df_regs_ever_live_p (MB_ABI_PIC_ADDR_REGNUM))
     {
-      SET_REGNO (pic_offset_table_rtx, MB_ABI_PIC_ADDR_REGNUM);
-      emit_insn (gen_set_got (pic_offset_table_rtx));  /* setting GOT.  */
+         if ((flag_pic == 2 && !TARGET_PIC_DATA_TEXT_REL) || TLS_NEEDS_GOT)
+           {
+                 SET_REGNO (pic_offset_table_rtx, MB_ABI_PIC_ADDR_REGNUM);
+                 /* setting GOT.  */
+                 emit_insn (gen_set_got (pic_offset_table_rtx));
+           }
+      else
+           {
+         SET_REGNO (pic_offset_table_rtx, MB_ABI_PIC_ADDR_REGNUM);
+                 /* setting start of text.  */
+                 emit_insn (gen_set_text (pic_offset_table_rtx));
+
+           }
     }
 
   /* If we are profiling, make sure no instructions are scheduled before
@@ -3154,7 +3246,15 @@ microblaze_elf_in_small_data_p (const_tree decl)
   return (size > 0 && size <= microblaze_section_threshold);
 }
 
+/* We need to disable address diff vectors in
+case of pic data text relative mode.  */
 
+static bool
+microblaze_gen_pic_addr_dif_vec (void)
+{
+  return (flag_pic && !TARGET_PIC_DATA_TEXT_REL);
+}
+
 static section *
 microblaze_select_section (tree decl, int reloc, unsigned HOST_WIDE_INT align)
 {
@@ -3187,10 +3287,19 @@ static rtx
 expand_pic_symbol_ref (machine_mode mode ATTRIBUTE_UNUSED, rtx op)
 {
   rtx result;
-  result = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op), UNSPEC_GOTOFF);
+  bool isFunc = (GET_CODE (op) == SYMBOL_REF
+                            && (SYMBOL_REF_FLAGS (op) & SYMBOL_FLAG_FUNCTION));
+  result = (!TARGET_PIC_DATA_TEXT_REL)
+                 ? gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op), UNSPEC_GOTOFF):
+                  gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op), UNSPEC_TEXT);
   result = gen_rtx_CONST (Pmode, result);
-  result = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, result);
-  result = gen_const_mem (Pmode, result);
+  result = (TARGET_PIC_DATA_TEXT_REL && isFunc)
+                 ? gen_rtx_PLUS (Pmode, gen_raw_REG (Pmode,
+                   get_base_reg (op)), result):
+                       gen_rtx_PLUS (Pmode, pic_offset_table_rtx, result);
+  result = (!TARGET_PIC_DATA_TEXT_REL)
+                 ? gen_const_mem (Pmode, result) : result;
+
   return result;
 }
 
@@ -3294,10 +3403,38 @@ microblaze_expand_move (machine_mode mode, rtx ope
          if (reload_in_progress)
            df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM, true);
          result = expand_pic_symbol_ref (mode, op1);
+
+         if (TARGET_PIC_DATA_TEXT_REL && GET_CODE (op0) == REG
+             && REGNO (op0) >= FIRST_PSEUDO_REGISTER)
+                   result = force_reg (SImode, result);
+
          emit_move_insn (op0, result);
          return true;
        }
     }
+  if (GET_CODE (op1) == PLUS && GET_CODE (XEXP (op1,1)) == CONST)
+    {
+           rtx p0, p1, result, temp;
+
+           p0 = XEXP (XEXP (op1,1), 0);
+
+           if (GET_CODE (p0) == PLUS)
+             {
+                   p1 = XEXP (p0, 1);
+                   p0 = XEXP (p0, 0);
+             }
+
+           if (GET_CODE (p0) == UNSPEC && GET_CODE (p1) == CONST_INT
+               && flag_pic && TARGET_PIC_DATA_TEXT_REL)
+             {
+                   result = gen_rtx_CONST (Pmode, p0);
+                   result = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, result);
+                   temp = force_reg (SImode, result);
+                   emit_move_insn (op0, gen_rtx_PLUS (SImode, temp, p1));
+                   return true;
+             }
+
+    }
   /* Handle Case of (const (plus symbol const_int)).  */
   if (GET_CODE (op1) == CONST && GET_CODE (XEXP (op1,0)) == PLUS)
     {
@@ -3912,6 +4049,9 @@ microblaze_starting_frame_offset (void)
 #undef TARGET_LEGITIMATE_CONSTANT_P
 #define TARGET_LEGITIMATE_CONSTANT_P microblaze_legitimate_constant_p
 
+#undef  TARGET_ASM_GENERATE_PIC_ADDR_DIFF_VEC
+#define TARGET_ASM_GENERATE_PIC_ADDR_DIFF_VEC  microblaze_gen_pic_addr_dif_vec
+
 #undef TARGET_MACHINE_DEPENDENT_REORG
 #define TARGET_MACHINE_DEPENDENT_REORG microblaze_machine_dependent_reorg
 
Index: gcc/config/microblaze/microblaze.h
===================================================================
--- gcc/config/microblaze/microblaze.h  (revision 258413)
+++ gcc/config/microblaze/microblaze.h  (working copy)
@@ -518,11 +518,7 @@ typedef struct microblaze_args
 
 /* Identify valid constant addresses.  Exclude if PIC addr which 
    needs scratch register.  */
-#define CONSTANT_ADDRESS_P(X)                                          \
-  (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF             \
-    || GET_CODE (X) == CONST_INT                                       \
-    || (GET_CODE (X) == CONST                                          \
-       && ! (flag_pic && pic_address_needs_scratch (X))))
+#define CONSTANT_ADDRESS_P(X)  microblaze_constant_address_p(X)
 
 /* Define this, so that when PIC, reload won't try to reload invalid
    addresses which require two reload registers.  */
Index: gcc/config/microblaze/microblaze.md
===================================================================
--- gcc/config/microblaze/microblaze.md (revision 258413)
+++ gcc/config/microblaze/microblaze.md (working copy)
@@ -41,6 +41,8 @@
   (UNSPEC_CMP          104)    ;; signed compare
   (UNSPEC_CMPU         105)    ;; unsigned compare
   (UNSPEC_TLS           106)    ;; jump table
+  (UNSPEC_SET_TEXT       107)    ;; set text start
+  (UNSPEC_TEXT       108)    ;; data text relative
 ])
 
 (define_c_enum "unspec" [
@@ -1848,7 +1850,7 @@
   {
     gcc_assert (GET_MODE (operands[0]) == Pmode);
 
-    if (!flag_pic)
+    if (!flag_pic || (flag_pic && TARGET_PIC_DATA_TEXT_REL))
       emit_jump_insn (gen_tablejump_internal1 (operands[0], operands[1]));
     else
       emit_jump_insn (gen_tablejump_internal3 (operands[0], operands[1]));
@@ -2053,7 +2055,8 @@
   {
     rtx addr = XEXP (operands[0], 0);
 
-    if (flag_pic == 2 && GET_CODE (addr) == SYMBOL_REF 
+    if (flag_pic == 2 && !TARGET_PIC_DATA_TEXT_REL
+    && GET_CODE (addr) == SYMBOL_REF
        && !SYMBOL_REF_LOCAL_P (addr)) 
       {
         rtx temp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_PLT);
@@ -2156,7 +2159,8 @@
   {
     rtx addr = XEXP (operands[1], 0);
 
-    if (flag_pic == 2 && GET_CODE (addr) == SYMBOL_REF
+    if (flag_pic == 2 && !TARGET_PIC_DATA_TEXT_REL
+    && GET_CODE (addr) == SYMBOL_REF
        && !SYMBOL_REF_LOCAL_P (addr)) 
       {
         rtx temp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), UNSPEC_PLT);
@@ -2313,6 +2317,18 @@
   [(set_attr "type" "multi")
    (set_attr "length" "12")])
 
+;; The insn to set TEXT.
+;; The hardcoded number "8" accounts for $pc difference
+;; between "mfs" and "addik" instructions.
+(define_insn "set_text"
+  [(set (match_operand:SI 0 "register_operand" "=r")
+    (unspec:SI[(const_int 0)] UNSPEC_SET_TEXT))]
+  ""
+  "mfs\t%0,rpc\n\taddik\t%0,%0,8@TXTPCREL"
+  [(set_attr "type" "multi")
+   (set_attr "length" "12")])
+
+
 ;; This insn gives the count of leading number of zeros for the second
 ;; operand and stores the result in first operand.
 (define_insn "clzsi2"
Index: gcc/config/microblaze/microblaze.opt
===================================================================
--- gcc/config/microblaze/microblaze.opt        (revision 258413)
+++ gcc/config/microblaze/microblaze.opt        (working copy)
@@ -127,5 +127,9 @@ mxl-prefetch
 Target Mask(PREFETCH)
 Use hardware prefetch instruction
 
+mpic-data-text-rel
+Target Mask(PIC_DATA_TEXT_REL)
+Data referenced by offset from start of text instead of GOT (with -fPIC/-fPIE).
+
 mxl-mode-xilkernel
 Target
Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi (revision 258413)
+++ gcc/doc/invoke.texi (working copy)
@@ -866,7 +866,7 @@ Objective-C and Objective-C++ Dialects}.
 @gccoptlist{-msoft-float  -mhard-float  -msmall-divides  -mcpu=@var{cpu} @gol
 -mmemcpy  -mxl-soft-mul  -mxl-soft-div  -mxl-barrel-shift @gol
 -mxl-pattern-compare  -mxl-stack-check  -mxl-gp-opt  -mno-clearbss @gol
--mxl-multiply-high  -mxl-float-convert  -mxl-float-sqrt @gol
+-mxl-multiply-high  -mxl-float-convert  -mxl-float-sqrt -mpic-data-text-rel 
@gol
 -mbig-endian  -mlittle-endian  -mxl-reorder  -mxl-mode-@var{app-model}}
 
 @emph{MIPS Options}
Index: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi     (revision 258413)
+++ gcc/doc/tm.texi     (working copy)
@@ -7491,6 +7491,14 @@ when the target cannot support (some kinds of) dyn
 in read-only sections even in executables.
 @end deftypefn
 
+@deftypefn {Target Hook} bool TARGET_ASM_GENERATE_PIC_ADDR_DIFF_VEC (void)
+Return a flag for either generating ADDR_DIF_VEC table
+or ADDR_VEC table for jumps in case of -fPIC.
+
+The default version of this function returns true if flag_pic
+is equal true and false otherwise
+@end deftypefn
+
 @deftypefn {Target Hook} {section *} TARGET_ASM_SELECT_SECTION (tree 
@var{exp}, int @var{reloc}, unsigned HOST_WIDE_INT @var{align})
 Return the section into which @var{exp} should be placed.  You can
 assume that @var{exp} is either a @code{VAR_DECL} node or a constant of
Index: gcc/doc/tm.texi.in
===================================================================
--- gcc/doc/tm.texi.in  (revision 258413)
+++ gcc/doc/tm.texi.in  (working copy)
@@ -4922,6 +4922,8 @@ This macro is irrelevant if there is no separate r
 
 @hook TARGET_ASM_RELOC_RW_MASK
 
+@hook TARGET_ASM_GENERATE_PIC_ADDR_DIFF_VEC
+
 @hook TARGET_ASM_SELECT_SECTION
 
 @defmac USE_SELECT_SECTION_FOR_FUNCTIONS
Index: gcc/stmt.c
===================================================================
--- gcc/stmt.c  (revision 258413)
+++ gcc/stmt.c  (working copy)
@@ -847,7 +847,8 @@ emit_case_dispatch_table (tree index_expr, tree in
   /* Output the table.  */
   emit_label (table_label);
 
-  if (CASE_VECTOR_PC_RELATIVE || flag_pic)
+  if (CASE_VECTOR_PC_RELATIVE
+         || (flag_pic && targetm.asm_out.generate_pic_addr_diff_vec ()))
     emit_jump_table_data (gen_rtx_ADDR_DIFF_VEC (CASE_VECTOR_MODE,
                                                 gen_rtx_LABEL_REF (Pmode,
                                                                    
table_label),
Index: gcc/target.def
===================================================================
--- gcc/target.def      (revision 258413)
+++ gcc/target.def      (working copy)
@@ -507,6 +507,19 @@ in read-only sections even in executables.",
  int, (void),
  default_reloc_rw_mask)
 
+
+ /* Return a flag for either generating ADDR_DIF_VEC table
+ or ADDR_VEC table for jumps in case of -fPIC/-fPIE.  */
+DEFHOOK
+(generate_pic_addr_diff_vec,
+"Return a flag for either generating ADDR_DIF_VEC table\n\
+or ADDR_VEC table for jumps in case of -fPIC.\n\
+\n\
+The default version of this function returns true if flag_pic\n\
+is equal true and false otherwise",
+ bool, (void),
+ default_generate_pic_addr_diff_vec)
+
  /* Return a section for EXP.  It may be a DECL or a constant.  RELOC
     is nonzero if runtime relocations must be applied; bit 1 will be
     set if the runtime relocations require non-local name resolution.
Index: gcc/targhooks.c
===================================================================
--- gcc/targhooks.c     (revision 258413)
+++ gcc/targhooks.c     (working copy)
@@ -1196,6 +1196,15 @@ default_reloc_rw_mask (void)
   return flag_pic ? 3 : 0;
 }
 
+/* By default, address diff vectors are generated
+for jump tables when flag_pic is true.  */
+
+bool
+default_generate_pic_addr_diff_vec (void)
+{
+  return true;
+}
+
 /* By default, do no modification. */
 tree default_mangle_decl_assembler_name (tree decl ATTRIBUTE_UNUSED,
                                         tree id)
Index: gcc/targhooks.h
===================================================================
--- gcc/targhooks.h     (revision 258413)
+++ gcc/targhooks.h     (working copy)
@@ -175,6 +175,7 @@ extern machine_mode default_secondary_memory_neede
 extern void default_target_option_override (void);
 extern void hook_void_bitmap (bitmap);
 extern int default_reloc_rw_mask (void);
+extern bool default_generate_pic_addr_diff_vec (void);
 extern tree default_mangle_decl_assembler_name (tree, tree);
 extern tree default_emutls_var_fields (tree, tree *);
 extern tree default_emutls_var_init (tree, tree, tree);
Index: gcc/testsuite/gcc.target/microblaze/others/data_var1.c
===================================================================
--- gcc/testsuite/gcc.target/microblaze/others/data_var1.c      (revision 
258413)
+++ gcc/testsuite/gcc.target/microblaze/others/data_var1.c      (working copy)
@@ -3,6 +3,6 @@ int global;
 
 int testfunc ()
 {
-/* { dg-final { scan-assembler "\lwi\tr(\[0-9]\|\[1-2]\[0-9]\|3\[0-1]),r0" } } 
*/
+/* { dg-final { scan-assembler 
"\lwi\tr(\[0-9]\|\[1-2]\[0-9]\|3\[0-1]),r(0|20)" } } */
     return global;
 }
Index: gcc/testsuite/gcc.target/microblaze/others/data_var2.c
===================================================================
--- gcc/testsuite/gcc.target/microblaze/others/data_var2.c      (revision 
258413)
+++ gcc/testsuite/gcc.target/microblaze/others/data_var2.c      (working copy)
@@ -3,6 +3,6 @@ int global = 10;
 
 int testfunc ()
 {
-/* { dg-final { scan-assembler "\lwi\tr(\[0-9]\|\[1-2]\[0-9]\|3\[0-1]),r0" } } 
*/
+/* { dg-final { scan-assembler 
"\lwi\tr(\[0-9]\|\[1-2]\[0-9]\|3\[0-1]),r(0|20)" } } */
     return global;
 }
Index: gcc/testsuite/gcc.target/microblaze/others/picdtr.c
===================================================================
--- gcc/testsuite/gcc.target/microblaze/others/picdtr.c (nonexistent)
+++ gcc/testsuite/gcc.target/microblaze/others/picdtr.c (working copy)
@@ -0,0 +1,80 @@
+/* { dg-options "-fPIE -mpic-data-text-rel -save-temps" } */
+/* { dg-do run } */
+
+#define TEST_VAR(var,val) (var) = (val); if( (var) != (val)) return 0;
+
+int foo(unsigned int i);
+extern void abort(void);
+extern void exit(int);
+
+unsigned char data[8];
+long bigData[7];
+long var;
+typedef struct {int a; short b; long c[1000][1000]; long long d[3][3]; char e; 
} myDef;
+myDef def;
+const char* myString;
+
+/* { dg-final { scan-assembler "mfs\tr20,rpc" } } */
+/* { dg-final { scan-assembler "addik\tr20,r20,8@TXTPCREL" } } */
+/* { dg-final { scan-assembler ",r20,\[^\n]*var\[^\n]*@TXTREL" } } */
+/* { dg-final { scan-assembler-not ",r0,\[^\n]*var" } } */
+/* { dg-final { scan-assembler ",r20,\[^\n]*bigData\[^\n]*@TXTREL" } } */
+/* { dg-final { scan-assembler-not ",r0,\[^\n]*bigData" } } */
+/* { dg-final { scan-assembler ",r20,\[^\n]*def\[^\n]*@TXTREL" } } */
+/* { dg-final { scan-assembler-not ",r0,\[^\n]*def" } } */
+/* { dg-final { scan-assembler ",r20,\[^\n]*data\[^\n]*@TXTREL" } } */
+/* { dg-final { scan-assembler-not ",r0,\[^\n]*data" } } */
+/* { dg-final { scan-assembler ",r20,\[^\n]*L\[^\n]*@TXTREL" } } */
+/* { dg-final { scan-assembler-not ",r0,\[^\n]*L" } } */
+
+
+
+void foo2() {
+       var++;
+}
+
+int foo (unsigned int i) {
+
+       TEST_VAR(var,123)
+       TEST_VAR(data[i],77)
+       TEST_VAR(data[2],88)
+       TEST_VAR(def.a,897)
+       TEST_VAR(bigData[i],78)
+       TEST_VAR(bigData[2],777)
+       TEST_VAR(def.b,12333);
+       TEST_VAR(def.c[i][i],5);
+       TEST_VAR(def.c[0][1],7);
+       TEST_VAR(def.d[1][2],123);
+       TEST_VAR(def.e,7);
+       TEST_VAR(bigData[i+1],bigData[i*2]);
+
+       foo2();
+
+       myString = "Hello";
+
+       switch(i){
+
+       case 1: var += 2; break;
+       case 2: var += 3; break;
+       case 3: var += 5; break;
+       case 4: var += 7; break;
+       case 5: var += 8; break;
+       default: var = 0;
+
+       }
+
+       return 1;
+
+}
+
+int main() {
+
+       int result = foo(3);
+       if(result != 1 || var != 129) {
+               abort();
+       }
+
+       exit(0);
+
+}
+
Index: gcc/testsuite/gcc.target/microblaze/others/sdata_var1.c
===================================================================
--- gcc/testsuite/gcc.target/microblaze/others/sdata_var1.c     (revision 
258413)
+++ gcc/testsuite/gcc.target/microblaze/others/sdata_var1.c     (working copy)
@@ -1,4 +1,4 @@
-/* { dg-options "-mxl-gp-opt" } */
+/* { dg-options "-mxl-gp-opt -fno-pic" } */
 
 /* { dg-final { scan-assembler "\.sbss\[^2]+" } } */
 typedef int Boolean;
Index: gcc/testsuite/gcc.target/microblaze/others/sdata_var2.c
===================================================================
--- gcc/testsuite/gcc.target/microblaze/others/sdata_var2.c     (revision 
258413)
+++ gcc/testsuite/gcc.target/microblaze/others/sdata_var2.c     (working copy)
@@ -1,4 +1,4 @@
-/* { dg-options "-mxl-gp-opt" } */
+/* { dg-options "-mxl-gp-opt -fno-pic" } */
 
 /* { dg-final { scan-assembler "\.sdata\[^2]+" } } */
 int global = 10;
Index: gcc/testsuite/gcc.target/microblaze/others/sdata_var3.c
===================================================================
--- gcc/testsuite/gcc.target/microblaze/others/sdata_var3.c     (revision 
258413)
+++ gcc/testsuite/gcc.target/microblaze/others/sdata_var3.c     (working copy)
@@ -1,4 +1,4 @@
-/* { dg-options "-mxl-gp-opt" } */
+/* { dg-options "-mxl-gp-opt -fno-pic" } */
 
 extern int a;
 
Index: gcc/testsuite/gcc.target/microblaze/others/sdata_var4.c
===================================================================
--- gcc/testsuite/gcc.target/microblaze/others/sdata_var4.c     (revision 
258413)
+++ gcc/testsuite/gcc.target/microblaze/others/sdata_var4.c     (working copy)
@@ -1,4 +1,4 @@
-/* { dg-options "-mxl-gp-opt -G 16" } */
+/* { dg-options "-mxl-gp-opt -G 16 -fno-pic" } */
 
 /* { dg-final { scan-assembler "\.sbss\[^2]+" } } */
 struct test_s {
Index: gcc/testsuite/gcc.target/microblaze/others/sdata_var5.c
===================================================================
--- gcc/testsuite/gcc.target/microblaze/others/sdata_var5.c     (revision 
258413)
+++ gcc/testsuite/gcc.target/microblaze/others/sdata_var5.c     (working copy)
@@ -1,4 +1,4 @@
-/* { dg-options "-mxl-gp-opt -G 16" } */
+/* { dg-options "-mxl-gp-opt -G 16 -fno-pic" } */
 
 /* { dg-final { scan-assembler "\.sdata\[^2]+" } } */
 struct test_s {
Index: gcc/testsuite/gcc.target/microblaze/others/sdata_var6.c
===================================================================
--- gcc/testsuite/gcc.target/microblaze/others/sdata_var6.c     (revision 
258413)
+++ gcc/testsuite/gcc.target/microblaze/others/sdata_var6.c     (working copy)
@@ -1,5 +1,4 @@
-/* { dg-options "-mxl-gp-opt -G 16" } */
-
+/* { dg-options "-mxl-gp-opt -G 16 -fno-pic" } */
 struct test_s {
     int a;
     int b;
Index: gcc/testsuite/gcc.target/microblaze/others/string_cst1_gpopt.c
===================================================================
--- gcc/testsuite/gcc.target/microblaze/others/string_cst1_gpopt.c      
(revision 258413)
+++ gcc/testsuite/gcc.target/microblaze/others/string_cst1_gpopt.c      
(working copy)
@@ -1,4 +1,4 @@
-/* { dg-options "-mxl-gp-opt" } */
+/* { dg-options "-mxl-gp-opt -fno-pic" } */
 
 #include <string.h>
 
Index: gcc/testsuite/gcc.target/microblaze/others/string_cst2_gpopt.c
===================================================================
--- gcc/testsuite/gcc.target/microblaze/others/string_cst2_gpopt.c      
(revision 258413)
+++ gcc/testsuite/gcc.target/microblaze/others/string_cst2_gpopt.c      
(working copy)
@@ -1,4 +1,4 @@
-/* { dg-options "-mxl-gp-opt" } */
+/* { dg-options "-mxl-gp-opt -fno-pic" } */
 
 #include <string.h>
 

Reply via email to