mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-02 07:32:52 +00:00
Move BinaryRef to a new include/llvm/Object/YAML.h file.
It will be used for ELF dumping too. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183287 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6afb65c2b7
commit
5fd5fe0f7b
@ -14,9 +14,8 @@
|
|||||||
#ifndef LLVM_OBJECT_COFFYAML_H
|
#ifndef LLVM_OBJECT_COFFYAML_H
|
||||||
#define LLVM_OBJECT_COFFYAML_H
|
#define LLVM_OBJECT_COFFYAML_H
|
||||||
|
|
||||||
|
#include "llvm/Object/YAML.h"
|
||||||
#include "llvm/Support/COFF.h"
|
#include "llvm/Support/COFF.h"
|
||||||
#include "llvm/Support/YAMLTraits.h"
|
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
@ -36,32 +35,10 @@ inline SectionCharacteristics operator|(SectionCharacteristics a,
|
|||||||
// The structure of the yaml files is not an exact 1:1 match to COFF. In order
|
// The structure of the yaml files is not an exact 1:1 match to COFF. In order
|
||||||
// to use yaml::IO, we use these structures which are closer to the source.
|
// to use yaml::IO, we use these structures which are closer to the source.
|
||||||
namespace COFFYAML {
|
namespace COFFYAML {
|
||||||
/// In an object file this is just a binary blob. In an yaml file it is an hex
|
|
||||||
/// string. Using this avoid having to allocate temporary strings.
|
|
||||||
/// FIXME: not COFF specific.
|
|
||||||
class BinaryRef {
|
|
||||||
ArrayRef<uint8_t> Data;
|
|
||||||
bool isBinary;
|
|
||||||
public:
|
|
||||||
BinaryRef(ArrayRef<uint8_t> Data) : Data(Data), isBinary(true) {}
|
|
||||||
BinaryRef(StringRef Data)
|
|
||||||
: Data(reinterpret_cast<const uint8_t *>(Data.data()), Data.size()),
|
|
||||||
isBinary(false) {}
|
|
||||||
BinaryRef() : isBinary(false) {}
|
|
||||||
StringRef getHex() const {
|
|
||||||
assert(!isBinary);
|
|
||||||
return StringRef(reinterpret_cast<const char*>(Data.data()), Data.size());
|
|
||||||
}
|
|
||||||
ArrayRef<uint8_t> getBinary() const {
|
|
||||||
assert(isBinary);
|
|
||||||
return Data;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Section {
|
struct Section {
|
||||||
COFF::section Header;
|
COFF::section Header;
|
||||||
unsigned Alignment;
|
unsigned Alignment;
|
||||||
BinaryRef SectionData;
|
object::yaml::BinaryRef SectionData;
|
||||||
std::vector<COFF::relocation> Relocations;
|
std::vector<COFF::relocation> Relocations;
|
||||||
StringRef Name;
|
StringRef Name;
|
||||||
Section();
|
Section();
|
||||||
@ -71,7 +48,7 @@ namespace COFFYAML {
|
|||||||
COFF::symbol Header;
|
COFF::symbol Header;
|
||||||
COFF::SymbolBaseType SimpleType;
|
COFF::SymbolBaseType SimpleType;
|
||||||
COFF::SymbolComplexType ComplexType;
|
COFF::SymbolComplexType ComplexType;
|
||||||
BinaryRef AuxiliaryData;
|
object::yaml::BinaryRef AuxiliaryData;
|
||||||
StringRef Name;
|
StringRef Name;
|
||||||
Symbol();
|
Symbol();
|
||||||
};
|
};
|
||||||
@ -92,12 +69,6 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(COFF::relocation)
|
|||||||
namespace llvm {
|
namespace llvm {
|
||||||
namespace yaml {
|
namespace yaml {
|
||||||
|
|
||||||
template<>
|
|
||||||
struct ScalarTraits<COFFYAML::BinaryRef> {
|
|
||||||
static void output(const COFFYAML::BinaryRef &, void*, llvm::raw_ostream &);
|
|
||||||
static StringRef input(StringRef, void*, COFFYAML::BinaryRef &);
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct ScalarEnumerationTraits<COFF::MachineTypes> {
|
struct ScalarEnumerationTraits<COFF::MachineTypes> {
|
||||||
static void enumeration(IO &IO, COFF::MachineTypes &Value);
|
static void enumeration(IO &IO, COFF::MachineTypes &Value);
|
||||||
|
59
include/llvm/Object/YAML.h
Normal file
59
include/llvm/Object/YAML.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
//===- YAML.h - YAMLIO utilities for object files ---------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file declares utility classes for handling the YAML representation of
|
||||||
|
// object files.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef LLVM_OBJECT_YAML_H
|
||||||
|
#define LLVM_OBJECT_YAML_H
|
||||||
|
|
||||||
|
#include "llvm/Support/YAMLTraits.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
namespace object {
|
||||||
|
namespace yaml {
|
||||||
|
|
||||||
|
/// In an object file this is just a binary blob. In an yaml file it is an hex
|
||||||
|
/// string. Using this avoid having to allocate temporary strings.
|
||||||
|
class BinaryRef {
|
||||||
|
ArrayRef<uint8_t> Data;
|
||||||
|
bool isBinary;
|
||||||
|
|
||||||
|
public:
|
||||||
|
BinaryRef(ArrayRef<uint8_t> Data) : Data(Data), isBinary(true) {}
|
||||||
|
BinaryRef(StringRef Data)
|
||||||
|
: Data(reinterpret_cast<const uint8_t *>(Data.data()), Data.size()),
|
||||||
|
isBinary(false) {}
|
||||||
|
BinaryRef() : isBinary(false) {}
|
||||||
|
StringRef getHex() const {
|
||||||
|
assert(!isBinary);
|
||||||
|
return StringRef(reinterpret_cast<const char *>(Data.data()), Data.size());
|
||||||
|
}
|
||||||
|
ArrayRef<uint8_t> getBinary() const {
|
||||||
|
assert(isBinary);
|
||||||
|
return Data;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace yaml {
|
||||||
|
template <> struct ScalarTraits<object::yaml::BinaryRef> {
|
||||||
|
static void output(const object::yaml::BinaryRef &, void *,
|
||||||
|
llvm::raw_ostream &);
|
||||||
|
static StringRef input(StringRef, void *, object::yaml::BinaryRef &);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -8,4 +8,5 @@ add_llvm_library(LLVMObject
|
|||||||
MachOObjectFile.cpp
|
MachOObjectFile.cpp
|
||||||
Object.cpp
|
Object.cpp
|
||||||
ObjectFile.cpp
|
ObjectFile.cpp
|
||||||
|
YAML.cpp
|
||||||
)
|
)
|
||||||
|
@ -229,23 +229,6 @@ struct NType {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScalarTraits<COFFYAML::BinaryRef>::output(const COFFYAML::BinaryRef &Val,
|
|
||||||
void *, llvm::raw_ostream &Out) {
|
|
||||||
ArrayRef<uint8_t> Data = Val.getBinary();
|
|
||||||
for (ArrayRef<uint8_t>::iterator I = Data.begin(), E = Data.end(); I != E;
|
|
||||||
++I) {
|
|
||||||
uint8_t Byte = *I;
|
|
||||||
Out << hexdigit(Byte >> 4);
|
|
||||||
Out << hexdigit(Byte & 0xf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
StringRef ScalarTraits<COFFYAML::BinaryRef>::input(StringRef Scalar, void *,
|
|
||||||
COFFYAML::BinaryRef &Val) {
|
|
||||||
Val = COFFYAML::BinaryRef(Scalar);
|
|
||||||
return StringRef();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MappingTraits<COFF::relocation>::mapping(IO &IO, COFF::relocation &Rel) {
|
void MappingTraits<COFF::relocation>::mapping(IO &IO, COFF::relocation &Rel) {
|
||||||
MappingNormalization<NType, uint16_t> NT(IO, Rel.Type);
|
MappingNormalization<NType, uint16_t> NT(IO, Rel.Type);
|
||||||
|
|
||||||
|
34
lib/Object/YAML.cpp
Normal file
34
lib/Object/YAML.cpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
//===- YAML.cpp - YAMLIO 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 utility classes for handling the YAML representation of
|
||||||
|
// object files.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "llvm/Object/YAML.h"
|
||||||
|
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
void yaml::ScalarTraits<object::yaml::BinaryRef>::output(
|
||||||
|
const object::yaml::BinaryRef &Val, void *, llvm::raw_ostream &Out) {
|
||||||
|
ArrayRef<uint8_t> Data = Val.getBinary();
|
||||||
|
for (ArrayRef<uint8_t>::iterator I = Data.begin(), E = Data.end(); I != E;
|
||||||
|
++I) {
|
||||||
|
uint8_t Byte = *I;
|
||||||
|
Out << hexdigit(Byte >> 4);
|
||||||
|
Out << hexdigit(Byte & 0xf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StringRef yaml::ScalarTraits<object::yaml::BinaryRef>::input(
|
||||||
|
StringRef Scalar, void *, object::yaml::BinaryRef &Val) {
|
||||||
|
Val = object::yaml::BinaryRef(Scalar);
|
||||||
|
return StringRef();
|
||||||
|
}
|
@ -64,7 +64,7 @@ void COFFDumper::dumpSections(unsigned NumSections) {
|
|||||||
|
|
||||||
ArrayRef<uint8_t> sectionData;
|
ArrayRef<uint8_t> sectionData;
|
||||||
Obj.getSectionContents(Sect, sectionData);
|
Obj.getSectionContents(Sect, sectionData);
|
||||||
Sec.SectionData = COFFYAML::BinaryRef(sectionData);
|
Sec.SectionData = object::yaml::BinaryRef(sectionData);
|
||||||
|
|
||||||
std::vector<COFF::relocation> Relocations;
|
std::vector<COFF::relocation> Relocations;
|
||||||
for (object::relocation_iterator rIter = iter->begin_relocations();
|
for (object::relocation_iterator rIter = iter->begin_relocations();
|
||||||
@ -96,7 +96,7 @@ void COFFDumper::dumpSymbols(unsigned NumSymbols) {
|
|||||||
Sym.Header.Value = Symbol->Value;
|
Sym.Header.Value = Symbol->Value;
|
||||||
Sym.Header.SectionNumber = Symbol->SectionNumber;
|
Sym.Header.SectionNumber = Symbol->SectionNumber;
|
||||||
Sym.Header.NumberOfAuxSymbols = Symbol->NumberOfAuxSymbols;
|
Sym.Header.NumberOfAuxSymbols = Symbol->NumberOfAuxSymbols;
|
||||||
Sym.AuxiliaryData = COFFYAML::BinaryRef(Obj.getSymbolAuxData(Symbol));
|
Sym.AuxiliaryData = object::yaml::BinaryRef(Obj.getSymbolAuxData(Symbol));
|
||||||
Symbols.push_back(Sym);
|
Symbols.push_back(Sym);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user