[PATCH] D95341: [yaml2obj] - Allow empty SectionHeaderTable definitions.
George Rimar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 27 23:52:32 PST 2021
This revision was automatically updated to reflect the committed changes.
grimar marked an inline comment as done.
Closed by commit rG68195b15a36c: [yaml2obj] - Allow empty SectionHeaderTable definitions. (authored by grimar).
Changed prior to commit:
https://reviews.llvm.org/D95341?vs=318945&id=319773#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D95341/new/
https://reviews.llvm.org/D95341
Files:
llvm/include/llvm/ObjectYAML/ELFYAML.h
llvm/lib/ObjectYAML/ELFEmitter.cpp
llvm/lib/ObjectYAML/ELFYAML.cpp
llvm/test/tools/yaml2obj/ELF/section-headers.yaml
Index: llvm/test/tools/yaml2obj/ELF/section-headers.yaml
===================================================================
--- llvm/test/tools/yaml2obj/ELF/section-headers.yaml
+++ llvm/test/tools/yaml2obj/ELF/section-headers.yaml
@@ -151,10 +151,18 @@
Sections: []
NoHeaders: [[NOHEADERS]]
-## Check that we do not allow an empty SectionHeaderTable tag and suggest to use an explicit syntax instead.
-# RUN: not yaml2obj %s --docnum=5 -o /dev/null 2>&1 | FileCheck %s --check-prefix=NO-VALUE
+## Check that we allow using an empty SectionHeaderTable definition.
+## It can be used to emit the default section header table at an arbitrary position.
-# NO-VALUE: SectionHeaderTable can't be empty. Use 'NoHeaders' key to drop the section header table
+# RUN: yaml2obj %s --docnum=5 -o %t5.novalues
+# RUN: llvm-readelf --sections %t5.novalues | \
+# RUN: FileCheck %s --check-prefix=NO-VALUES
+
+## Check we placed the section header table before the .foo section.
+
+# NO-VALUES: There are 4 section headers, starting at offset 0x40:
+# NO-VALUES: [Nr] Name Type Address Off Size
+# NO-VALUES: [ 1] .foo PROGBITS 0000000000000000 000140 000000
--- !ELF
FileHeader:
@@ -162,9 +170,9 @@
Data: ELFDATA2LSB
Type: ET_REL
Sections:
+ - Type: SectionHeaderTable
- Name: .foo
Type: SHT_PROGBITS
- - Type: SectionHeaderTable
## Test that we are still able to override e_shoff, e_shnum and e_shstrndx
## fields even when we do not produce section headers.
Index: llvm/lib/ObjectYAML/ELFYAML.cpp
===================================================================
--- llvm/lib/ObjectYAML/ELFYAML.cpp
+++ llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -1474,9 +1474,6 @@
if (const auto *SHT = dyn_cast<ELFYAML::SectionHeaderTable>(C.get())) {
if (SHT->NoHeaders && (SHT->Sections || SHT->Excluded || SHT->Offset))
return "NoHeaders can't be used together with Offset/Sections/Excluded";
- if (!SHT->NoHeaders && !SHT->Sections && !SHT->Excluded)
- return "SectionHeaderTable can't be empty. Use 'NoHeaders' key to drop "
- "the section header table";
return "";
}
Index: llvm/lib/ObjectYAML/ELFEmitter.cpp
===================================================================
--- llvm/lib/ObjectYAML/ELFEmitter.cpp
+++ llvm/lib/ObjectYAML/ELFEmitter.cpp
@@ -555,7 +555,8 @@
const ELFYAML::SectionHeaderTable &SectionHeaders =
Doc.getSectionHeaderTable();
if (SectionHeaders.IsImplicit ||
- (SectionHeaders.NoHeaders && !SectionHeaders.NoHeaders.getValue()))
+ (SectionHeaders.NoHeaders && !SectionHeaders.NoHeaders.getValue()) ||
+ SectionHeaders.isDefault())
return Index;
assert(!SectionHeaders.NoHeaders.getValueOr(false) ||
@@ -1744,7 +1745,8 @@
DenseMap<StringRef, size_t> ELFState<ELFT>::buildSectionHeaderReorderMap() {
const ELFYAML::SectionHeaderTable &SectionHeaders =
Doc.getSectionHeaderTable();
- if (SectionHeaders.IsImplicit || SectionHeaders.NoHeaders)
+ if (SectionHeaders.IsImplicit || SectionHeaders.NoHeaders ||
+ SectionHeaders.isDefault())
return DenseMap<StringRef, size_t>();
DenseMap<StringRef, size_t> Ret;
Index: llvm/include/llvm/ObjectYAML/ELFYAML.h
===================================================================
--- llvm/include/llvm/ObjectYAML/ELFYAML.h
+++ llvm/include/llvm/ObjectYAML/ELFYAML.h
@@ -296,13 +296,15 @@
Optional<bool> NoHeaders;
size_t getNumHeaders(size_t SectionsNum) const {
- if (IsImplicit)
+ if (IsImplicit || isDefault())
return SectionsNum;
if (NoHeaders)
return (*NoHeaders) ? 0 : SectionsNum;
return (Sections ? Sections->size() : 0) + /*Null section*/ 1;
}
+ bool isDefault() const { return !Sections && !Excluded && !NoHeaders; }
+
static constexpr StringRef TypeStr = "SectionHeaderTable";
};
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D95341.319773.patch
Type: text/x-patch
Size: 3855 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210128/9eb2a047/attachment.bin>
More information about the llvm-commits
mailing list