Use ScalarBitSetTraits.

What was missing was were the type strong operator|.

llvm-svn: 178879
This commit is contained in:
Rafael Espindola 2013-04-05 16:00:31 +00:00
parent 4f841a6205
commit 1041b0bbec

View File

@ -121,7 +121,7 @@ namespace COFFYAML {
};
struct Section {
std::vector<COFF::SectionCharacteristics> Characteristics;
COFF::SectionCharacteristics Characteristics;
StringRef SectionData;
std::vector<Relocation> Relocations;
StringRef Name;
@ -129,7 +129,7 @@ namespace COFFYAML {
struct Header {
COFF::MachineTypes Machine;
std::vector<COFF::Characteristics> Characteristics;
COFF::Characteristics Characteristics;
};
struct Symbol {
@ -162,14 +162,7 @@ struct COFFParser {
void parseHeader() {
Header.Machine = Obj.HeaderData.Machine;
const std::vector<COFF::Characteristics> &Characteristics =
Obj.HeaderData.Characteristics;
for (std::vector<COFF::Characteristics>::const_iterator I =
Characteristics.begin(), E = Characteristics.end(); I != E; ++I) {
uint16_t Characteristic = *I;
Header.Characteristics |= Characteristic;
}
Header.Characteristics = Obj.HeaderData.Characteristics;
}
bool parseSections() {
@ -197,13 +190,7 @@ struct COFFParser {
std::copy(str.begin(), str.end(), Sec.Header.Name + 1);
}
for (std::vector<COFF::SectionCharacteristics>::const_iterator i =
YamlSection.Characteristics.begin(),
e = YamlSection.Characteristics.end();
i != e; ++i) {
uint32_t Characteristic = *i;
Sec.Header.Characteristics |= Characteristic;
}
Sec.Header.Characteristics = YamlSection.Characteristics;
StringRef Data = YamlSection.SectionData;
if (!hexStringToByteArray(Data, Sec.Data)) {
@ -421,13 +408,91 @@ void writeCOFF(COFFParser &CP, raw_ostream &OS) {
}
LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Relocation)
LLVM_YAML_IS_SEQUENCE_VECTOR(COFF::SectionCharacteristics)
LLVM_YAML_IS_SEQUENCE_VECTOR(COFF::Characteristics)
LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section)
LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol)
namespace llvm {
namespace COFF {
Characteristics operator|(Characteristics a, Characteristics b) {
uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);
return static_cast<Characteristics>(Ret);
}
SectionCharacteristics
operator|(SectionCharacteristics a, SectionCharacteristics b) {
uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);
return static_cast<SectionCharacteristics>(Ret);
}
}
namespace yaml {
#define BCase(X) IO.bitSetCase(Value, #X, COFF::X);
template <>
struct ScalarBitSetTraits<COFF::SectionCharacteristics> {
static void bitset(IO &IO, COFF::SectionCharacteristics &Value) {
BCase(IMAGE_SCN_TYPE_NO_PAD);
BCase(IMAGE_SCN_CNT_CODE);
BCase(IMAGE_SCN_CNT_INITIALIZED_DATA);
BCase(IMAGE_SCN_CNT_UNINITIALIZED_DATA);
BCase(IMAGE_SCN_LNK_OTHER);
BCase(IMAGE_SCN_LNK_INFO);
BCase(IMAGE_SCN_LNK_REMOVE);
BCase(IMAGE_SCN_LNK_COMDAT);
BCase(IMAGE_SCN_GPREL);
BCase(IMAGE_SCN_MEM_PURGEABLE);
BCase(IMAGE_SCN_MEM_16BIT);
BCase(IMAGE_SCN_MEM_LOCKED);
BCase(IMAGE_SCN_MEM_PRELOAD);
BCase(IMAGE_SCN_ALIGN_1BYTES);
BCase(IMAGE_SCN_ALIGN_2BYTES);
BCase(IMAGE_SCN_ALIGN_4BYTES);
BCase(IMAGE_SCN_ALIGN_8BYTES);
BCase(IMAGE_SCN_ALIGN_16BYTES);
BCase(IMAGE_SCN_ALIGN_32BYTES);
BCase(IMAGE_SCN_ALIGN_64BYTES);
BCase(IMAGE_SCN_ALIGN_128BYTES);
BCase(IMAGE_SCN_ALIGN_256BYTES);
BCase(IMAGE_SCN_ALIGN_512BYTES);
BCase(IMAGE_SCN_ALIGN_1024BYTES);
BCase(IMAGE_SCN_ALIGN_2048BYTES);
BCase(IMAGE_SCN_ALIGN_4096BYTES);
BCase(IMAGE_SCN_ALIGN_8192BYTES);
BCase(IMAGE_SCN_LNK_NRELOC_OVFL);
BCase(IMAGE_SCN_MEM_DISCARDABLE);
BCase(IMAGE_SCN_MEM_NOT_CACHED);
BCase(IMAGE_SCN_MEM_NOT_PAGED);
BCase(IMAGE_SCN_MEM_SHARED);
BCase(IMAGE_SCN_MEM_EXECUTE);
BCase(IMAGE_SCN_MEM_READ);
BCase(IMAGE_SCN_MEM_WRITE);
}
};
template <>
struct ScalarBitSetTraits<COFF::Characteristics> {
static void bitset(IO &IO, COFF::Characteristics &Value) {
BCase(IMAGE_FILE_RELOCS_STRIPPED);
BCase(IMAGE_FILE_EXECUTABLE_IMAGE);
BCase(IMAGE_FILE_LINE_NUMS_STRIPPED);
BCase(IMAGE_FILE_LOCAL_SYMS_STRIPPED);
BCase(IMAGE_FILE_AGGRESSIVE_WS_TRIM);
BCase(IMAGE_FILE_LARGE_ADDRESS_AWARE);
BCase(IMAGE_FILE_BYTES_REVERSED_LO);
BCase(IMAGE_FILE_32BIT_MACHINE);
BCase(IMAGE_FILE_DEBUG_STRIPPED);
BCase(IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP);
BCase(IMAGE_FILE_NET_RUN_FROM_SWAP);
BCase(IMAGE_FILE_SYSTEM);
BCase(IMAGE_FILE_DLL);
BCase(IMAGE_FILE_UP_SYSTEM_ONLY);
BCase(IMAGE_FILE_BYTES_REVERSED_HI);
}
};
#undef BCase
#define ECase(X) IO.enumCase(Value, #X, COFF::X);
template <>
@ -440,8 +505,6 @@ struct ScalarEnumerationTraits<COFF::SymbolComplexType> {
}
};
// FIXME: We cannot use ScalarBitSetTraits because of
// IMAGE_SYM_CLASS_END_OF_FUNCTION which is -1.
template <>
struct ScalarEnumerationTraits<COFF::SymbolStorageClass> {
static void enumeration(IO &IO, COFF::SymbolStorageClass &Value) {
@ -524,68 +587,6 @@ struct ScalarEnumerationTraits<COFF::MachineTypes> {
}
};
template <>
struct ScalarEnumerationTraits<COFF::Characteristics> {
static void enumeration(IO &IO, COFF::Characteristics &Value) {
ECase(IMAGE_FILE_RELOCS_STRIPPED);
ECase(IMAGE_FILE_EXECUTABLE_IMAGE);
ECase(IMAGE_FILE_LINE_NUMS_STRIPPED);
ECase(IMAGE_FILE_LOCAL_SYMS_STRIPPED);
ECase(IMAGE_FILE_AGGRESSIVE_WS_TRIM);
ECase(IMAGE_FILE_LARGE_ADDRESS_AWARE);
ECase(IMAGE_FILE_BYTES_REVERSED_LO);
ECase(IMAGE_FILE_32BIT_MACHINE);
ECase(IMAGE_FILE_DEBUG_STRIPPED);
ECase(IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP);
ECase(IMAGE_FILE_NET_RUN_FROM_SWAP);
ECase(IMAGE_FILE_SYSTEM);
ECase(IMAGE_FILE_DLL);
ECase(IMAGE_FILE_UP_SYSTEM_ONLY);
ECase(IMAGE_FILE_BYTES_REVERSED_HI);
}
};
template <>
struct ScalarEnumerationTraits<COFF::SectionCharacteristics> {
static void enumeration(IO &IO, COFF::SectionCharacteristics &Value) {
ECase(IMAGE_SCN_TYPE_NO_PAD);
ECase(IMAGE_SCN_CNT_CODE);
ECase(IMAGE_SCN_CNT_INITIALIZED_DATA);
ECase(IMAGE_SCN_CNT_UNINITIALIZED_DATA);
ECase(IMAGE_SCN_LNK_OTHER);
ECase(IMAGE_SCN_LNK_INFO);
ECase(IMAGE_SCN_LNK_REMOVE);
ECase(IMAGE_SCN_LNK_COMDAT);
ECase(IMAGE_SCN_GPREL);
ECase(IMAGE_SCN_MEM_PURGEABLE);
ECase(IMAGE_SCN_MEM_16BIT);
ECase(IMAGE_SCN_MEM_LOCKED);
ECase(IMAGE_SCN_MEM_PRELOAD);
ECase(IMAGE_SCN_ALIGN_1BYTES);
ECase(IMAGE_SCN_ALIGN_2BYTES);
ECase(IMAGE_SCN_ALIGN_4BYTES);
ECase(IMAGE_SCN_ALIGN_8BYTES);
ECase(IMAGE_SCN_ALIGN_16BYTES);
ECase(IMAGE_SCN_ALIGN_32BYTES);
ECase(IMAGE_SCN_ALIGN_64BYTES);
ECase(IMAGE_SCN_ALIGN_128BYTES);
ECase(IMAGE_SCN_ALIGN_256BYTES);
ECase(IMAGE_SCN_ALIGN_512BYTES);
ECase(IMAGE_SCN_ALIGN_1024BYTES);
ECase(IMAGE_SCN_ALIGN_2048BYTES);
ECase(IMAGE_SCN_ALIGN_4096BYTES);
ECase(IMAGE_SCN_ALIGN_8192BYTES);
ECase(IMAGE_SCN_LNK_NRELOC_OVFL);
ECase(IMAGE_SCN_MEM_DISCARDABLE);
ECase(IMAGE_SCN_MEM_NOT_CACHED);
ECase(IMAGE_SCN_MEM_NOT_PAGED);
ECase(IMAGE_SCN_MEM_SHARED);
ECase(IMAGE_SCN_MEM_EXECUTE);
ECase(IMAGE_SCN_MEM_READ);
ECase(IMAGE_SCN_MEM_WRITE);
}
};
template <>
struct ScalarEnumerationTraits<COFF::RelocationTypeX86> {
static void enumeration(IO &IO, COFF::RelocationTypeX86 &Value) {