mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 02:33:06 +01:00
[yaml2obj] - Allow empty SectionHeaderTable definitions.
Currently we don't allow the following definition: ``` Sections: - Type: SectionHeaderTable - Name: .foo Type: SHT_PROGBITS ``` We report an error: "SectionHeaderTable can't be empty. Use 'NoHeaders' key to drop the section header table". It was implemented in this way earlier, when `SectionHeaderTable` was a dedicated key outside of the `Sections` list. And we did not allow to select where the table is written. Currently it makes sense to allow it, because a user might want to place the default section header table at an arbitrary position, e.g. before other sections. In this case it is not convenient and error prone to require specifying all sections: ``` Sections: - Type: SectionHeaderTable Sections: - Name: .foo - Name: .strtab - Name: .shstrtab - Name: .foo Type: SHT_PROGBITS ``` This patch allows empty SectionHeaderTable definitions. Differential revision: https://reviews.llvm.org/D95341
This commit is contained in:
parent
2a9ac6c11e
commit
441aa2949d
@ -296,13 +296,15 @@ struct SectionHeaderTable : Chunk {
|
||||
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";
|
||||
};
|
||||
|
||||
|
@ -555,7 +555,8 @@ unsigned ELFState<ELFT>::toSectionIndex(StringRef S, StringRef LocSec,
|
||||
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 @@ template <class ELFT>
|
||||
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;
|
||||
|
@ -1474,9 +1474,6 @@ std::string MappingTraits<std::unique_ptr<ELFYAML::Chunk>>::validate(
|
||||
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 "";
|
||||
}
|
||||
|
||||
|
@ -151,10 +151,18 @@ Sections:
|
||||
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 @@ FileHeader:
|
||||
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.
|
||||
|
Loading…
Reference in New Issue
Block a user