This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 2/2] RISC-V: Support assembler modifier %got_pcrel_hi.


Hi MaskRay,

On Wed, Mar 4, 2020 at 8:07 AM Fangrui Song <i@maskray.me> wrote:
>
> What if %got_pcrel_hi refers to a STB_LOCAL symbol? For example,
>
> auipc a0, %got_pcrel_hi(.L1)
>
> It may be worth a test.
>
> FWIW, llvm-mc -triple=riscv64 -filetype=obj a.s # create a R_RISCV_GOT_HI20 referencing .L1
> There is no special treatment.

Consider the following case tmp.s:

        .option pic
        .option norelax
        .global foo
foo:
        la a0, foo
.L1:
        auipc a0, %got_pcrel_hi(foo)
        ld a0, %pcrel_lo(.L1)(a0)
.L2:
        auipc a0, %got_pcrel_hi(.L1)
        addi a0, a0, %pcrel_lo(.L2)

        la a0, .L1

$ ~/binutils-dev/build-elf64-upstream/build-install/bin/riscv64-unknown-elf-as
tmp.s -o tmp.o
$ ~/binutils-dev/build-elf64-upstream/build-install/bin/riscv64-unknown-elf-objdump
-dr tmp.o

tmp.o:     file format elf64-littleriscv


Disassembly of section .text:

0000000000000000 <foo>:
   0:   00000517                auipc   a0,0x0
                        0: R_RISCV_GOT_HI20     foo
   4:   00053503                ld      a0,0(a0) # 0 <foo>
                        4: R_RISCV_PCREL_LO12_I .L0

0000000000000008 <.L1>:
   8:   00000517                auipc   a0,0x0
                        8: R_RISCV_GOT_HI20     foo
   c:   00053503                ld      a0,0(a0) # 8 <.L1>
                        c: R_RISCV_PCREL_LO12_I .L1

0000000000000010 <.L2>:
  10:   00000517                auipc   a0,0x0
                        10: R_RISCV_GOT_HI20    .L1
  14:   00050513                mv      a0,a0
                        14: R_RISCV_PCREL_LO12_I        .L2
  18:   00000517                auipc   a0,0x0
                        18: R_RISCV_GOT_HI20    .L1
  1c:   00053503                ld      a0,0(a0) # 18 <.L2+0x8>
                        1c: R_RISCV_PCREL_LO12_I        .L0

`foo` is a global symbol.  `.L1` and `.L2` are local symbols.  I think
the current upstream GNU assembler treats them all the same for LA
macro with pic and %got_pcrel_hi.  So yes, the behavior should be the
same as llvm-mc.  BTW I get the same result for the linux toolchain.

Thanks
Nelson


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]