Skip to content

Commit

Permalink
[yaml2obj] Remove --format option in favor of YAML tags
Browse files Browse the repository at this point in the history
Summary:
Our YAML library's handling of tags isn't perfect, but it is good enough to get rid of the need for the --format argument to yaml2obj. This patch does exactly that.

Instead of requiring --format, it infers the format based on the tags found in the object file. The supported tags are:

!ELF
!COFF
!mach-o
!fat-mach-o

I have a corresponding patch that is quite large that fixes up all the in-tree test cases.

Reviewers: rafael, Bigcheese, compnerd, silvas

Subscribers: compnerd, llvm-commits

Differential Revision: http://reviews.llvm.org/D21711

llvm-svn: 273915
  • Loading branch information
Chris Bieneman committed Jun 27, 2016
1 parent f0fa61f commit 8ff0c11
Show file tree
Hide file tree
Showing 76 changed files with 261 additions and 208 deletions.
10 changes: 0 additions & 10 deletions llvm/include/llvm/ObjectYAML/MachOYAML.h
Expand Up @@ -129,12 +129,6 @@ struct UniversalBinary {
std::vector<Object> Slices;
};

struct MachFile {
bool isFat;
UniversalBinary FatFile;
Object ThinFile;
};

} // namespace llvm::MachOYAML
} // namespace llvm

Expand Down Expand Up @@ -174,10 +168,6 @@ template <> struct MappingTraits<MachOYAML::UniversalBinary> {
static void mapping(IO &IO, MachOYAML::UniversalBinary &UniversalBinary);
};

template <> struct MappingTraits<MachOYAML::MachFile> {
static void mapping(IO &IO, MachOYAML::MachFile &MachFile);
};

template <> struct MappingTraits<MachOYAML::LoadCommand> {
static void mapping(IO &IO, MachOYAML::LoadCommand &LoadCommand);
};
Expand Down
35 changes: 35 additions & 0 deletions llvm/include/llvm/ObjectYAML/ObjectYAML.h
@@ -0,0 +1,35 @@
//===- ObjectYAML.h ---------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_OBJECTYAML_OBJECTYAML_H
#define LLVM_OBJECTYAML_OBJECTYAML_H

#include "llvm/Support/YAMLTraits.h"
#include "llvm/ObjectYAML/ELFYAML.h"
#include "llvm/ObjectYAML/COFFYAML.h"
#include "llvm/ObjectYAML/MachOYAML.h"

namespace llvm {
namespace yaml {

struct YamlObjectFile {
std::unique_ptr<ELFYAML::Object> Elf;
std::unique_ptr<COFFYAML::Object> Coff;
std::unique_ptr<MachOYAML::Object> MachO;
std::unique_ptr<MachOYAML::UniversalBinary> FatMachO;
};

template <> struct MappingTraits<YamlObjectFile> {
static void mapping(IO &IO, YamlObjectFile &ObjectFile);
};

} // namespace yaml
} // namespace llvm

#endif
1 change: 1 addition & 0 deletions llvm/lib/ObjectYAML/CMakeLists.txt
Expand Up @@ -3,4 +3,5 @@ add_llvm_library(LLVMObjectYAML
COFFYAML.cpp
ELFYAML.cpp
MachOYAML.cpp
ObjectYAML.cpp
)
1 change: 1 addition & 0 deletions llvm/lib/ObjectYAML/COFFYAML.cpp
Expand Up @@ -493,6 +493,7 @@ void MappingTraits<COFFYAML::Section>::mapping(IO &IO, COFFYAML::Section &Sec) {
}

void MappingTraits<COFFYAML::Object>::mapping(IO &IO, COFFYAML::Object &Obj) {
IO.mapTag("!COFF", true);
IO.mapOptional("OptionalHeader", Obj.OptionalHeader);
IO.mapRequired("header", Obj.Header);
IO.mapRequired("sections", Obj.Sections);
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/ObjectYAML/ELFYAML.cpp
Expand Up @@ -820,6 +820,7 @@ void MappingTraits<ELFYAML::Relocation>::mapping(IO &IO,
void MappingTraits<ELFYAML::Object>::mapping(IO &IO, ELFYAML::Object &Object) {
assert(!IO.getContext() && "The IO context is initialized already");
IO.setContext(&Object);
IO.mapTag("!ELF", true);
IO.mapRequired("FileHeader", Object.Header);
IO.mapOptional("Sections", Object.Sections);
IO.mapOptional("Symbols", Object.Symbols);
Expand Down
28 changes: 0 additions & 28 deletions llvm/lib/ObjectYAML/MachOYAML.cpp
Expand Up @@ -132,34 +132,6 @@ void MappingTraits<MachOYAML::UniversalBinary>::mapping(
IO.setContext(nullptr);
}

void MappingTraits<MachOYAML::MachFile>::mapping(
IO &IO, MachOYAML::MachFile &MachFile) {
if (!IO.getContext()) {
IO.setContext(&MachFile);
}
if (IO.outputting()) {
if (MachFile.isFat) {
IO.mapTag("!fat-mach-o", true);
MappingTraits<MachOYAML::UniversalBinary>::mapping(IO, MachFile.FatFile);
} else {
IO.mapTag("!mach-o", true);
MappingTraits<MachOYAML::Object>::mapping(IO, MachFile.ThinFile);
}
} else {
if (IO.mapTag("!fat-mach-o")) {
MachFile.isFat = true;
MappingTraits<MachOYAML::UniversalBinary>::mapping(IO, MachFile.FatFile);
} else if (IO.mapTag("!mach-o")) {
MachFile.isFat = false;
MappingTraits<MachOYAML::Object>::mapping(IO, MachFile.ThinFile);
} else {
assert(false && "No tag found in YAML, cannot identify file type!");
}
}
if (IO.getContext() == &MachFile)
IO.setContext(nullptr);
}

void MappingTraits<MachOYAML::LinkEditData>::mapping(
IO &IO, MachOYAML::LinkEditData &LinkEditData) {
IO.mapOptional("RebaseOpcodes", LinkEditData.RebaseOpcodes);
Expand Down
57 changes: 57 additions & 0 deletions llvm/lib/ObjectYAML/ObjectYAML.cpp
@@ -0,0 +1,57 @@
//===- ObjectYAML.cpp - YAML utilities for object files -------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines a wrapper class for handling tagged YAML input
//
//===----------------------------------------------------------------------===//

#include "llvm/ObjectYAML/YAML.h"
#include "llvm/ObjectYAML/ObjectYAML.h"

using namespace llvm;
using namespace yaml;

void MappingTraits<YamlObjectFile>::mapping(IO &IO,
YamlObjectFile &ObjectFile) {
if (IO.outputting()) {
if (ObjectFile.Elf)
MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf);
if (ObjectFile.Coff)
MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff);
if (ObjectFile.MachO)
MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO);
if (ObjectFile.FatMachO)
MappingTraits<MachOYAML::UniversalBinary>::mapping(IO,
*ObjectFile.FatMachO);
} else {
if (IO.mapTag("!ELF")) {
ObjectFile.Elf.reset(new ELFYAML::Object());
MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf);
} else if (IO.mapTag("!COFF")) {
ObjectFile.Coff.reset(new COFFYAML::Object());
MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff);
} else if (IO.mapTag("!mach-o")) {
ObjectFile.MachO.reset(new MachOYAML::Object());
MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO);
} else if (IO.mapTag("!fat-mach-o")) {
ObjectFile.FatMachO.reset(new MachOYAML::UniversalBinary());
MappingTraits<MachOYAML::UniversalBinary>::mapping(IO,
*ObjectFile.FatMachO);
} else {
Input &In = (Input &)IO;
std::string Tag = In.getCurrentNode()->getRawTag();
if (Tag.empty())
IO.setError("YAML Object File missing document type tag!");
else
IO.setError(
llvm::Twine("YAML Object File unsupported document type tag '") +
llvm::Twine(Tag.c_str()) + llvm::Twine("'!"));
}
}
}
3 changes: 2 additions & 1 deletion llvm/test/Object/AArch64/yaml2obj-elf-aarch64-rel.yaml
@@ -1,4 +1,4 @@
# RUN: yaml2obj -format=elf %s > %t
# RUN: yaml2obj %s > %t
# RUN: obj2yaml %t | FileCheck %s

# CHECK: - Name: .rela.text
Expand All @@ -14,6 +14,7 @@
# CHECK-NEXT: Symbol: main
# CHECK-NEXT: Type: R_AARCH64_TLSGD_ADR_PREL21

!ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Object/AMDGPU/elf-definitios.yaml
@@ -1,4 +1,4 @@
# RUN: yaml2obj -format=elf %s > %t.o
# RUN: yaml2obj %s > %t.o
# RUN: llvm-readobj -s -file-headers %t.o | FileCheck %s

# CHECK: Format: ELF64-amdgpu-hsacobj
Expand All @@ -14,7 +14,7 @@
# CHECK: SHF_AMDGPU_HSA_READONLY (0x200000)
# CHECK: }

---
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Object/AMDGPU/elf32-unknown.yaml
@@ -1,9 +1,9 @@
# RUN: yaml2obj -format=elf %s > %t.o
# RUN: yaml2obj %s > %t.o
# RUN: llvm-readobj -s -file-headers %t.o | FileCheck %s

# CHECK: Format: ELF32-amdgpu

---
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Expand Down
3 changes: 2 additions & 1 deletion llvm/test/Object/AMDGPU/elf64-relocs.yaml
@@ -1,4 +1,4 @@
# RUN: yaml2obj -format=elf %s > %t
# RUN: yaml2obj %s > %t
# RUN: llvm-readobj -r %t | FileCheck %s

# CHECK: Relocations [
Expand All @@ -13,6 +13,7 @@
# CHECK: }
# CHECK: ]

!ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Object/AMDGPU/elf64-unknown.yaml
@@ -1,4 +1,4 @@
# RUN: yaml2obj -format=elf %s > %t.o
# RUN: yaml2obj %s > %t.o
# RUN: llvm-readobj -s -file-headers %t.o | FileCheck %s

# CHECK: Format: ELF64-amdgpu
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Object/Inputs/COFF/i386.yaml
@@ -1,3 +1,4 @@
!COFF
header: !Header
Machine: IMAGE_FILE_MACHINE_I386 # (0x14c)
Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ]
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Object/Inputs/COFF/long-file-symbol.yaml
@@ -1,4 +1,4 @@
---
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_AMD64
Characteristics: [ IMAGE_FILE_RELOCS_STRIPPED, IMAGE_FILE_LINE_NUMS_STRIPPED ]
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Object/Inputs/COFF/long-section-name.yaml
@@ -1,4 +1,4 @@
---
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_I386
Characteristics: [ IMAGE_FILE_RELOCS_STRIPPED, IMAGE_FILE_LINE_NUMS_STRIPPED, IMAGE_FILE_LOCAL_SYMS_STRIPPED, IMAGE_FILE_32BIT_MACHINE ]
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Object/Inputs/COFF/section-aux-symbol.yaml
@@ -1,4 +1,4 @@
---
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_I386
Characteristics: [ IMAGE_FILE_RELOCS_STRIPPED, IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LINE_NUMS_STRIPPED, IMAGE_FILE_32BIT_MACHINE, IMAGE_FILE_DEBUG_STRIPPED ]
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Object/Inputs/COFF/weak-external.yaml
@@ -1,4 +1,4 @@
---
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_I386
Characteristics: [ IMAGE_FILE_LINE_NUMS_STRIPPED, IMAGE_FILE_32BIT_MACHINE ]
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Object/Inputs/COFF/weak-externals.yaml
@@ -1,4 +1,4 @@
---
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_ARMNT
Characteristics: [ ]
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Object/Inputs/COFF/x86-64.yaml
@@ -1,3 +1,4 @@
!COFF
header: !Header
Machine: IMAGE_FILE_MACHINE_AMD64 # (0x8664)

Expand Down
3 changes: 2 additions & 1 deletion llvm/test/Object/Lanai/yaml2obj-elf-lanai-rel.yaml
@@ -1,4 +1,4 @@
# RUN: yaml2obj -format=elf %s > %t
# RUN: yaml2obj %s > %t
# RUN: llvm-readobj -r %t | FileCheck %s

# CHECK: Relocations [
Expand All @@ -13,6 +13,7 @@
# CHECK-NEXT: }
# CHECK-NEXT: ]

!ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Expand Down
3 changes: 2 additions & 1 deletion llvm/test/Object/Mips/abi-flags.yaml
@@ -1,4 +1,4 @@
# RUN: yaml2obj -format=elf %s > %t
# RUN: yaml2obj %s > %t
# RUN: llvm-readobj -mips-abi-flags %t | FileCheck -check-prefix=OBJ %s
# RUN: obj2yaml %t | FileCheck -check-prefix=YAML %s

Expand Down Expand Up @@ -34,6 +34,7 @@
# YAML-NEXT: CPR1Size: REG_64
# YAML-NEXT: Flags1: [ ODDSPREG ]

!ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2MSB
Expand Down
10 changes: 5 additions & 5 deletions llvm/test/Object/Mips/elf-abi.yaml
@@ -1,4 +1,4 @@
# RUN: yaml2obj -format=elf -docnum=1 %s > %t.o32
# RUN: yaml2obj -docnum=1 %s > %t.o32
# RUN: llvm-readobj -file-headers %t.o32 | FileCheck -check-prefix=O32OBJ %s
# RUN: obj2yaml %t.o32 | FileCheck -check-prefix=O32YAML %s

Expand All @@ -10,7 +10,7 @@

# O32YAML: Flags: [ EF_MIPS_PIC, EF_MIPS_ABI_O32, EF_MIPS_ARCH_32 ]

# RUN: yaml2obj -format=elf -docnum=2 %s > %t.o64
# RUN: yaml2obj -docnum=2 %s > %t.o64
# RUN: llvm-readobj -file-headers %t.o64 | FileCheck -check-prefix=O64OBJ %s
# RUN: obj2yaml %t.o64 | FileCheck -check-prefix=O64YAML %s

Expand All @@ -22,7 +22,7 @@

# O64YAML: Flags: [ EF_MIPS_PIC, EF_MIPS_ABI_O64, EF_MIPS_ARCH_64 ]

# RUN: yaml2obj -format=elf -docnum=3 %s > %t.eabi32
# RUN: yaml2obj -docnum=3 %s > %t.eabi32
# RUN: llvm-readobj -file-headers %t.eabi32 | FileCheck -check-prefix=E32OBJ %s
# RUN: obj2yaml %t.eabi32 | FileCheck -check-prefix=E32YAML %s

Expand All @@ -34,7 +34,7 @@

# E32YAML: Flags: [ EF_MIPS_PIC, EF_MIPS_ABI_EABI32, EF_MIPS_ARCH_32 ]

# RUN: yaml2obj -format=elf -docnum=4 %s > %t.eabi64
# RUN: yaml2obj -docnum=4 %s > %t.eabi64
# RUN: llvm-readobj -file-headers %t.eabi64 | FileCheck -check-prefix=E64OBJ %s
# RUN: obj2yaml %t.eabi64 | FileCheck -check-prefix=E64YAML %s

Expand All @@ -47,7 +47,7 @@
# E64YAML: Flags: [ EF_MIPS_PIC, EF_MIPS_ABI_EABI64, EF_MIPS_ARCH_64 ]

# o32
---
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Object/Mips/elf-flags.yaml
@@ -1,4 +1,4 @@
# RUN: yaml2obj -format=elf %s > %t
# RUN: yaml2obj %s > %t
# RUN: llvm-readobj -file-headers %t | FileCheck -check-prefix=OBJ %s
# RUN: obj2yaml %t | FileCheck -check-prefix=YAML %s

Expand All @@ -25,7 +25,7 @@
# YAML-NEXT: Machine: EM_MIPS
# YAML-NEXT: Flags: [ EF_MIPS_NOREORDER, EF_MIPS_PIC, EF_MIPS_CPIC, EF_MIPS_ABI2, EF_MIPS_32BITMODE, EF_MIPS_FP64, EF_MIPS_NAN2008, EF_MIPS_MICROMIPS, EF_MIPS_ARCH_ASE_M16, EF_MIPS_ARCH_ASE_MDMX, EF_MIPS_ABI_O32, EF_MIPS_MACH_OCTEON, EF_MIPS_ARCH_32R6 ]

---
--- !ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Object/Mips/elf-mips64-rel.yaml
@@ -1,4 +1,4 @@
# RUN: yaml2obj -format=elf %s > %t
# RUN: yaml2obj %s > %t
# RUN: llvm-readobj -r %t | FileCheck -check-prefix=OBJ %s
# RUN: obj2yaml %t | FileCheck -check-prefix=YAML %s

Expand Down Expand Up @@ -41,7 +41,7 @@
# YAML-NEXT: Type2: R_MIPS_LO16
# YAML-NEXT: SpecSym: RSS_GP0

---
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Expand Down
3 changes: 2 additions & 1 deletion llvm/test/Object/X86/yaml2obj-elf-x86-rel.yaml
@@ -1,4 +1,4 @@
# RUN: yaml2obj -format=elf %s > %t
# RUN: yaml2obj %s > %t
# RUN: llvm-readobj -r %t | FileCheck %s

# CHECK: Relocations [
Expand All @@ -7,6 +7,7 @@
# CHECK-NEXT: }
# CHECK-NEXT: ]

!ELF
FileHeader:
Class: ELFCLASS32
Data: ELFDATA2LSB
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Object/elf-unknown-type.test
@@ -1,4 +1,4 @@
# RUN: yaml2obj -format=elf %s | llvm-readobj -file-headers - | FileCheck %s
# RUN: yaml2obj %s | llvm-readobj -file-headers - | FileCheck %s

!ELF
FileHeader: !FileHeader
Expand Down

0 comments on commit 8ff0c11

Please sign in to comment.