<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>