Revert "Revert r363377: [yaml2obj] - Allow setting custom section types for implicit sections."

LLD test case will be fixed in a following commit.

Original commit message:

[yaml2obj] - Allow setting custom section types for implicit sections.

We were hardcoding the final section type for sections that
are usually implicit. The patch fixes that.

This also fixes a few issues in existent test cases and removes
one precompiled object.

Differential revision: https://reviews.llvm.org/D63267

llvm-svn: 363401
diff --git a/llvm/test/tools/llvm-readobj/Inputs/wrong-shstrtab-type.elf-x86-64 b/llvm/test/tools/llvm-readobj/Inputs/wrong-shstrtab-type.elf-x86-64
deleted file mode 100644
index 801a21b..0000000
--- a/llvm/test/tools/llvm-readobj/Inputs/wrong-shstrtab-type.elf-x86-64
+++ /dev/null
Binary files differ
diff --git a/llvm/test/tools/llvm-readobj/elf-wrong-shstrtab-type.test b/llvm/test/tools/llvm-readobj/elf-wrong-shstrtab-type.test
index 2d5fd68..ce7fec6 100644
--- a/llvm/test/tools/llvm-readobj/elf-wrong-shstrtab-type.test
+++ b/llvm/test/tools/llvm-readobj/elf-wrong-shstrtab-type.test
@@ -1,11 +1,22 @@
-## wrong-shstrtab-type.elf-x86-64 contains .shstrtab section which has SHT_PROGBITS type.
-## Check we do not fail to dump the section headers in this case.
+## Check we do not fail to dump the section headers when
+## a .shstrtab section does not have a SHT_STRTAB type.
 
-# RUN: llvm-readobj -S %p/Inputs/wrong-shstrtab-type.elf-x86-64 | FileCheck %s --check-prefix LLVM
-# RUN: llvm-readelf -S %p/Inputs/wrong-shstrtab-type.elf-x86-64 | FileCheck %s --check-prefix GNU
+# RUN: yaml2obj %s -o %t1
+# RUN: llvm-readobj -S %t1 | FileCheck %s --check-prefix LLVM
+# RUN: llvm-readelf -S %t1 | FileCheck %s --check-prefix GNU
 
 # LLVM:      Name: .shstrtab
 # LLVM-NEXT: Type: SHT_PROGBITS
 
 # GNU: [Nr] Name      Type
-# GNU: [ 3] .shstrtab PROGBITS
+# GNU: [ 1] .shstrtab PROGBITS
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_DYN
+  Machine: EM_X86_64
+Sections:
+  - Name: .shstrtab
+    Type: SHT_PROGBITS
diff --git a/llvm/test/tools/yaml2obj/elf-symtab-shinfo.yaml b/llvm/test/tools/yaml2obj/elf-symtab-shinfo.yaml
index 50c0b6c..98ab4ac 100644
--- a/llvm/test/tools/yaml2obj/elf-symtab-shinfo.yaml
+++ b/llvm/test/tools/yaml2obj/elf-symtab-shinfo.yaml
@@ -24,17 +24,17 @@
  
 --- !ELF
 FileHeader:
-  Class:           ELFCLASS64
-  Data:            ELFDATA2LSB
-  Type:            ET_REL
-  Machine:         EM_X86_64
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
 Sections:
-  - Name:          .symtab
-    Info:          42
-    Type:          SHT_SYMTAB
-  - Name:          .dynsym
-    Info:          26
-    Type:          SHT_SYMTAB
+  - Name: .symtab
+    Info: 42
+    Type: SHT_SYMTAB
+  - Name: .dynsym
+    Info: 26
+    Type: SHT_DYNSYM
 Symbols:
   - Name:    foo
     Binding: STB_GLOBAL
diff --git a/llvm/test/tools/yaml2obj/elf-symtab-shtype.yaml b/llvm/test/tools/yaml2obj/elf-symtab-shtype.yaml
index 558ec8c..fff1860 100644
--- a/llvm/test/tools/yaml2obj/elf-symtab-shtype.yaml
+++ b/llvm/test/tools/yaml2obj/elf-symtab-shtype.yaml
@@ -2,20 +2,18 @@
 # RUN: yaml2obj %s -o %t
 # RUN: llvm-readobj --sections %t | FileCheck %s
 
-## TODO: the output is still SHT_SYMTAB because we do not yet
-## support changing it.
 # CHECK:      Name: .symtab
-# CHECK-NEXT: Type: SHT_SYMTAB
+# CHECK-NEXT: Type: SHT_DYNAMIC
 
 --- !ELF
-FileHeader:      
-  Class:           ELFCLASS64
-  Data:            ELFDATA2LSB
-  Type:            ET_REL
-  Machine:         EM_X86_64
-Sections:        
-  - Name:            .symtab
-    Type:            SHT_DYNAMIC
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name: .symtab
+    Type: SHT_DYNAMIC
 Symbols:
   - Name:    foo
     Binding: STB_GLOBAL
diff --git a/llvm/test/tools/yaml2obj/explicit-dynsym-no-dynstr.yaml b/llvm/test/tools/yaml2obj/explicit-dynsym-no-dynstr.yaml
index 53f6d21..88b2a4d 100644
--- a/llvm/test/tools/yaml2obj/explicit-dynsym-no-dynstr.yaml
+++ b/llvm/test/tools/yaml2obj/explicit-dynsym-no-dynstr.yaml
@@ -19,4 +19,4 @@
   Machine: EM_X86_64
 Sections:
   - Name: .dynsym
-    Type: SHT_SYMTAB
+    Type: SHT_DYNSYM
diff --git a/llvm/test/tools/yaml2obj/implicit-sections-types.test b/llvm/test/tools/yaml2obj/implicit-sections-types.test
new file mode 100644
index 0000000..8360fa7
--- /dev/null
+++ b/llvm/test/tools/yaml2obj/implicit-sections-types.test
@@ -0,0 +1,69 @@
+## Here we check the types set for implicit sections
+## in different cases.
+
+## Check the types set by default in case sections were implicitly
+## added and not described in the YAML.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1
+# RUN: llvm-readobj -S %t1 | FileCheck %s --check-prefix=CASE1
+
+# CASE1:      Name: .symtab
+# CASE1-NEXT: Type: SHT_SYMTAB
+# CASE1:      Name: .strtab
+# CASE1-NEXT: Type: SHT_STRTAB
+# CASE1:      Name: .shstrtab
+# CASE1-NEXT: Type: SHT_STRTAB
+# CASE1:      Name: .dynsym
+# CASE1-NEXT: Type: SHT_DYNSYM
+# CASE1:      Name: .dynstr
+# CASE1-NEXT: Type: SHT_STRTAB
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_DYN
+  Machine: EM_X86_64
+## Needed to force the creation of the .dynsym and .dynstr.
+DynamicSymbols:
+  - Name:    foo
+  - Binding: STB_GLOBAL
+
+## Check we can set any arbitrary types when describing sections
+## that are usually implicit.
+
+# RUN: yaml2obj --docnum=2 %s -o %t2
+# RUN: llvm-readobj -S %t2 | FileCheck %s --check-prefix=CASE2
+
+# CASE2:      Name: .symtab
+# CASE2-NEXT: Type: SHT_DYNAMIC
+# CASE2:      Name: .strtab
+# CASE2-NEXT: Type: SHT_RELA
+# CASE2:      Name: .shstrtab
+# CASE2-NEXT: Type: SHT_PROGBITS
+# CASE2:      Name: .dynsym
+# CASE2-NEXT: Type: SHT_NOTE
+# CASE2:      Name: .dynstr
+# CASE2-NEXT: Type: SHT_NOBITS
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_DYN
+  Machine: EM_X86_64
+Sections:
+  - Name: .symtab
+    Type: SHT_DYNAMIC
+  - Name: .strtab
+    Type: SHT_RELA
+  - Name: .shstrtab
+    Type: SHT_PROGBITS
+  - Name: .dynsym
+    Type: SHT_NOTE
+  - Name: .dynstr
+    Type: SHT_NOBITS
+## Needed to set the proper content size for .symtab, so
+## that llvm-readobj can dump this section.
+Symbols:
+  - Name: foo
diff --git a/llvm/test/tools/yaml2obj/symtab-implicit-sections-flags.yaml b/llvm/test/tools/yaml2obj/symtab-implicit-sections-flags.yaml
index 750b0ca..55ea02a 100644
--- a/llvm/test/tools/yaml2obj/symtab-implicit-sections-flags.yaml
+++ b/llvm/test/tools/yaml2obj/symtab-implicit-sections-flags.yaml
@@ -27,7 +27,7 @@
   - Name: .symtab
     Type: SHT_SYMTAB
   - Name: .dynsym
-    Type: SHT_SYMTAB
+    Type: SHT_DYNSYM
 
 ## Check we can set arbitrary flags for .symtab/.dynsym.
 
@@ -57,7 +57,7 @@
     Type:  SHT_SYMTAB
     Flags: [ SHF_ALLOC, SHF_STRINGS ]
   - Name:  .dynsym
-    Type:  SHT_SYMTAB
+    Type:  SHT_DYNSYM
     Flags: [ SHF_STRINGS ]
 
 ## Check no flags are set by default for .symtab when it is not
diff --git a/llvm/tools/yaml2obj/yaml2elf.cpp b/llvm/tools/yaml2obj/yaml2elf.cpp
index 098c3d6..8e4ea78 100644
--- a/llvm/tools/yaml2obj/yaml2elf.cpp
+++ b/llvm/tools/yaml2obj/yaml2elf.cpp
@@ -403,7 +403,11 @@
 
   zero(SHeader);
   SHeader.sh_name = DotShStrtab.getOffset(IsStatic ? ".symtab" : ".dynsym");
-  SHeader.sh_type = IsStatic ? ELF::SHT_SYMTAB : ELF::SHT_DYNSYM;
+
+  if (YAMLSec)
+    SHeader.sh_type = YAMLSec->Type;
+  else
+    SHeader.sh_type = IsStatic ? ELF::SHT_SYMTAB : ELF::SHT_DYNSYM;
 
   if (RawSec && !RawSec->Link.empty()) {
     // If the Link field is explicitly defined in the document,
@@ -467,7 +471,7 @@
                                              ELFYAML::Section *YAMLSec) {
   zero(SHeader);
   SHeader.sh_name = DotShStrtab.getOffset(Name);
-  SHeader.sh_type = ELF::SHT_STRTAB;
+  SHeader.sh_type = YAMLSec ? YAMLSec->Type : ELF::SHT_STRTAB;
   SHeader.sh_addralign = YAMLSec ? (uint64_t)YAMLSec->AddressAlign : 1;
 
   ELFYAML::RawContentSection *RawSec =