<div dir="ltr"><span style="font-size:13px">+ errs() << "error: Invalid section type.\n";</span><br><div><span style="font-size:13px"><br></span></div><div><span style="font-size:13px">Please give a bit more info. At least mention </span><span style="font-size:13px">SHT_MIPS_ABIFLAGS.</span></div><div><span style="font-size:13px"><br></span></div><div><span style="font-size:13px">-- Sean Silva</span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 7, 2015 at 8:40 AM, Simon Atanasyan <span dir="ltr"><<a href="mailto:simon@atanasyan.com" target="_blank">simon@atanasyan.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: atanasyan<br>
Date: Thu May 7 10:40:48 2015<br>
New Revision: 236738<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=236738&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=236738&view=rev</a><br>
Log:<br>
[obj2yaml/yaml2obj] Add SHT_MIPS_ABIFLAGS section support<br>
<br>
This change adds support for the SHT_MIPS_ABIFLAGS section<br>
reading/writing to the obj2yaml and yaml2obj tools.<br>
<br>
Added:<br>
llvm/trunk/test/Object/Mips/abi-flags.yaml<br>
Modified:<br>
llvm/trunk/include/llvm/Object/ELFYAML.h<br>
llvm/trunk/lib/Object/ELFYAML.cpp<br>
llvm/trunk/test/Object/obj2yaml.test<br>
llvm/trunk/tools/obj2yaml/elf2yaml.cpp<br>
llvm/trunk/tools/yaml2obj/yaml2elf.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/Object/ELFYAML.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELFYAML.h?rev=236738&r1=236737&r2=236738&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELFYAML.h?rev=236738&r1=236737&r2=236738&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Object/ELFYAML.h (original)<br>
+++ llvm/trunk/include/llvm/Object/ELFYAML.h Thu May 7 10:40:48 2015<br>
@@ -48,6 +48,13 @@ LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_ST<br>
LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STV)<br>
LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STO)<br>
<br>
+LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_AFL_REG)<br>
+LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_ABI_FP)<br>
+LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_EXT)<br>
+LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_ASE)<br>
+LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_FLAGS1)<br>
+LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_ISA)<br>
+<br>
// For now, hardcode 64 bits everywhere that 32 or 64 would be needed<br>
// since 64-bit can hold 32-bit values too.<br>
struct FileHeader {<br>
@@ -78,7 +85,7 @@ struct SectionOrType {<br>
};<br>
<br>
struct Section {<br>
- enum class SectionKind { Group, RawContent, Relocation };<br>
+ enum class SectionKind { Group, RawContent, Relocation, MipsABIFlags };<br>
SectionKind Kind;<br>
StringRef Name;<br>
ELF_SHT Type;<br>
@@ -122,6 +129,26 @@ struct RelocationSection : Section {<br>
return S->Kind == SectionKind::Relocation;<br>
}<br>
};<br>
+<br>
+// Represents .MIPS.abiflags section<br>
+struct MipsABIFlags : Section {<br>
+ llvm::yaml::Hex16 Version;<br>
+ MIPS_ISA ISALevel;<br>
+ llvm::yaml::Hex8 ISARevision;<br>
+ MIPS_AFL_REG GPRSize;<br>
+ MIPS_AFL_REG CPR1Size;<br>
+ MIPS_AFL_REG CPR2Size;<br>
+ MIPS_ABI_FP FpABI;<br>
+ MIPS_AFL_EXT ISAExtension;<br>
+ MIPS_AFL_ASE ASEs;<br>
+ MIPS_AFL_FLAGS1 Flags1;<br>
+ llvm::yaml::Hex32 Flags2;<br>
+ MipsABIFlags() : Section(SectionKind::MipsABIFlags) {}<br>
+ static bool classof(const Section *S) {<br>
+ return S->Kind == SectionKind::MipsABIFlags;<br>
+ }<br>
+};<br>
+<br>
struct Object {<br>
FileHeader Header;<br>
std::vector<std::unique_ptr<Section>> Sections;<br>
@@ -209,6 +236,36 @@ struct ScalarEnumerationTraits<ELFYAML::<br>
};<br>
<br>
template <><br>
+struct ScalarEnumerationTraits<ELFYAML::MIPS_AFL_REG> {<br>
+ static void enumeration(IO &IO, ELFYAML::MIPS_AFL_REG &Value);<br>
+};<br>
+<br>
+template <><br>
+struct ScalarEnumerationTraits<ELFYAML::MIPS_ABI_FP> {<br>
+ static void enumeration(IO &IO, ELFYAML::MIPS_ABI_FP &Value);<br>
+};<br>
+<br>
+template <><br>
+struct ScalarEnumerationTraits<ELFYAML::MIPS_AFL_EXT> {<br>
+ static void enumeration(IO &IO, ELFYAML::MIPS_AFL_EXT &Value);<br>
+};<br>
+<br>
+template <><br>
+struct ScalarEnumerationTraits<ELFYAML::MIPS_ISA> {<br>
+ static void enumeration(IO &IO, ELFYAML::MIPS_ISA &Value);<br>
+};<br>
+<br>
+template <><br>
+struct ScalarBitSetTraits<ELFYAML::MIPS_AFL_ASE> {<br>
+ static void bitset(IO &IO, ELFYAML::MIPS_AFL_ASE &Value);<br>
+};<br>
+<br>
+template <><br>
+struct ScalarBitSetTraits<ELFYAML::MIPS_AFL_FLAGS1> {<br>
+ static void bitset(IO &IO, ELFYAML::MIPS_AFL_FLAGS1 &Value);<br>
+};<br>
+<br>
+template <><br>
struct MappingTraits<ELFYAML::FileHeader> {<br>
static void mapping(IO &IO, ELFYAML::FileHeader &FileHdr);<br>
};<br>
<br>
Modified: llvm/trunk/lib/Object/ELFYAML.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ELFYAML.cpp?rev=236738&r1=236737&r2=236738&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ELFYAML.cpp?rev=236738&r1=236737&r2=236738&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Object/ELFYAML.cpp (original)<br>
+++ llvm/trunk/lib/Object/ELFYAML.cpp Thu May 7 10:40:48 2015<br>
@@ -13,6 +13,7 @@<br>
<br>
#include "llvm/Object/ELFYAML.h"<br>
#include "llvm/Support/Casting.h"<br>
+#include "llvm/Support/MipsABIFlags.h"<br>
<br>
namespace llvm {<br>
<br>
@@ -461,6 +462,93 @@ void ScalarEnumerationTraits<ELFYAML::EL<br>
#undef ELF_RELOC<br>
}<br>
<br>
+void ScalarEnumerationTraits<ELFYAML::MIPS_AFL_REG>::enumeration(<br>
+ IO &IO, ELFYAML::MIPS_AFL_REG &Value) {<br>
+#define ECase(X) IO.enumCase(Value, #X, Mips::AFL_##X);<br>
+ ECase(REG_NONE)<br>
+ ECase(REG_32)<br>
+ ECase(REG_64)<br>
+ ECase(REG_128)<br>
+#undef ECase<br>
+}<br>
+<br>
+void ScalarEnumerationTraits<ELFYAML::MIPS_ABI_FP>::enumeration(<br>
+ IO &IO, ELFYAML::MIPS_ABI_FP &Value) {<br>
+#define ECase(X) IO.enumCase(Value, #X, Mips::Val_GNU_MIPS_ABI_##X);<br>
+ ECase(FP_ANY)<br>
+ ECase(FP_DOUBLE)<br>
+ ECase(FP_SINGLE)<br>
+ ECase(FP_SOFT)<br>
+ ECase(FP_OLD_64)<br>
+ ECase(FP_XX)<br>
+ ECase(FP_64)<br>
+ ECase(FP_64A)<br>
+#undef ECase<br>
+}<br>
+<br>
+void ScalarEnumerationTraits<ELFYAML::MIPS_AFL_EXT>::enumeration(<br>
+ IO &IO, ELFYAML::MIPS_AFL_EXT &Value) {<br>
+#define ECase(X) IO.enumCase(Value, #X, Mips::AFL_##X);<br>
+ ECase(EXT_NONE)<br>
+ ECase(EXT_XLR)<br>
+ ECase(EXT_OCTEON2)<br>
+ ECase(EXT_OCTEONP)<br>
+ ECase(EXT_LOONGSON_3A)<br>
+ ECase(EXT_OCTEON)<br>
+ ECase(EXT_5900)<br>
+ ECase(EXT_4650)<br>
+ ECase(EXT_4010)<br>
+ ECase(EXT_4100)<br>
+ ECase(EXT_3900)<br>
+ ECase(EXT_10000)<br>
+ ECase(EXT_SB1)<br>
+ ECase(EXT_4111)<br>
+ ECase(EXT_4120)<br>
+ ECase(EXT_5400)<br>
+ ECase(EXT_5500)<br>
+ ECase(EXT_LOONGSON_2E)<br>
+ ECase(EXT_LOONGSON_2F)<br>
+ ECase(EXT_OCTEON3)<br>
+#undef ECase<br>
+}<br>
+<br>
+void ScalarEnumerationTraits<ELFYAML::MIPS_ISA>::enumeration(<br>
+ IO &IO, ELFYAML::MIPS_ISA &Value) {<br>
+ IO.enumCase(Value, "MIPS1", 1);<br>
+ IO.enumCase(Value, "MIPS2", 2);<br>
+ IO.enumCase(Value, "MIPS3", 3);<br>
+ IO.enumCase(Value, "MIPS4", 4);<br>
+ IO.enumCase(Value, "MIPS5", 5);<br>
+ IO.enumCase(Value, "MIPS32", 32);<br>
+ IO.enumCase(Value, "MIPS64", 64);<br>
+}<br>
+<br>
+void ScalarBitSetTraits<ELFYAML::MIPS_AFL_ASE>::bitset(<br>
+ IO &IO, ELFYAML::MIPS_AFL_ASE &Value) {<br>
+#define BCase(X) IO.bitSetCase(Value, #X, Mips::AFL_ASE_##X);<br>
+ BCase(DSP)<br>
+ BCase(DSPR2)<br>
+ BCase(EVA)<br>
+ BCase(MCU)<br>
+ BCase(MDMX)<br>
+ BCase(MIPS3D)<br>
+ BCase(MT)<br>
+ BCase(SMARTMIPS)<br>
+ BCase(VIRT)<br>
+ BCase(MSA)<br>
+ BCase(MIPS16)<br>
+ BCase(MICROMIPS)<br>
+ BCase(XPA)<br>
+#undef BCase<br>
+}<br>
+<br>
+void ScalarBitSetTraits<ELFYAML::MIPS_AFL_FLAGS1>::bitset(<br>
+ IO &IO, ELFYAML::MIPS_AFL_FLAGS1 &Value) {<br>
+#define BCase(X) IO.bitSetCase(Value, #X, Mips::AFL_FLAGS1_##X);<br>
+ BCase(ODDSPREG)<br>
+#undef BCase<br>
+}<br>
+<br>
void MappingTraits<ELFYAML::FileHeader>::mapping(IO &IO,<br>
ELFYAML::FileHeader &FileHdr) {<br>
IO.mapRequired("Class", FileHdr.Class);<br>
@@ -536,6 +624,26 @@ void MappingTraits<ELFYAML::SectionOrTyp<br>
IO.mapRequired("SectionOrType", sectionOrType.sectionNameOrType);<br>
}<br>
<br>
+static void sectionMapping(IO &IO, ELFYAML::MipsABIFlags &Section) {<br>
+ commonSectionMapping(IO, Section);<br>
+ IO.mapOptional("Version", Section.Version, Hex16(0));<br>
+ IO.mapRequired("ISA", Section.ISALevel);<br>
+ IO.mapOptional("ISARevision", Section.ISARevision, Hex8(0));<br>
+ IO.mapOptional("ISAExtension", Section.ISAExtension,<br>
+ ELFYAML::MIPS_AFL_EXT(Mips::AFL_EXT_NONE));<br>
+ IO.mapOptional("ASEs", Section.ASEs, ELFYAML::MIPS_AFL_ASE(0));<br>
+ IO.mapOptional("FpABI", Section.FpABI,<br>
+ ELFYAML::MIPS_ABI_FP(Mips::Val_GNU_MIPS_ABI_FP_ANY));<br>
+ IO.mapOptional("GPRSize", Section.GPRSize,<br>
+ ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE));<br>
+ IO.mapOptional("CPR1Size", Section.CPR1Size,<br>
+ ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE));<br>
+ IO.mapOptional("CPR2Size", Section.CPR2Size,<br>
+ ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE));<br>
+ IO.mapOptional("Flags1", Section.Flags1, ELFYAML::MIPS_AFL_FLAGS1(0));<br>
+ IO.mapOptional("Flags2", Section.Flags2, Hex32(0));<br>
+}<br>
+<br>
void MappingTraits<std::unique_ptr<ELFYAML::Section>>::mapping(<br>
IO &IO, std::unique_ptr<ELFYAML::Section> &Section) {<br>
ELFYAML::ELF_SHT sectionType;<br>
@@ -556,6 +664,11 @@ void MappingTraits<std::unique_ptr<ELFYA<br>
Section.reset(new ELFYAML::Group());<br>
groupSectionMapping(IO, *cast<ELFYAML::Group>(Section.get()));<br>
break;<br>
+ case ELF::SHT_MIPS_ABIFLAGS:<br>
+ if (!IO.outputting())<br>
+ Section.reset(new ELFYAML::MipsABIFlags());<br>
+ sectionMapping(IO, *cast<ELFYAML::MipsABIFlags>(Section.get()));<br>
+ break;<br>
default:<br>
if (!IO.outputting())<br>
Section.reset(new ELFYAML::RawContentSection());<br>
@@ -625,5 +738,11 @@ void MappingTraits<ELFYAML::Object>::map<br>
IO.setContext(nullptr);<br>
}<br>
<br>
+LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_AFL_REG)<br>
+LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_ABI_FP)<br>
+LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_EXT)<br>
+LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_ASE)<br>
+LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_FLAGS1)<br>
+<br>
} // end namespace yaml<br>
} // end namespace llvm<br>
<br>
Added: llvm/trunk/test/Object/Mips/abi-flags.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Mips/abi-flags.yaml?rev=236738&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Mips/abi-flags.yaml?rev=236738&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Object/Mips/abi-flags.yaml (added)<br>
+++ llvm/trunk/test/Object/Mips/abi-flags.yaml Thu May 7 10:40:48 2015<br>
@@ -0,0 +1,63 @@<br>
+# RUN: yaml2obj -format=elf %s > %t<br>
+# RUN: llvm-readobj -mips-abi-flags %t | FileCheck -check-prefix=OBJ %s<br>
+# RUN: obj2yaml %t | FileCheck -check-prefix=YAML %s<br>
+<br>
+# OBJ: MIPS ABI Flags {<br>
+# OBJ-NEXT: Version: 0<br>
+# OBJ-NEXT: ISA: MIPS64r5<br>
+# OBJ-NEXT: ISA Extension: Cavium Networks Octeon3 (0x13)<br>
+# OBJ-NEXT: ASEs [ (0x103)<br>
+# OBJ-NEXT: DSP (0x1)<br>
+# OBJ-NEXT: DSPR2 (0x2)<br>
+# OBJ-NEXT: VZ (0x100)<br>
+# OBJ-NEXT: ]<br>
+# OBJ-NEXT: FP ABI: Hard float (double precision) (0x1)<br>
+# OBJ-NEXT: GPR size: 64<br>
+# OBJ-NEXT: CPR1 size: 64<br>
+# OBJ-NEXT: CPR2 size: 0<br>
+# OBJ-NEXT: Flags 1 [ (0x1)<br>
+# OBJ-NEXT: ODDSPREG (0x1)<br>
+# OBJ-NEXT: ]<br>
+# OBJ-NEXT: Flags 2: 0x0<br>
+# OBJ-NEXT: }<br>
+<br>
+# YAML: Sections:<br>
+# YAML-NEXT: - Name: .MIPS.abiflags<br>
+# YAML-NEXT: Type: SHT_MIPS_ABIFLAGS<br>
+# YAML-NEXT: AddressAlign: 0x0000000000000008<br>
+# YAML-NEXT: ISA: MIPS64<br>
+# YAML-NEXT: ISARevision: 0x05<br>
+# YAML-NEXT: ISAExtension: EXT_OCTEON3<br>
+# YAML-NEXT: ASEs: [ DSP, DSPR2, VIRT ]<br>
+# YAML-NEXT: FpABI: FP_DOUBLE<br>
+# YAML-NEXT: GPRSize: REG_64<br>
+# YAML-NEXT: CPR1Size: REG_64<br>
+# YAML-NEXT: Flags1: [ ODDSPREG ]<br>
+<br>
+FileHeader:<br>
+ Class: ELFCLASS64<br>
+ Data: ELFDATA2MSB<br>
+ Type: ET_REL<br>
+ Machine: EM_MIPS<br>
+<br>
+Sections:<br>
+- Name: .MIPS.abiflags<br>
+ Type: SHT_MIPS_ABIFLAGS<br>
+ AddressAlign: 8<br>
+ Version: 0<br>
+ ISA: MIPS64<br>
+ ISARevision: 5<br>
+ ISAExtension: EXT_OCTEON3<br>
+ ASEs: [ DSP, DSPR2, VIRT ]<br>
+ FpABI: FP_DOUBLE<br>
+ GPRSize: REG_64<br>
+ CPR1Size: REG_64<br>
+ CPR2Size: REG_NONE<br>
+ Flags1: [ ODDSPREG ]<br>
+ Flags2: 0x0<br>
+<br>
+Symbols:<br>
+ Local:<br>
+ - Name: .MIPS.abiflags<br>
+ Type: STT_SECTION<br>
+ Section: .MIPS.abiflags<br>
<br>
Modified: llvm/trunk/test/Object/obj2yaml.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/obj2yaml.test?rev=236738&r1=236737&r2=236738&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/obj2yaml.test?rev=236738&r1=236737&r2=236738&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Object/obj2yaml.test (original)<br>
+++ llvm/trunk/test/Object/obj2yaml.test Thu May 7 10:40:48 2015<br>
@@ -253,7 +253,12 @@ ELF-MIPSEL-NEXT: - Name: .M<br>
ELF-MIPSEL-NEXT: Type: SHT_MIPS_ABIFLAGS<br>
ELF-MIPSEL-NEXT: Flags: [ SHF_ALLOC ]<br>
ELF-MIPSEL-NEXT: AddressAlign: 0x0000000000000008<br>
-ELF-MIPSEL-NEXT: Content: '000020010101000100000000000000000100000000000000'<br>
+ELF-MIPSEL-NEXT: ISA: MIPS32<br>
+ELF-MIPSEL-NEXT: ISARevision: 0x01<br>
+ELF-MIPSEL-NEXT: FpABI: FP_DOUBLE<br>
+ELF-MIPSEL-NEXT: GPRSize: REG_32<br>
+ELF-MIPSEL-NEXT: CPR1Size: REG_32<br>
+ELF-MIPSEL-NEXT: Flags1: [ ODDSPREG ]<br>
ELF-MIPSEL-NEXT: Symbols:<br>
ELF-MIPSEL-NEXT: Local:<br>
ELF-MIPSEL-NEXT: - Name: trivial.ll<br>
<br>
Modified: llvm/trunk/tools/obj2yaml/elf2yaml.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/elf2yaml.cpp?rev=236738&r1=236737&r2=236738&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/elf2yaml.cpp?rev=236738&r1=236737&r2=236738&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/obj2yaml/elf2yaml.cpp (original)<br>
+++ llvm/trunk/tools/obj2yaml/elf2yaml.cpp Thu May 7 10:40:48 2015<br>
@@ -41,6 +41,7 @@ class ELFDumper {<br>
ErrorOr<ELFYAML::RawContentSection *><br>
dumpContentSection(const Elf_Shdr *Shdr);<br>
ErrorOr<ELFYAML::Group *> dumpGroup(const Elf_Shdr *Shdr);<br>
+ ErrorOr<ELFYAML::MipsABIFlags *> dumpMipsABIFlags(const Elf_Shdr *Shdr);<br>
<br>
public:<br>
ELFDumper(const object::ELFFile<ELFT> &O);<br>
@@ -96,6 +97,13 @@ ErrorOr<ELFYAML::Object *> ELFDumper<ELF<br>
Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(G.get()));<br>
break;<br>
}<br>
+ case ELF::SHT_MIPS_ABIFLAGS: {<br>
+ ErrorOr<ELFYAML::MipsABIFlags *> G = dumpMipsABIFlags(&Sec);<br>
+ if (std::error_code EC = G.getError())<br>
+ return EC;<br>
+ Y->Sections.push_back(std::unique_ptr<ELFYAML::Section>(G.get()));<br>
+ break;<br>
+ }<br>
default: {<br>
ErrorOr<ELFYAML::RawContentSection *> S = dumpContentSection(&Sec);<br>
if (std::error_code EC = S.getError())<br>
@@ -318,6 +326,35 @@ ErrorOr<ELFYAML::Group *> ELFDumper<ELFT<br>
return S.release();<br>
}<br>
<br>
+template <class ELFT><br>
+ErrorOr<ELFYAML::MipsABIFlags *><br>
+ELFDumper<ELFT>::dumpMipsABIFlags(const Elf_Shdr *Shdr) {<br>
+ assert(Shdr->sh_type == ELF::SHT_MIPS_ABIFLAGS &&<br>
+ "Section type is not SHT_MIPS_ABIFLAGS");<br>
+ auto S = make_unique<ELFYAML::MipsABIFlags>();<br>
+ if (std::error_code EC = dumpCommonSection(Shdr, *S))<br>
+ return EC;<br>
+<br>
+ ErrorOr<ArrayRef<uint8_t>> ContentOrErr = Obj.getSectionContents(Shdr);<br>
+ if (std::error_code EC = ContentOrErr.getError())<br>
+ return EC;<br>
+<br>
+ auto *Flags = reinterpret_cast<const object::Elf_Mips_ABIFlags<ELFT> *>(<br>
+ ContentOrErr.get().data());<br>
+ S->Version = Flags->version;<br>
+ S->ISALevel = Flags->isa_level;<br>
+ S->ISARevision = Flags->isa_rev;<br>
+ S->GPRSize = Flags->gpr_size;<br>
+ S->CPR1Size = Flags->cpr1_size;<br>
+ S->CPR2Size = Flags->cpr2_size;<br>
+ S->FpABI = Flags->fp_abi;<br>
+ S->ISAExtension = Flags->isa_ext;<br>
+ S->ASEs = Flags->ases;<br>
+ S->Flags1 = Flags->flags1;<br>
+ S->Flags2 = Flags->flags2;<br>
+ return S.release();<br>
+}<br>
+<br>
template <class ELFT><br>
static std::error_code elf2yaml(raw_ostream &Out,<br>
const object::ELFFile<ELFT> &Obj) {<br>
<br>
Modified: llvm/trunk/tools/yaml2obj/yaml2elf.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2elf.cpp?rev=236738&r1=236737&r2=236738&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2elf.cpp?rev=236738&r1=236737&r2=236738&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/yaml2obj/yaml2elf.cpp (original)<br>
+++ llvm/trunk/tools/yaml2obj/yaml2elf.cpp Thu May 7 10:40:48 2015<br>
@@ -133,6 +133,9 @@ class ELFState {<br>
ContiguousBlobAccumulator &CBA);<br>
bool writeSectionContent(Elf_Shdr &SHeader, const ELFYAML::Group &Group,<br>
ContiguousBlobAccumulator &CBA);<br>
+ bool writeSectionContent(Elf_Shdr &SHeader,<br>
+ const ELFYAML::MipsABIFlags &Section,<br>
+ ContiguousBlobAccumulator &CBA);<br>
<br>
// - SHT_NULL entry (placed first, i.e. 0'th entry)<br>
// - symbol table (.symtab) (placed third to last)<br>
@@ -235,6 +238,9 @@ bool ELFState<ELFT>::initSectionHeaders(<br>
SHeader.sh_info = SymIdx;<br>
if (!writeSectionContent(SHeader, *S, CBA))<br>
return false;<br>
+ } else if (auto S = dyn_cast<ELFYAML::MipsABIFlags>(Sec.get())) {<br>
+ if (!writeSectionContent(SHeader, *S, CBA))<br>
+ return false;<br>
} else<br>
llvm_unreachable("Unknown section type");<br>
<br>
@@ -413,6 +419,37 @@ bool ELFState<ELFT>::writeSectionContent<br>
return true;<br>
}<br>
<br>
+template <class ELFT><br>
+bool ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,<br>
+ const ELFYAML::MipsABIFlags &Section,<br>
+ ContiguousBlobAccumulator &CBA) {<br>
+ if (Section.Type != llvm::ELF::SHT_MIPS_ABIFLAGS) {<br>
+ errs() << "error: Invalid section type.\n";<br>
+ return false;<br>
+ }<br>
+<br>
+ object::Elf_Mips_ABIFlags<ELFT> Flags;<br>
+ zero(Flags);<br>
+ SHeader.sh_entsize = sizeof(Flags);<br>
+ SHeader.sh_size = SHeader.sh_entsize;<br>
+<br>
+ auto &OS = CBA.getOSAndAlignedOffset(SHeader.sh_offset);<br>
+ Flags.version = Section.Version;<br>
+ Flags.isa_level = Section.ISALevel;<br>
+ Flags.isa_rev = Section.ISARevision;<br>
+ Flags.gpr_size = Section.GPRSize;<br>
+ Flags.cpr1_size = Section.CPR1Size;<br>
+ Flags.cpr2_size = Section.CPR2Size;<br>
+ Flags.fp_abi = Section.FpABI;<br>
+ Flags.isa_ext = Section.ISAExtension;<br>
+ Flags.ases = Section.ASEs;<br>
+ Flags.flags1 = Section.Flags1;<br>
+ Flags.flags2 = Section.Flags2;<br>
+ OS.write((const char *)&Flags, sizeof(Flags));<br>
+<br>
+ return true;<br>
+}<br>
+<br>
template <class ELFT> bool ELFState<ELFT>::buildSectionIndex() {<br>
SN2I.addName(".symtab", getDotSymTabSecNo());<br>
SN2I.addName(".strtab", getDotStrTabSecNo());<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>