]> granicus.if.org Git - llvm/commitdiff
MC, Object: Reserve a section type, SHT_LLVM_ODRTAB, for the ODR table.
authorPeter Collingbourne <peter@pcc.me.uk>
Wed, 14 Jun 2017 18:52:12 +0000 (18:52 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Wed, 14 Jun 2017 18:52:12 +0000 (18:52 +0000)
This is part of the ODR checker proposal:
http://lists.llvm.org/pipermail/llvm-dev/2017-June/113820.html

Per discussion on the gnu-gabi mailing list [1] the section type range
0x6fff4c00..0x6fff4cff is reserved for LLVM.

[1] https://sourceware.org/ml/gnu-gabi/2017-q2/msg00030.html

Differential Revision: https://reviews.llvm.org/D33978

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305407 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/BinaryFormat/ELF.h
lib/MC/MCParser/ELFAsmParser.cpp
lib/MC/MCSectionELF.cpp
lib/Object/ELF.cpp
lib/ObjectYAML/ELFYAML.cpp
test/MC/ELF/section.s
tools/llvm-readobj/ELFDumper.cpp

index 3724f555c283614c814db00f4bd3801b79eefe30..2928aa25b855e8f1f6e0061d9166f56493f06753 100644 (file)
@@ -683,6 +683,7 @@ enum : unsigned {
   SHT_GROUP = 17,                  // Section group.
   SHT_SYMTAB_SHNDX = 18,           // Indices for SHN_XINDEX entries.
   SHT_LOOS = 0x60000000,           // Lowest operating system-specific type.
+  SHT_LLVM_ODRTAB = 0x6fff4c00,    // LLVM ODR table.
   SHT_GNU_ATTRIBUTES = 0x6ffffff5, // Object attributes.
   SHT_GNU_HASH = 0x6ffffff6,       // GNU-style hash table.
   SHT_GNU_verdef = 0x6ffffffd,     // GNU version definitions.
index f1dfb91aafbbe4bfb6fbea23be22395eb868482b..a407691b0bd1733498e1ce6592c39b3f3473e015 100644 (file)
@@ -603,6 +603,8 @@ EndStmt:
       Type = ELF::SHT_NOTE;
     else if (TypeName == "unwind")
       Type = ELF::SHT_X86_64_UNWIND;
+    else if (TypeName == "llvm_odrtab")
+      Type = ELF::SHT_LLVM_ODRTAB;
     else if (TypeName.getAsInteger(0, Type))
       return TokError("unknown section type");
   }
index a75068ebf05a50a8af662059f4a7df5efb4a0798..2f4f61aa4d50445b665c7f9956ab01d3639ee4ff 100644 (file)
@@ -147,6 +147,8 @@ void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
     // Print hex value of the flag while we do not have
     // any standard symbolic representation of the flag.
     OS << "0x7000001e";
+  else if (Type == ELF::SHT_LLVM_ODRTAB)
+    OS << "llvm_odrtab";
   else
     report_fatal_error("unsupported type 0x" + Twine::utohexstr(Type) +
                        " for section " + getSectionName());
index 9bc28dc14a296edb0de2e1f9cbca909dd8c67eae..448fb1bd6b561f2c2a6c3c39bd4fc633f91c4257 100644 (file)
@@ -192,6 +192,7 @@ StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) {
     STRINGIFY_ENUM_CASE(ELF, SHT_PREINIT_ARRAY);
     STRINGIFY_ENUM_CASE(ELF, SHT_GROUP);
     STRINGIFY_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX);
+    STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_ODRTAB);
     STRINGIFY_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES);
     STRINGIFY_ENUM_CASE(ELF, SHT_GNU_HASH);
     STRINGIFY_ENUM_CASE(ELF, SHT_GNU_verdef);
index 70e25ea504a04be5c68a8a471ee655c4e60788ca..dbd5498e003d2de54c501caf3e079a9903a14a0d 100644 (file)
@@ -372,6 +372,7 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration(
   ECase(SHT_GROUP);
   ECase(SHT_SYMTAB_SHNDX);
   ECase(SHT_LOOS);
+  ECase(SHT_LLVM_ODRTAB);
   ECase(SHT_GNU_ATTRIBUTES);
   ECase(SHT_GNU_HASH);
   ECase(SHT_GNU_verdef);
index 03a0f22e580b98f0116d22baf349464024fbdd7e..c3f7d426ba56eb545fe5b57e43cba68437164e9e 100644 (file)
@@ -267,3 +267,15 @@ bar:
 // CHECK-NEXT:       SHF_TLS
 // CHECK-NEXT:       SHF_WRITE
 // CHECK-NEXT:     ]
+
+// Test SHT_LLVM_ODRTAB
+
+.section .odrtab,"e",@llvm_odrtab
+// ASM: .section .odrtab,"e",@llvm_odrtab
+
+// CHECK:        Section {
+// CHECK:          Name: .odrtab
+// CHECK-NEXT:     Type: SHT_LLVM_ODRTAB
+// CHECK-NEXT:     Flags [
+// CHECK-NEXT:       SHF_EXCLUDE
+// CHECK-NEXT:     ]
index 116f02f7f1549b6abeaf0dda75d580e91ef95c04..a1db96cba081d13b19196fdd555b57226569fb3b 100644 (file)
@@ -2629,6 +2629,8 @@ std::string getSectionTypeString(unsigned Arch, unsigned Type) {
     return "GROUP";
   case SHT_SYMTAB_SHNDX:
     return "SYMTAB SECTION INDICES";
+  case SHT_LLVM_ODRTAB:
+    return "LLVM_ODRTAB";
   // FIXME: Parse processor specific GNU attributes
   case SHT_GNU_ATTRIBUTES:
     return "ATTRIBUTES";