[llvm] r354876 - [yaml2obj][obj2yaml] - Add support for the architecture specific dynamic tags.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 26 06:14:50 PST 2019


Author: grimar
Date: Tue Feb 26 06:14:49 2019
New Revision: 354876

URL: http://llvm.org/viewvc/llvm-project?rev=354876&view=rev
Log:
[yaml2obj][obj2yaml] - Add support for the architecture specific dynamic tags.

This allows tools to parse/dump the architecture specific tags
like DT_MIPS_*, DT_PPC64_* and DT_HEXAGON_*

Also fixes a bug in DynamicTags.def which was revealed in this patch.

Differential revision: https://reviews.llvm.org/D58667

Added:
    llvm/trunk/test/tools/obj2yaml/dynamic-section-arch-tags.test
Modified:
    llvm/trunk/include/llvm/BinaryFormat/DynamicTags.def
    llvm/trunk/lib/ObjectYAML/ELFYAML.cpp

Modified: llvm/trunk/include/llvm/BinaryFormat/DynamicTags.def
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/BinaryFormat/DynamicTags.def?rev=354876&r1=354875&r2=354876&view=diff
==============================================================================
--- llvm/trunk/include/llvm/BinaryFormat/DynamicTags.def (original)
+++ llvm/trunk/include/llvm/BinaryFormat/DynamicTags.def Tue Feb 26 06:14:49 2019
@@ -201,6 +201,7 @@ DYNAMIC_TAG(FILTER, 0x7FFFFFFF)    // Sh
 
 #ifdef DYNAMIC_TAG_MARKER_DEFINED
 #undef DYNAMIC_TAG_MARKER
+#undef DYNAMIC_TAG_MARKER_DEFINED
 #endif
 #ifdef MIPS_DYNAMIC_TAG_DEFINED
 #undef MIPS_DYNAMIC_TAG

Modified: llvm/trunk/lib/ObjectYAML/ELFYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/ELFYAML.cpp?rev=354876&r1=354875&r2=354876&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/ELFYAML.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/ELFYAML.cpp Tue Feb 26 06:14:49 2019
@@ -662,19 +662,44 @@ void ScalarEnumerationTraits<ELFYAML::EL
 
 void ScalarEnumerationTraits<ELFYAML::ELF_DYNTAG>::enumeration(
     IO &IO, ELFYAML::ELF_DYNTAG &Value) {
-  assert(IO.getContext() && "The IO context is not initialized");
+  const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());
+  assert(Object && "The IO context is not initialized");
 
-// TODO: For simplicity we do not handle target specific flags. They are
-// still supported and will be shown as a raw numeric values in the output.
+// Disable architecture specific tags by default. We might enable them below.
 #define MIPS_DYNAMIC_TAG(name, value)
 #define HEXAGON_DYNAMIC_TAG(name, value)
 #define PPC64_DYNAMIC_TAG(name, value)
-// Also ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc.
+// Ignore marker tags such as DT_HIOS (maps to DT_VERNEEDNUM), etc.
 #define DYNAMIC_TAG_MARKER(name, value)
 
 #define STRINGIFY(X) (#X)
 #define DYNAMIC_TAG(X, Y) IO.enumCase(Value, STRINGIFY(DT_##X), ELF::DT_##X);
+  switch (Object->Header.Machine) {
+  case ELF::EM_MIPS:
+#undef MIPS_DYNAMIC_TAG
+#define MIPS_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)
+#include "llvm/BinaryFormat/DynamicTags.def"
+#undef MIPS_DYNAMIC_TAG
+#define MIPS_DYNAMIC_TAG(name, value)
+    break;
+  case ELF::EM_HEXAGON:
+#undef HEXAGON_DYNAMIC_TAG
+#define HEXAGON_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)
+#include "llvm/BinaryFormat/DynamicTags.def"
+#undef HEXAGON_DYNAMIC_TAG
+#define HEXAGON_DYNAMIC_TAG(name, value)
+    break;
+  case ELF::EM_PPC64:
+#undef PPC64_DYNAMIC_TAG
+#define PPC64_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value)
+#include "llvm/BinaryFormat/DynamicTags.def"
+#undef PPC64_DYNAMIC_TAG
+#define PPC64_DYNAMIC_TAG(name, value)
+    break;
+  default:
 #include "llvm/BinaryFormat/DynamicTags.def"
+    break;
+  }
 
 #undef MIPS_DYNAMIC_TAG
 #undef HEXAGON_DYNAMIC_TAG

Added: llvm/trunk/test/tools/obj2yaml/dynamic-section-arch-tags.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/obj2yaml/dynamic-section-arch-tags.test?rev=354876&view=auto
==============================================================================
--- llvm/trunk/test/tools/obj2yaml/dynamic-section-arch-tags.test (added)
+++ llvm/trunk/test/tools/obj2yaml/dynamic-section-arch-tags.test Tue Feb 26 06:14:49 2019
@@ -0,0 +1,272 @@
+## Check we can use obj2yaml to yamalize the object
+## containing architecture specific dynamic tags.
+
+## Check we can handle MIPS specific tags.
+# RUN: yaml2obj -docnum=1 %s -o %t1
+# RUN: obj2yaml %t1 | FileCheck %s --check-prefix=MIPS
+
+# MIPS:      - Tag:             DT_MIPS_RLD_VERSION
+# MIPS-NEXT:   Value:           0x0000000000000001
+# MIPS-NEXT: - Tag:             DT_MIPS_TIME_STAMP
+# MIPS-NEXT:   Value:           0x0000000000000002
+# MIPS-NEXT: - Tag:             DT_MIPS_ICHECKSUM
+# MIPS-NEXT:   Value:           0x0000000000000003
+# MIPS-NEXT: - Tag:             DT_MIPS_IVERSION
+# MIPS-NEXT:   Value:           0x0000000000000004
+# MIPS-NEXT: - Tag:             DT_MIPS_FLAGS
+# MIPS-NEXT:   Value:           0x0000000000000005
+# MIPS-NEXT: - Tag:             DT_MIPS_BASE_ADDRESS
+# MIPS-NEXT:   Value:           0x0000000000000006
+# MIPS-NEXT: - Tag:             DT_MIPS_MSYM
+# MIPS-NEXT:   Value:           0x0000000000000007
+# MIPS-NEXT: - Tag:             DT_MIPS_CONFLICT
+# MIPS-NEXT:   Value:           0x0000000000000008
+# MIPS-NEXT: - Tag:             DT_MIPS_LIBLIST
+# MIPS-NEXT:   Value:           0x0000000000000009
+# MIPS-NEXT: - Tag:             DT_MIPS_LOCAL_GOTNO
+# MIPS-NEXT:   Value:           0x000000000000000A
+# MIPS-NEXT: - Tag:             DT_MIPS_CONFLICTNO
+# MIPS-NEXT:   Value:           0x000000000000000B
+# MIPS-NEXT: - Tag:             DT_MIPS_LIBLISTNO
+# MIPS-NEXT:   Value:           0x000000000000000C
+# MIPS-NEXT: - Tag:             DT_MIPS_SYMTABNO
+# MIPS-NEXT:   Value:           0x000000000000000D
+# MIPS-NEXT: - Tag:             DT_MIPS_UNREFEXTNO
+# MIPS-NEXT:   Value:           0x000000000000000E
+# MIPS-NEXT: - Tag:             DT_MIPS_GOTSYM
+# MIPS-NEXT:   Value:           0x000000000000000F
+# MIPS-NEXT: - Tag:             DT_MIPS_HIPAGENO
+# MIPS-NEXT:   Value:           0x0000000000000010
+# MIPS-NEXT: - Tag:             DT_MIPS_RLD_MAP
+# MIPS-NEXT:   Value:           0x0000000000000011
+# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_CLASS
+# MIPS-NEXT:   Value:           0x0000000000000012
+# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_CLASS_NO
+# MIPS-NEXT:   Value:           0x0000000000000013
+# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_INSTANCE
+# MIPS-NEXT:   Value:           0x0000000000000014
+# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_INSTANCE_NO
+# MIPS-NEXT:   Value:           0x0000000000000015
+# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_RELOC
+# MIPS-NEXT:   Value:           0x0000000000000016
+# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_RELOC_NO
+# MIPS-NEXT:   Value:           0x0000000000000017
+# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_SYM
+# MIPS-NEXT:   Value:           0x0000000000000018
+# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_SYM_NO
+# MIPS-NEXT:   Value:           0x0000000000000019
+# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_CLASSSYM
+# MIPS-NEXT:   Value:           0x000000000000001A
+# MIPS-NEXT: - Tag:             DT_MIPS_DELTA_CLASSSYM_NO
+# MIPS-NEXT:   Value:           0x000000000000001B
+# MIPS-NEXT: - Tag:             DT_MIPS_CXX_FLAGS
+# MIPS-NEXT:   Value:           0x000000000000001C
+# MIPS-NEXT: - Tag:             DT_MIPS_PIXIE_INIT
+# MIPS-NEXT:   Value:           0x000000000000001D
+# MIPS-NEXT: - Tag:             DT_MIPS_SYMBOL_LIB
+# MIPS-NEXT:   Value:           0x000000000000001E
+# MIPS-NEXT: - Tag:             DT_MIPS_LOCALPAGE_GOTIDX
+# MIPS-NEXT:   Value:           0x000000000000001F
+# MIPS-NEXT: - Tag:             DT_MIPS_LOCAL_GOTIDX
+# MIPS-NEXT:   Value:           0x0000000000000020
+# MIPS-NEXT: - Tag:             DT_MIPS_HIDDEN_GOTIDX
+# MIPS-NEXT:   Value:           0x0000000000000021
+# MIPS-NEXT: - Tag:             DT_MIPS_PROTECTED_GOTIDX
+# MIPS-NEXT:   Value:           0x0000000000000022
+# MIPS-NEXT: - Tag:             DT_MIPS_OPTIONS
+# MIPS-NEXT:   Value:           0x0000000000000023
+# MIPS-NEXT: - Tag:             DT_MIPS_INTERFACE
+# MIPS-NEXT:   Value:           0x0000000000000024
+# MIPS-NEXT: - Tag:             DT_MIPS_DYNSTR_ALIGN
+# MIPS-NEXT:   Value:           0x0000000000000025
+# MIPS-NEXT: - Tag:             DT_MIPS_INTERFACE_SIZE
+# MIPS-NEXT:   Value:           0x0000000000000026
+# MIPS-NEXT: - Tag:             DT_MIPS_RLD_TEXT_RESOLVE_ADDR
+# MIPS-NEXT:   Value:           0x0000000000000027
+# MIPS-NEXT: - Tag:             DT_MIPS_PERF_SUFFIX
+# MIPS-NEXT:   Value:           0x0000000000000028
+# MIPS-NEXT: - Tag:             DT_MIPS_COMPACT_SIZE
+# MIPS-NEXT:   Value:           0x0000000000000029
+# MIPS-NEXT: - Tag:             DT_MIPS_GP_VALUE
+# MIPS-NEXT:   Value:           0x000000000000002A
+# MIPS-NEXT: - Tag:             DT_MIPS_AUX_DYNAMIC
+# MIPS-NEXT:   Value:           0x000000000000002B
+# MIPS-NEXT: - Tag:             DT_MIPS_PLTGOT
+# MIPS-NEXT:   Value:           0x000000000000002C
+# MIPS-NEXT: - Tag:             DT_MIPS_RWPLT
+# MIPS-NEXT:   Value:           0x000000000000002D
+# MIPS-NEXT: - Tag:             DT_MIPS_RLD_MAP_REL
+# MIPS-NEXT:   Value:           0x000000000000002E
+
+--- !ELF
+FileHeader:
+  Class:             ELFCLASS32
+  Data:              ELFDATA2LSB
+  Type:              ET_REL
+  Machine:           EM_MIPS
+Sections:
+  - Name:            .dynamic
+    Type:            SHT_DYNAMIC
+    Entries:
+      - Tag:             DT_MIPS_RLD_VERSION
+        Value:           0x0000000000000001
+      - Tag:             DT_MIPS_TIME_STAMP
+        Value:           0x0000000000000002
+      - Tag:             DT_MIPS_ICHECKSUM
+        Value:           0x0000000000000003
+      - Tag:             DT_MIPS_IVERSION
+        Value:           0x0000000000000004 
+      - Tag:             DT_MIPS_FLAGS
+        Value:           0x0000000000000005
+      - Tag:             DT_MIPS_BASE_ADDRESS
+        Value:           0x0000000000000006
+      - Tag:             DT_MIPS_MSYM
+        Value:           0x0000000000000007
+      - Tag:             DT_MIPS_CONFLICT
+        Value:           0x0000000000000008
+      - Tag:             DT_MIPS_LIBLIST
+        Value:           0x0000000000000009
+      - Tag:             DT_MIPS_LOCAL_GOTNO
+        Value:           0x000000000000000A
+      - Tag:             DT_MIPS_CONFLICTNO
+        Value:           0x000000000000000B
+      - Tag:             DT_MIPS_LIBLISTNO
+        Value:           0x000000000000000C
+      - Tag:             DT_MIPS_SYMTABNO
+        Value:           0x000000000000000D
+      - Tag:             DT_MIPS_UNREFEXTNO
+        Value:           0x000000000000000E
+      - Tag:             DT_MIPS_GOTSYM
+        Value:           0x000000000000000F
+      - Tag:             DT_MIPS_HIPAGENO
+        Value:           0x0000000000000010
+      - Tag:             DT_MIPS_RLD_MAP
+        Value:           0x0000000000000011
+      - Tag:             DT_MIPS_DELTA_CLASS
+        Value:           0x0000000000000012
+      - Tag:             DT_MIPS_DELTA_CLASS_NO
+        Value:           0x0000000000000013
+      - Tag:             DT_MIPS_DELTA_INSTANCE
+        Value:           0x0000000000000014
+      - Tag:             DT_MIPS_DELTA_INSTANCE_NO
+        Value:           0x0000000000000015
+      - Tag:             DT_MIPS_DELTA_RELOC
+        Value:           0x0000000000000016
+      - Tag:             DT_MIPS_DELTA_RELOC_NO
+        Value:           0x0000000000000017
+      - Tag:             DT_MIPS_DELTA_SYM
+        Value:           0x0000000000000018
+      - Tag:             DT_MIPS_DELTA_SYM_NO
+        Value:           0x0000000000000019
+      - Tag:             DT_MIPS_DELTA_CLASSSYM
+        Value:           0x000000000000001A
+      - Tag:             DT_MIPS_DELTA_CLASSSYM_NO
+        Value:           0x000000000000001B
+      - Tag:             DT_MIPS_CXX_FLAGS
+        Value:           0x000000000000001C
+      - Tag:             DT_MIPS_PIXIE_INIT
+        Value:           0x000000000000001D
+      - Tag:             DT_MIPS_SYMBOL_LIB
+        Value:           0x000000000000001E
+      - Tag:             DT_MIPS_LOCALPAGE_GOTIDX
+        Value:           0x000000000000001F
+      - Tag:             DT_MIPS_LOCAL_GOTIDX
+        Value:           0x0000000000000020
+      - Tag:             DT_MIPS_HIDDEN_GOTIDX
+        Value:           0x0000000000000021
+      - Tag:             DT_MIPS_PROTECTED_GOTIDX
+        Value:           0x0000000000000022
+      - Tag:             DT_MIPS_OPTIONS
+        Value:           0x0000000000000023
+      - Tag:             DT_MIPS_INTERFACE
+        Value:           0x0000000000000024
+      - Tag:             DT_MIPS_DYNSTR_ALIGN
+        Value:           0x0000000000000025
+      - Tag:             DT_MIPS_INTERFACE_SIZE
+        Value:           0x0000000000000026
+      - Tag:             DT_MIPS_RLD_TEXT_RESOLVE_ADDR
+        Value:           0x0000000000000027
+      - Tag:             DT_MIPS_PERF_SUFFIX
+        Value:           0x0000000000000028
+      - Tag:             DT_MIPS_COMPACT_SIZE
+        Value:           0x0000000000000029
+      - Tag:             DT_MIPS_GP_VALUE
+        Value:           0x000000000000002A
+      - Tag:             DT_MIPS_AUX_DYNAMIC
+        Value:           0x000000000000002B
+      - Tag:             DT_MIPS_PLTGOT
+        Value:           0x000000000000002C
+      - Tag:             DT_MIPS_RWPLT
+        Value:           0x000000000000002D
+      - Tag:             DT_MIPS_RLD_MAP_REL
+        Value:           0x000000000000002E
+
+## Check we can handle Hexagon specific tags.
+# RUN: yaml2obj -docnum=2 %s -o %t2
+# RUN: obj2yaml %t2 | FileCheck %s --check-prefix=HEXAGON
+
+# HEXAGON:      - Tag:             DT_HEXAGON_SYMSZ
+# HEXAGON-NEXT:   Value:           0x0000000000000001
+# HEXAGON-NEXT: - Tag:             DT_HEXAGON_VER
+# HEXAGON-NEXT:   Value:           0x0000000000000002
+# HEXAGON-NEXT: - Tag:             DT_HEXAGON_PLT
+# HEXAGON-NEXT:   Value:           0x0000000000000003
+
+--- !ELF
+FileHeader:
+  Class:             ELFCLASS64
+  Data:              ELFDATA2LSB
+  Type:              ET_REL
+  Machine:           EM_HEXAGON
+Sections:
+  - Name:            .dynamic
+    Type:            SHT_DYNAMIC
+    Entries:
+      - Tag:             DT_HEXAGON_SYMSZ
+        Value:           0x0000000000000001
+      - Tag:             DT_HEXAGON_VER
+        Value:           0x0000000000000002
+      - Tag:             DT_HEXAGON_PLT
+        Value:           0x0000000000000003
+
+## Check we can handle PPC64 specific tags.
+# RUN: yaml2obj -docnum=3 %s -o %t3
+# RUN: obj2yaml %t3 | FileCheck %s --check-prefix=EM_PPC64
+
+# EM_PPC64:      - Tag:             DT_PPC64_GLINK
+# EM_PPC64-NEXT:   Value:           0x0000000000000001
+
+--- !ELF
+FileHeader:
+  Class:             ELFCLASS64
+  Data:              ELFDATA2LSB
+  Type:              ET_REL
+  Machine:           EM_PPC64
+Sections:
+  - Name:            .dynamic
+    Type:            SHT_DYNAMIC
+    Entries:
+      - Tag:             DT_PPC64_GLINK
+        Value:           0x0000000000000001
+
+## Check we can't use a tag from a different architecture,
+## even if it has the same numeric value as a valid tag.
+## Here for EM_PPC64 we are trying to use DT_HEXAGON_SYMSZ
+## instead of DT_PPC64_GLINK. They both have value of 0x70000000.
+
+# RUN: not yaml2obj -docnum=4 %s 2>&1 | FileCheck %s --check-prefix=ERR
+# ERR:      error: invalid hex64 number
+# ERR-NEXT: - Tag: DT_HEXAGON_SYMSZ
+
+--- !ELF
+FileHeader:
+  Class:             ELFCLASS64
+  Data:              ELFDATA2LSB
+  Type:              ET_REL
+  Machine:           EM_PPC64
+Sections:
+  - Name:            .dynamic
+    Type:            SHT_DYNAMIC
+    Entries:
+      - Tag:             DT_HEXAGON_SYMSZ
+        Value:           0x0000000000000001




More information about the llvm-commits mailing list