Skip to content

Commit

Permalink
[llvm-objcopy][ObjectYAML][mips] Add MIPS specific ELF section indexes
Browse files Browse the repository at this point in the history
This fixes #53998
and displays correct information in obj2yaml for SHN_MIPS_*
sections according to
https://refspecs.linuxfoundation.org/elf/mipsabi.pdf

Reviewed By: jhenderson, MaskRay

Differential Revision: https://reviews.llvm.org/D123902
  • Loading branch information
argentite authored and MaskRay committed May 25, 2022
1 parent 6f4644d commit 9da8965
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 20 deletions.
9 changes: 9 additions & 0 deletions llvm/include/llvm/BinaryFormat/ELF.h
Expand Up @@ -564,6 +564,15 @@ enum : unsigned {
EF_MIPS_ARCH = 0xf0000000 // Mask for applying EF_MIPS_ARCH_ variant
};

// MIPS-specific section indexes
enum {
SHN_MIPS_ACOMMON = 0xff00, // Common symbols which are defined and allocated
SHN_MIPS_TEXT = 0xff01, // Not ABI compliant
SHN_MIPS_DATA = 0xff02, // Not ABI compliant
SHN_MIPS_SCOMMON = 0xff03, // Common symbols for global data area
SHN_MIPS_SUNDEFINED = 0xff04 // Undefined symbols for global data area
};

// ELF Relocation types for Mips
enum {
#include "ELFRelocs/Mips.def"
Expand Down
9 changes: 9 additions & 0 deletions llvm/lib/ObjCopy/ELF/ELFObject.cpp
Expand Up @@ -655,6 +655,15 @@ static bool isValidReservedSectionIndex(uint16_t Index, uint16_t Machine) {
return Index == SHN_AMDGPU_LDS;
}

if (Machine == EM_MIPS) {
switch (Index) {
case SHN_MIPS_ACOMMON:
case SHN_MIPS_SCOMMON:
case SHN_MIPS_SUNDEFINED:
return true;
}
}

if (Machine == EM_HEXAGON) {
switch (Index) {
case SHN_HEXAGON_SCOMMON:
Expand Down
5 changes: 5 additions & 0 deletions llvm/lib/ObjCopy/ELF/ELFObject.h
Expand Up @@ -621,6 +621,11 @@ enum SymbolShndxType {
SYMBOL_HEXAGON_SCOMMON_2 = ELF::SHN_HEXAGON_SCOMMON_2,
SYMBOL_HEXAGON_SCOMMON_4 = ELF::SHN_HEXAGON_SCOMMON_4,
SYMBOL_HEXAGON_SCOMMON_8 = ELF::SHN_HEXAGON_SCOMMON_8,
SYMBOL_MIPS_ACOMMON = ELF::SHN_MIPS_ACOMMON,
SYMBOL_MIPS_TEXT = ELF::SHN_MIPS_TEXT,
SYMBOL_MIPS_DATA = ELF::SHN_MIPS_DATA,
SYMBOL_MIPS_SCOMMON = ELF::SHN_MIPS_SCOMMON,
SYMBOL_MIPS_SUNDEFINED = ELF::SHN_MIPS_SUNDEFINED,
SYMBOL_HIPROC = ELF::SHN_HIPROC,
SYMBOL_LOOS = ELF::SHN_LOOS,
SYMBOL_HIOS = ELF::SHN_HIOS,
Expand Down
11 changes: 11 additions & 0 deletions llvm/lib/ObjectYAML/ELFYAML.cpp
Expand Up @@ -755,6 +755,8 @@ void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO,

void ScalarEnumerationTraits<ELFYAML::ELF_SHN>::enumeration(
IO &IO, ELFYAML::ELF_SHN &Value) {
const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());
assert(Object && "The IO context is not initialized");
#define ECase(X) IO.enumCase(Value, #X, ELF::X)
ECase(SHN_UNDEF);
ECase(SHN_LORESERVE);
Expand All @@ -767,6 +769,15 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHN>::enumeration(
ECase(SHN_XINDEX);
ECase(SHN_HIRESERVE);
ECase(SHN_AMDGPU_LDS);

if (!IO.outputting() || Object->getMachine() == ELF::EM_MIPS) {
ECase(SHN_MIPS_ACOMMON);
ECase(SHN_MIPS_TEXT);
ECase(SHN_MIPS_DATA);
ECase(SHN_MIPS_SCOMMON);
ECase(SHN_MIPS_SUNDEFINED);
}

ECase(SHN_HEXAGON_SCOMMON);
ECase(SHN_HEXAGON_SCOMMON_1);
ECase(SHN_HEXAGON_SCOMMON_2);
Expand Down
15 changes: 0 additions & 15 deletions llvm/test/tools/llvm-objcopy/ELF/hexagon-unsupported-on-x86.test

This file was deleted.

62 changes: 62 additions & 0 deletions llvm/test/tools/llvm-objcopy/ELF/mips-symbol.test
@@ -0,0 +1,62 @@
# RUN: yaml2obj %s -o %t
# RUN: llvm-objcopy %t %t2
# RUN: llvm-readobj --symbols %t2 | FileCheck %s

!ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_MIPS
Symbols:
- Name: test_mips_acommon
Index: SHN_MIPS_ACOMMON
Value: 0x1234
Binding: STB_GLOBAL
- Name: test_mips_scommon
Index: SHN_MIPS_SCOMMON
Value: 0x1237
Binding: STB_GLOBAL
- Name: test_mips_sundefined
Index: SHN_MIPS_SUNDEFINED
Value: 0x1238
Binding: STB_GLOBAL

# CHECK: Symbols [
# CHECK-NEXT: Symbol {
# CHECK-NEXT: Name:
# CHECK-NEXT: Value: 0x0
# CHECK-NEXT: Size: 0
# CHECK-NEXT: Binding: Local (0x0)
# CHECK-NEXT: Type: None (0x0)
# CHECK-NEXT: Other: 0
# CHECK-NEXT: Section: Undefined (0x0)
# CHECK-NEXT: }
# CHECK-NEXT: Symbol {
# CHECK-NEXT: Name: test_mips_acommon
# CHECK-NEXT: Value: 0x1234
# CHECK-NEXT: Size: 0
# CHECK-NEXT: Binding: Global (0x1)
# CHECK-NEXT: Type: None (0x0)
# CHECK-NEXT: Other: 0
# CHECK-NEXT: Section: Processor Specific (0xFF00)
# CHECK-NEXT: }
# CHECK-NEXT: Symbol {
# CHECK-NEXT: Name: test_mips_scommon
# CHECK-NEXT: Value: 0x1237
# CHECK-NEXT: Size: 0
# CHECK-NEXT: Binding: Global (0x1)
# CHECK-NEXT: Type: None (0x0)
# CHECK-NEXT: Other: 0
# CHECK-NEXT: Section: Processor Specific (0xFF03)
# CHECK-NEXT: }
# CHECK-NEXT: Symbol {
# CHECK-NEXT: Name: test_mips_sundefined
# CHECK-NEXT: Value: 0x1238
# CHECK-NEXT: Size: 0
# CHECK-NEXT: Binding: Global (0x1)
# CHECK-NEXT: Type: None (0x0)
# CHECK-NEXT: Other: 0
# CHECK-NEXT: Section: Processor Specific (0xFF04)
# CHECK-NEXT: }
# CHECK-NEXT:]
@@ -0,0 +1,17 @@
# RUN: yaml2obj %s -o %t -DMACHINE=HEXAGON
# RUN: not llvm-objcopy %t %t2 2>&1 >/dev/null | FileCheck %s -DINDEX=65280
# RUN: yaml2obj %s -o %t -DMACHINE=MIPS
# RUN: not llvm-objcopy %t %t2 2>&1 >/dev/null | FileCheck %s -DINDEX=65283

!ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
Symbols:
- Name: test
Index: SHN_[[MACHINE]]_SCOMMON
Binding: STB_GLOBAL

# CHECK: symbol 'test' has unsupported value greater than or equal to SHN_LORESERVE: [[INDEX]]
12 changes: 7 additions & 5 deletions llvm/test/tools/obj2yaml/ELF/special-symbol-indices.yaml
@@ -1,5 +1,7 @@
# RUN: yaml2obj %s -o %t
# RUN: obj2yaml %t | FileCheck %s
# RUN: yaml2obj %s -o %t -DMACHINE=HEXAGON
# RUN: obj2yaml %t | FileCheck %s -DMACHINE=HEXAGON -DNAME=SCOMMON_1
# RUN: yaml2obj %s -o %t -DMACHINE=MIPS
# RUN: obj2yaml %t | FileCheck %s -DMACHINE=MIPS -DNAME=TEXT

## Test checks that we are able to handle symbols with special/reserved indices.

Expand All @@ -15,7 +17,7 @@
# CHECK-NEXT: Section: .text
# CHECK-NEXT: Binding: STB_GLOBAL
# CHECK-NEXT: - Name: processor_specific_index
# CHECK-NEXT: Index: SHN_HEXAGON_SCOMMON_1
# CHECK-NEXT: Index: SHN_[[MACHINE]]_[[NAME]]
# CHECK-NEXT: Binding: STB_GLOBAL
# CHECK-NEXT: - Name: unknown_index
# CHECK-NEXT: Index: 0xFFFE
Expand All @@ -26,7 +28,7 @@ FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_HEXAGON
Machine: EM_[[MACHINE]]
Sections:
- Name: .text
Type: SHT_PROGBITS
Expand All @@ -42,7 +44,7 @@ Symbols:
Index: 0x1
Binding: STB_GLOBAL
- Name: processor_specific_index
Index: SHN_HEXAGON_SCOMMON_1
Index: 0xff01
Binding: STB_GLOBAL
- Name: unknown_index
Index: 0xfffe
Expand Down

0 comments on commit 9da8965

Please sign in to comment.