1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 02:33:06 +01:00

BPF: fix relocation types in lib/Object/RelocationResolver.cpp

Commit 6a2ea84600ba ("BPF: Add more relocation kinds")
added new relocations R_BPF_64_ABS64 and R_BPF_64_ABS32
for normal 64-bit and 32-bit data relocations.
This is to replace some of functionalities with
R_BPF_64_64 and R_BPF_64_32 so that new R_BPF_64_64
and R_BPF_64_32 semantics are for ld_imm64 and
call instructions only.

The BPF support in lib/Object/RelocationResolver.cpp
is used to perform normal data relocations for
the case like DWARFObjInMemory with an object file
(search function getRelocationResolver() in file
DebugInfo/DWARF/DWARFContext.cpp) or llvm-readobj
to dump ".stack_sizes" section data.
In all these casees, normal 64-bit and 32-bit relocations
are performed and such resolution resolution
is exactly what implemented in RelocationResolver.cpp.

But Commit 6a2ea84600ba missed to change
R_BPF_64_64/R_BPF_64_32 to R_BPF_64_ABS64/R_BPF_64_ABS32.
This patch fixed the issue and added a test for it
with llvm-readobj dumping ".stack_sizes" section.

Differential Revision: https://reviews.llvm.org/D103864
This commit is contained in:
Yonghong Song 2021-06-07 14:54:23 -07:00
parent d5c15094ae
commit 52e5ec1f09
3 changed files with 92 additions and 4 deletions

View File

@ -89,8 +89,8 @@ static uint64_t resolveAArch64(uint64_t Type, uint64_t Offset, uint64_t S,
static bool supportsBPF(uint64_t Type) {
switch (Type) {
case ELF::R_BPF_64_32:
case ELF::R_BPF_64_64:
case ELF::R_BPF_64_ABS32:
case ELF::R_BPF_64_ABS64:
return true;
default:
return false;
@ -100,9 +100,9 @@ static bool supportsBPF(uint64_t Type) {
static uint64_t resolveBPF(uint64_t Type, uint64_t Offset, uint64_t S,
uint64_t LocData, int64_t /*Addend*/) {
switch (Type) {
case ELF::R_BPF_64_32:
case ELF::R_BPF_64_ABS32:
return (S + LocData) & 0xFFFFFFFF;
case ELF::R_BPF_64_64:
case ELF::R_BPF_64_ABS64:
return S + LocData;
default:
llvm_unreachable("Invalid relocation type");

View File

@ -0,0 +1,2 @@
if not 'BPF' in config.root.targets:
config.unsupported = True

View File

@ -0,0 +1,86 @@
# RUN: yaml2obj %s -o %t
# RUN: llvm-readobj -r --stack-sizes %t | FileCheck %s
# CHECK: Relocations [
# CHECK-NEXT: Section (3) .rel.text {
# CHECK-NEXT: 0x0 R_BPF_64_64 g
# CHECK-NEXT: }
# CHECK-NEXT: Section (5) .rel.stack_sizes {
# CHECK-NEXT: 0x0 R_BPF_64_ABS64 .text
# CHECK-NEXT: }
# CHECK-NEXT: ]
# CHECK: StackSizes [
# CHECK-NEXT: Entry {
# CHECK-NEXT: Function: test
# CHECK-NEXT: Size: 0x0
# CHECK-NEXT: }
# CHECK-NEXT: ]
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_BPF
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
AddressAlign: 0x8
Content: '1801000000000000000000000000000061100000000000009500000000000000'
- Name: .stack_sizes
Type: SHT_PROGBITS
Flags: [ SHF_LINK_ORDER ]
Link: .text
AddressAlign: 0x1
Entries:
- Size: 0x0
- Name: .bss
Type: SHT_NOBITS
Flags: [ SHF_WRITE, SHF_ALLOC ]
AddressAlign: 0x4
Size: 0x4
- Name: .rel.text
Type: SHT_REL
Link: .symtab
AddressAlign: 0x8
Info: .text
Relocations:
- Symbol: g
Type: R_BPF_64_64
- Name: .rel.stack_sizes
Type: SHT_REL
Link: .symtab
AddressAlign: 0x8
Info: .stack_sizes
Relocations:
- Symbol: .text
Type: R_BPF_64_ABS64
- Type: SectionHeaderTable
Sections:
- Name: .strtab
- Name: .text
- Name: .rel.text
- Name: .stack_sizes
- Name: .rel.stack_sizes
- Name: .bss
- Name: .symtab
- Name: .shstrtab
Symbols:
- Name: t.c
Type: STT_FILE
Index: SHN_ABS
- Name: .text
Type: STT_SECTION
Section: .text
- Name: test
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Size: 0x20
- Name: g
Type: STT_OBJECT
Section: .bss
Binding: STB_GLOBAL
Size: 0x4
...