[llvm] [BOLT][RISCV] Implement LO/HI relocations (PR #67444)

Job Noorman via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 26 08:42:50 PDT 2023


https://github.com/mtvec created https://github.com/llvm/llvm-project/pull/67444

Implement the following relocations used by the medlow code model and non-PIE binaries:
- R_RISCV_HI20
- R_RISCV_LO12_I
- R_RISCV_LO12_S

>From 5513efd80bfec27a4c857cbd63a54f63b306759d Mon Sep 17 00:00:00 2001
From: Job Noorman <jnoorman at igalia.com>
Date: Tue, 26 Sep 2023 17:37:46 +0200
Subject: [PATCH] [BOLT][RISCV] Implement LO/HI relocations

Implement the following relocations used by the medlow code model and
non-PIE binaries:
- R_RISCV_HI20
- R_RISCV_LO12_I
- R_RISCV_LO12_S
---
 bolt/lib/Core/Relocation.cpp                 | 12 +++++++++
 bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp |  8 ++++++
 bolt/test/RISCV/reloc-lohi.s                 | 26 ++++++++++++++++++++
 3 files changed, 46 insertions(+)
 create mode 100644 bolt/test/RISCV/reloc-lohi.s

diff --git a/bolt/lib/Core/Relocation.cpp b/bolt/lib/Core/Relocation.cpp
index 208a8c4d35576c1..ff539b4667d503a 100644
--- a/bolt/lib/Core/Relocation.cpp
+++ b/bolt/lib/Core/Relocation.cpp
@@ -106,6 +106,9 @@ static bool isSupportedRISCV(uint64_t Type) {
   case ELF::R_RISCV_RVC_BRANCH:
   case ELF::R_RISCV_ADD32:
   case ELF::R_RISCV_SUB32:
+  case ELF::R_RISCV_HI20:
+  case ELF::R_RISCV_LO12_I:
+  case ELF::R_RISCV_LO12_S:
     return true;
   }
 }
@@ -202,6 +205,9 @@ static size_t getSizeForTypeRISCV(uint64_t Type) {
   case ELF::R_RISCV_CALL_PLT:
   case ELF::R_RISCV_ADD32:
   case ELF::R_RISCV_SUB32:
+  case ELF::R_RISCV_HI20:
+  case ELF::R_RISCV_LO12_I:
+  case ELF::R_RISCV_LO12_S:
     return 4;
   case ELF::R_RISCV_GOT_HI20:
     // See extractValueRISCV for why this is necessary.
@@ -519,10 +525,13 @@ static uint64_t extractValueRISCV(uint64_t Type, uint64_t Contents,
     return extractUImmRISCV(Contents & 0xffffffff) +
            extractIImmRISCV(Contents >> 32);
   case ELF::R_RISCV_PCREL_HI20:
+  case ELF::R_RISCV_HI20:
     return extractUImmRISCV(Contents);
   case ELF::R_RISCV_PCREL_LO12_I:
+  case ELF::R_RISCV_LO12_I:
     return extractIImmRISCV(Contents);
   case ELF::R_RISCV_PCREL_LO12_S:
+  case ELF::R_RISCV_LO12_S:
     return extractSImmRISCV(Contents);
   case ELF::R_RISCV_RVC_JUMP:
     return SignExtend64<11>(Contents >> 2);
@@ -692,6 +701,9 @@ static bool isPCRelativeRISCV(uint64_t Type) {
     llvm_unreachable("Unknown relocation type");
   case ELF::R_RISCV_ADD32:
   case ELF::R_RISCV_SUB32:
+  case ELF::R_RISCV_HI20:
+  case ELF::R_RISCV_LO12_I:
+  case ELF::R_RISCV_LO12_S:
     return false;
   case ELF::R_RISCV_JAL:
   case ELF::R_RISCV_CALL:
diff --git a/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp b/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
index 0acfedabd08bd51..c2e64039a250079 100644
--- a/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
+++ b/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
@@ -43,6 +43,9 @@ class RISCVMCPlusBuilder : public MCPlusBuilder {
     case ELF::R_RISCV_PCREL_HI20:
     case ELF::R_RISCV_PCREL_LO12_I:
     case ELF::R_RISCV_PCREL_LO12_S:
+    case ELF::R_RISCV_HI20:
+    case ELF::R_RISCV_LO12_I:
+    case ELF::R_RISCV_LO12_S:
       return true;
     default:
       llvm_unreachable("Unexpected RISCV relocation type in code");
@@ -399,6 +402,11 @@ class RISCVMCPlusBuilder : public MCPlusBuilder {
     case ELF::R_RISCV_PCREL_LO12_I:
     case ELF::R_RISCV_PCREL_LO12_S:
       return RISCVMCExpr::create(Expr, RISCVMCExpr::VK_RISCV_PCREL_LO, Ctx);
+    case ELF::R_RISCV_HI20:
+      return RISCVMCExpr::create(Expr, RISCVMCExpr::VK_RISCV_HI, Ctx);
+    case ELF::R_RISCV_LO12_I:
+    case ELF::R_RISCV_LO12_S:
+      return RISCVMCExpr::create(Expr, RISCVMCExpr::VK_RISCV_LO, Ctx);
     case ELF::R_RISCV_CALL:
       return RISCVMCExpr::create(Expr, RISCVMCExpr::VK_RISCV_CALL, Ctx);
     case ELF::R_RISCV_CALL_PLT:
diff --git a/bolt/test/RISCV/reloc-lohi.s b/bolt/test/RISCV/reloc-lohi.s
new file mode 100644
index 000000000000000..a97a1454eee8620
--- /dev/null
+++ b/bolt/test/RISCV/reloc-lohi.s
@@ -0,0 +1,26 @@
+// RUN: llvm-mc -triple riscv64 -filetype=obj -o %t.o %s
+// RUN: ld.lld -q -o %t %t.o
+// RUN: llvm-bolt --print-cfg --print-only=_start -o /dev/null %t \
+// RUN:    | FileCheck %s
+
+  .data
+  .globl d
+  .p2align 3
+d:
+  .dword 0
+
+// CHECK-LABEL: Binary Function "_start" after building cfg {
+// CHECK:      lui t0, %hi(d)
+// CHECK-NEXT: ld t0, %lo(d)(t0)
+// CHECK-NEXT: lui t0, %hi(d)
+// CHECK-NEXT: sd t0, %lo(d)(t0)
+  .text
+  .globl _start
+  .p2align 1
+_start:
+  lui t0, %hi(d)
+  ld t0, %lo(d)(t0)
+  lui t0, %hi(d)
+  sd t0, %lo(d)(t0)
+  ret
+  .size _start, .-_start



More information about the llvm-commits mailing list