diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-04-05 16:00:31 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-04-05 16:00:31 +0000 |
commit | 2bce4cc87a4021247636cc9a07e94cf467b995be (patch) | |
tree | c82c8d44f593cf7ea8df2592273e2ab69b78af52 /utils | |
parent | 3440d0b857fa6def37c1a4185ac9602be2393c9c (diff) | |
download | external_llvm-2bce4cc87a4021247636cc9a07e94cf467b995be.zip external_llvm-2bce4cc87a4021247636cc9a07e94cf467b995be.tar.gz external_llvm-2bce4cc87a4021247636cc9a07e94cf467b995be.tar.bz2 |
Use ScalarBitSetTraits.
What was missing was were the type strong operator|.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178879 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/yaml2obj/yaml2obj.cpp | 167 |
1 files changed, 84 insertions, 83 deletions
diff --git a/utils/yaml2obj/yaml2obj.cpp b/utils/yaml2obj/yaml2obj.cpp index 17b65ae..191c49f 100644 --- a/utils/yaml2obj/yaml2obj.cpp +++ b/utils/yaml2obj/yaml2obj.cpp @@ -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) { @@ -525,68 +588,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) { ECase(IMAGE_REL_I386_ABSOLUTE); |