[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

llvm-svn: 354876
This commit is contained in:
George Rimar 2019-02-26 14:14:49 +00:00
parent 527ed7f7fa
commit 6235d90ad3
3 changed files with 302 additions and 4 deletions

View File

@ -201,6 +201,7 @@ DYNAMIC_TAG(FILTER, 0x7FFFFFFF) // Shared object to get values from
#ifdef DYNAMIC_TAG_MARKER_DEFINED
#undef DYNAMIC_TAG_MARKER
#undef DYNAMIC_TAG_MARKER_DEFINED
#endif
#ifdef MIPS_DYNAMIC_TAG_DEFINED
#undef MIPS_DYNAMIC_TAG

View File

@ -662,19 +662,44 @@ void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration(
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

View File

@ -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