[llvm] 9da8965 - [llvm-objcopy][ObjectYAML][mips] Add MIPS specific ELF section indexes

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Wed May 25 09:01:17 PDT 2022


Author: Anubhab Ghosh
Date: 2022-05-25T09:01:12-07:00
New Revision: 9da89651a8d551970c6a97d1b4f70675ba484b2f

URL: https://github.com/llvm/llvm-project/commit/9da89651a8d551970c6a97d1b4f70675ba484b2f
DIFF: https://github.com/llvm/llvm-project/commit/9da89651a8d551970c6a97d1b4f70675ba484b2f.diff

LOG: [llvm-objcopy][ObjectYAML][mips] Add MIPS specific ELF section indexes

This fixes https://github.com/llvm/llvm-project/issues/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

Added: 
    llvm/test/tools/llvm-objcopy/ELF/mips-symbol.test
    llvm/test/tools/llvm-objcopy/ELF/unsupported-machine-specific-shndx.test

Modified: 
    llvm/include/llvm/BinaryFormat/ELF.h
    llvm/lib/ObjCopy/ELF/ELFObject.cpp
    llvm/lib/ObjCopy/ELF/ELFObject.h
    llvm/lib/ObjectYAML/ELFYAML.cpp
    llvm/test/tools/obj2yaml/ELF/special-symbol-indices.yaml

Removed: 
    llvm/test/tools/llvm-objcopy/ELF/hexagon-unsupported-on-x86.test


################################################################################
diff  --git a/llvm/include/llvm/BinaryFormat/ELF.h b/llvm/include/llvm/BinaryFormat/ELF.h
index 2e926856fda5c..529953c59278b 100644
--- a/llvm/include/llvm/BinaryFormat/ELF.h
+++ b/llvm/include/llvm/BinaryFormat/ELF.h
@@ -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"

diff  --git a/llvm/lib/ObjCopy/ELF/ELFObject.cpp b/llvm/lib/ObjCopy/ELF/ELFObject.cpp
index b0bf1402e4485..a5d7884985a4d 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObject.cpp
+++ b/llvm/lib/ObjCopy/ELF/ELFObject.cpp
@@ -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:

diff  --git a/llvm/lib/ObjCopy/ELF/ELFObject.h b/llvm/lib/ObjCopy/ELF/ELFObject.h
index b72133a0c5d7c..896dae03f7398 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObject.h
+++ b/llvm/lib/ObjCopy/ELF/ELFObject.h
@@ -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,

diff  --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp
index f2d1b793f138c..6f429540713e9 100644
--- a/llvm/lib/ObjectYAML/ELFYAML.cpp
+++ b/llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -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);
@@ -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);

diff  --git a/llvm/test/tools/llvm-objcopy/ELF/hexagon-unsupported-on-x86.test b/llvm/test/tools/llvm-objcopy/ELF/hexagon-unsupported-on-x86.test
deleted file mode 100644
index 749f6b10b825d..0000000000000
--- a/llvm/test/tools/llvm-objcopy/ELF/hexagon-unsupported-on-x86.test
+++ /dev/null
@@ -1,15 +0,0 @@
-# RUN: yaml2obj %s -o %t
-# RUN: not llvm-objcopy %t %t2 2>&1 >/dev/null | FileCheck %s
-
-!ELF
-FileHeader:
-  Class:           ELFCLASS64
-  Data:            ELFDATA2LSB
-  Type:            ET_EXEC
-  Machine:         EM_X86_64
-Symbols:
-  - Name:     test
-    Index:    SHN_HEXAGON_SCOMMON
-    Binding:  STB_GLOBAL
-
-# CHECK: symbol 'test' has unsupported value greater than or equal to SHN_LORESERVE: 65280

diff  --git a/llvm/test/tools/llvm-objcopy/ELF/mips-symbol.test b/llvm/test/tools/llvm-objcopy/ELF/mips-symbol.test
new file mode 100644
index 0000000000000..0e85df135323e
--- /dev/null
+++ b/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:]

diff  --git a/llvm/test/tools/llvm-objcopy/ELF/unsupported-machine-specific-shndx.test b/llvm/test/tools/llvm-objcopy/ELF/unsupported-machine-specific-shndx.test
new file mode 100644
index 0000000000000..78494e8b3c30a
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/ELF/unsupported-machine-specific-shndx.test
@@ -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]]

diff  --git a/llvm/test/tools/obj2yaml/ELF/special-symbol-indices.yaml b/llvm/test/tools/obj2yaml/ELF/special-symbol-indices.yaml
index dab050b90045a..52b7f4ef88180 100644
--- a/llvm/test/tools/obj2yaml/ELF/special-symbol-indices.yaml
+++ b/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.
 
@@ -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
@@ -26,7 +28,7 @@ FileHeader:
   Class:           ELFCLASS64
   Data:            ELFDATA2LSB
   Type:            ET_EXEC
-  Machine:         EM_HEXAGON
+  Machine:         EM_[[MACHINE]]
 Sections:
   - Name: .text
     Type: SHT_PROGBITS
@@ -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


        


More information about the llvm-commits mailing list