Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport D60657 #29

Commits on Dec 1, 2019

  1. [RISCV] Fix evaluation of %pcrel_lo

    The following testcase
    
      function:
      .Lpcrel_label1:
      	auipc	a0, %pcrel_hi(other_function)
      	addi	a1, a0, %pcrel_lo(.Lpcrel_label1)
      	.p2align	2          # Causes a new fragment to be emitted
    
      	.type	other_function,@function
      other_function:
      	ret
    
    exposes an odd behaviour in which only the %pcrel_hi relocation is
    evaluated but not the %pcrel_lo.
    
      $ llvm-mc -triple riscv64 -filetype obj t.s | llvm-objdump  -d -r -
    
      <stdin>:	file format ELF64-riscv
    
      Disassembly of section .text:
      0000000000000000 function:
             0:	17 05 00 00	auipc	a0, 0
             4:	93 05 05 00	mv	a1, a0
      		0000000000000004:  R_RISCV_PCREL_LO12_I	other_function+4
    
      0000000000000008 other_function:
             8:	67 80 00 00	ret
    
    The reason seems to be that in RISCVAsmBackend::shouldForceRelocation we
    only consider the fragment but in RISCVMCExpr::evaluatePCRelLo we
    consider the section. This usually works but there are cases where the
    section may still be the same but the fragment may be another one. In
    that case we end forcing a %pcrel_lo relocation without any %pcrel_hi.
    
    This patch makes RISCVAsmBackend::shouldForceRelocation use the section,
    if any, to determine if the relocation must be forced or not.
    
    Differential Revision: https://reviews.llvm.org/D60657
    rofirrim authored and msizanoen1 committed Dec 1, 2019
    Configuration menu
    Copy the full SHA
    ce47e6e View commit details
    Browse the repository at this point in the history