[llvm] 5b118a0 - [yaml2obj] - Improve handling of the SHT_GROUP section.
Georgii Rymar via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 29 01:16:34 PDT 2019
Author: Georgii Rymar
Date: 2019-10-29T11:09:12+03:00
New Revision: 5b118a0471435751f39eeb92d56ecc3956053304
URL: https://github.com/llvm/llvm-project/commit/5b118a0471435751f39eeb92d56ecc3956053304
DIFF: https://github.com/llvm/llvm-project/commit/5b118a0471435751f39eeb92d56ecc3956053304.diff
LOG: [yaml2obj] - Improve handling of the SHT_GROUP section.
Currently, when we do not specify "Info" field in a YAML description
for SHT_GROUP section, yaml2obj reports an error:
"error: unknown symbol referenced: '' by YAML section '.group1'"
Also, we do not link it with a symbol table by default,
though it is what we do for AddrsigSection, HashSection, RelocationSection.
(http://www.sco.com/developers/gabi/latest/ch4.sheader.html#sh_link)
The patch fixes missings mentioned.
Differential revision: https://reviews.llvm.org/D69299
Added:
Modified:
llvm/include/llvm/ObjectYAML/ELFYAML.h
llvm/lib/ObjectYAML/ELFEmitter.cpp
llvm/lib/ObjectYAML/ELFYAML.cpp
llvm/test/tools/yaml2obj/duplicate-section-names.test
llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml
llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml
llvm/test/tools/yaml2obj/elf-comdat-broken.yaml
llvm/test/tools/yaml2obj/elf-override-shname.yaml
llvm/test/tools/yaml2obj/elf-override-shoffset.yaml
llvm/test/tools/yaml2obj/elf-override-shsize.yaml
llvm/test/tools/yaml2obj/section-link.yaml
Removed:
################################################################################
diff --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h b/llvm/include/llvm/ObjectYAML/ELFYAML.h
index 57f802ca50e4..8cd12b3f7588 100644
--- a/llvm/include/llvm/ObjectYAML/ELFYAML.h
+++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h
@@ -326,7 +326,7 @@ struct Group : Section {
// Members of a group contain a flag and a list of section indices
// that are part of the group.
std::vector<SectionOrType> Members;
- StringRef Signature; /* Info */
+ Optional<StringRef> Signature; /* Info */
Group() : Section(SectionKind::Group) {}
diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp
index d5cdb85eab5f..6a4e00c62857 100644
--- a/llvm/lib/ObjectYAML/ELFEmitter.cpp
+++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp
@@ -791,10 +791,16 @@ void ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
assert(Section.Type == llvm::ELF::SHT_GROUP &&
"Section type is not SHT_GROUP");
+ unsigned Link = 0;
+ if (Section.Link.empty() && SN2I.lookup(".symtab", Link))
+ SHeader.sh_link = Link;
+
SHeader.sh_entsize = 4;
SHeader.sh_size = SHeader.sh_entsize * Section.Members.size();
- SHeader.sh_info =
- toSymbolIndex(Section.Signature, Section.Name, /*IsDynamic=*/false);
+
+ if (Section.Signature)
+ SHeader.sh_info =
+ toSymbolIndex(*Section.Signature, Section.Name, /*IsDynamic=*/false);
raw_ostream &OS =
CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign);
diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp
index ad316be85e8a..f362b9c23a7b 100644
--- a/llvm/lib/ObjectYAML/ELFYAML.cpp
+++ b/llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -1069,7 +1069,7 @@ static void sectionMapping(IO &IO, ELFYAML::RelocationSection &Section) {
static void groupSectionMapping(IO &IO, ELFYAML::Group &Group) {
commonSectionMapping(IO, Group);
- IO.mapOptional("Info", Group.Signature, StringRef());
+ IO.mapOptional("Info", Group.Signature);
IO.mapRequired("Members", Group.Members);
}
diff --git a/llvm/test/tools/yaml2obj/duplicate-section-names.test b/llvm/test/tools/yaml2obj/duplicate-section-names.test
index 65d3de4c3039..4765179755e0 100644
--- a/llvm/test/tools/yaml2obj/duplicate-section-names.test
+++ b/llvm/test/tools/yaml2obj/duplicate-section-names.test
@@ -150,7 +150,6 @@ FileHeader:
Sections:
- Name: .group
Type: SHT_GROUP
- Link: .symtab
Info: foo
Members:
- SectionOrType: GRP_COMDAT
@@ -159,7 +158,6 @@ Sections:
Type: SHT_PROGBITS
- Name: '.group [1]'
Type: SHT_GROUP
- Link: .symtab
Info: 'foo [1]'
Members:
- SectionOrType: GRP_COMDAT
diff --git a/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml b/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml
index 6f2f7acd4925..d79b250ccc95 100644
--- a/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml
+++ b/llvm/test/tools/yaml2obj/elf-comdat-broken-info.yaml
@@ -42,13 +42,11 @@ FileHeader:
Sections:
- Name: .group1
Type: SHT_GROUP
- Link: .symtab
Info: foo
Members:
- SectionOrType: GRP_COMDAT
- Name: .group2
Type: SHT_GROUP
- Link: .symtab
Info: bar
Members:
- SectionOrType: GRP_COMDAT
diff --git a/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml b/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml
index 63cb27e23d80..9ebcf02c9292 100644
--- a/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml
+++ b/llvm/test/tools/yaml2obj/elf-comdat-broken-members.yaml
@@ -14,8 +14,6 @@ FileHeader:
Sections:
- Name: .group
Type: SHT_GROUP
- Link: .symtab
- Info: 0
Members:
- SectionOrType: GRP_COMDAT
- SectionOrType: .foo
diff --git a/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml b/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml
index 87ff6fe66c00..88ed3c315c53 100644
--- a/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml
+++ b/llvm/test/tools/yaml2obj/elf-comdat-broken.yaml
@@ -10,7 +10,6 @@ FileHeader:
Sections:
- Name: .group
Type: SHT_GROUP
- Link: .symtab
Info: foo
Members:
- SectionOrType: 0xFF
diff --git a/llvm/test/tools/yaml2obj/elf-override-shname.yaml b/llvm/test/tools/yaml2obj/elf-override-shname.yaml
index 7c4cb615a38e..4698bc0eb499 100644
--- a/llvm/test/tools/yaml2obj/elf-override-shname.yaml
+++ b/llvm/test/tools/yaml2obj/elf-override-shname.yaml
@@ -63,7 +63,6 @@ Sections:
ShName: 0x000000005
- Name: .group
Type: SHT_GROUP
- Info: 0
ShName: 0x000000006
Members:
- Name: .gnu.version
diff --git a/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml b/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml
index 26ef2862de06..9fe5ef01fa17 100644
--- a/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml
+++ b/llvm/test/tools/yaml2obj/elf-override-shoffset.yaml
@@ -43,7 +43,6 @@ Sections:
ShOffset: 0x000000005
- Name: .group
Type: SHT_GROUP
- Info: 0
ShOffset: 0x000000006
Members:
- Name: .gnu.version
diff --git a/llvm/test/tools/yaml2obj/elf-override-shsize.yaml b/llvm/test/tools/yaml2obj/elf-override-shsize.yaml
index c62e91a99459..4470ae22002f 100644
--- a/llvm/test/tools/yaml2obj/elf-override-shsize.yaml
+++ b/llvm/test/tools/yaml2obj/elf-override-shsize.yaml
@@ -43,7 +43,6 @@ Sections:
ShSize: 0x000000005
- Name: .group
Type: SHT_GROUP
- Info: 0
ShSize: 0x000000006
Members:
- Name: .gnu.version
diff --git a/llvm/test/tools/yaml2obj/section-link.yaml b/llvm/test/tools/yaml2obj/section-link.yaml
index 88595eafd693..efe4d3fea74d 100644
--- a/llvm/test/tools/yaml2obj/section-link.yaml
+++ b/llvm/test/tools/yaml2obj/section-link.yaml
@@ -44,3 +44,53 @@ Sections:
- Name: .bar
Type: SHT_PROGBITS
Link: .unknown2
+
+## Check we link SHT_GROUP to a symbol table by default if it exists.
+## Also, check we can set an arbitrary value for sh_link.
+
+# RUN: yaml2obj --docnum=3 %s -o %t3
+# RUN: llvm-readobj --sections %t3 | FileCheck %s --check-prefix=GROUP-LINK
+
+# GROUP-LINK: Name: .group1
+# GROUP-LINK: Link:
+# GROUP-LINK-SAME: 3
+
+# GROUP-LINK: Name: .group2
+# GROUP-LINK: Link:
+# GROUP-LINK-SAME: 255
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group1
+ Type: SHT_GROUP
+ Members:
+ - Name: .group2
+ Type: SHT_GROUP
+ Link: 0xFF
+ Members:
+Symbols: []
+
+## Check we set SHT_GROUP's link value to 0 when there is no symbol table.
+
+# RUN: yaml2obj --docnum=4 %s -o %t4
+# RUN: llvm-readobj --sections %t4 | FileCheck %s --check-prefix=GROUP-LINK-NOSYMTAB
+
+# GROUP-LINK-NOSYMTAB: Name: .group
+# GROUP-LINK-NOSYMTAB: Link:
+# GROUP-LINK-NOSYMTAB-SAME: 0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .group
+ Type: SHT_GROUP
+ Members:
More information about the llvm-commits
mailing list