summaryrefslogtreecommitdiffstats
path: root/llvm/lib/ObjectYAML
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2019-09-25 11:40:11 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2019-09-25 11:40:11 +0000
commitf302436a0a454e11502f7e57da5ac6afaefa3077 (patch)
tree01c53306030250687c14c8c26c47398f58b918fb /llvm/lib/ObjectYAML
parent4bdd51332fa2d76058aea9dcbd1c3a8766542893 (diff)
downloadbcm5719-llvm-f302436a0a454e11502f7e57da5ac6afaefa3077.tar.gz
bcm5719-llvm-f302436a0a454e11502f7e57da5ac6afaefa3077.zip
[yaml2obj] - Add a Size field for StackSizesSection.
It is a follow-up requested in the review comment for D67757. Allows to use Content + Size or just Size when describing .stack_sizes sections in YAML document Differential revision: https://reviews.llvm.org/D67958 llvm-svn: 372845
Diffstat (limited to 'llvm/lib/ObjectYAML')
-rw-r--r--llvm/lib/ObjectYAML/ELFEmitter.cpp28
-rw-r--r--llvm/lib/ObjectYAML/ELFYAML.cpp19
2 files changed, 30 insertions, 17 deletions
diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp
index c394763459d..0139c2d1144 100644
--- a/llvm/lib/ObjectYAML/ELFEmitter.cpp
+++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp
@@ -440,19 +440,20 @@ static size_t findFirstNonGlobal(ArrayRef<ELFYAML::Symbol> Symbols) {
return Symbols.size();
}
-static uint64_t writeRawSectionData(raw_ostream &OS,
- const ELFYAML::RawContentSection &RawSec) {
+static uint64_t writeContent(raw_ostream &OS,
+ const Optional<yaml::BinaryRef> &Content,
+ const Optional<llvm::yaml::Hex64> &Size) {
size_t ContentSize = 0;
- if (RawSec.Content) {
- RawSec.Content->writeAsBinary(OS);
- ContentSize = RawSec.Content->binary_size();
+ if (Content) {
+ Content->writeAsBinary(OS);
+ ContentSize = Content->binary_size();
}
- if (!RawSec.Size)
+ if (!Size)
return ContentSize;
- OS.write_zeros(*RawSec.Size - ContentSize);
- return *RawSec.Size;
+ OS.write_zeros(*Size - ContentSize);
+ return *Size;
}
template <class ELFT>
@@ -554,7 +555,7 @@ void ELFState<ELFT>::initSymtabSectionHeader(Elf_Shdr &SHeader,
auto &OS = CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign);
if (RawSec && (RawSec->Content || RawSec->Size)) {
assert(Symbols.empty());
- SHeader.sh_size = writeRawSectionData(OS, *RawSec);
+ SHeader.sh_size = writeContent(OS, RawSec->Content, RawSec->Size);
return;
}
@@ -579,7 +580,7 @@ void ELFState<ELFT>::initStrtabSectionHeader(Elf_Shdr &SHeader, StringRef Name,
auto &OS = CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign);
if (RawSec && (RawSec->Content || RawSec->Size)) {
- SHeader.sh_size = writeRawSectionData(OS, *RawSec);
+ SHeader.sh_size = writeContent(OS, RawSec->Content, RawSec->Size);
} else {
STB.write(OS);
SHeader.sh_size = STB.getSize();
@@ -675,7 +676,7 @@ void ELFState<ELFT>::writeSectionContent(
ContiguousBlobAccumulator &CBA) {
raw_ostream &OS =
CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign);
- SHeader.sh_size = writeRawSectionData(OS, Section);
+ SHeader.sh_size = writeContent(OS, Section.Content, Section.Size);
if (Section.EntSize)
SHeader.sh_entsize = *Section.EntSize;
@@ -795,9 +796,8 @@ void ELFState<ELFT>::writeSectionContent(
raw_ostream &OS =
CBA.getOSAndAlignedOffset(SHeader.sh_offset, SHeader.sh_addralign);
- if (Section.Content) {
- Section.Content->writeAsBinary(OS);
- SHeader.sh_size = Section.Content->binary_size();
+ if (Section.Content || Section.Size) {
+ SHeader.sh_size = writeContent(OS, Section.Content, Section.Size);
return;
}
diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp
index af795f9732c..d369f14be4b 100644
--- a/llvm/lib/ObjectYAML/ELFYAML.cpp
+++ b/llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -1020,6 +1020,7 @@ static void sectionMapping(IO &IO, ELFYAML::RawContentSection &Section) {
static void sectionMapping(IO &IO, ELFYAML::StackSizesSection &Section) {
commonSectionMapping(IO, Section);
IO.mapOptional("Content", Section.Content);
+ IO.mapOptional("Size", Section.Size);
IO.mapOptional("Entries", Section.Entries);
}
@@ -1176,10 +1177,22 @@ StringRef MappingTraits<std::unique_ptr<ELFYAML::Section>>::validate(
}
if (const auto *SS = dyn_cast<ELFYAML::StackSizesSection>(Section.get())) {
- if (SS->Content && SS->Entries)
+ if (!SS->Entries && !SS->Content && !SS->Size)
+ return ".stack_sizes: one of Content, Entries and Size must be specified";
+
+ if (SS->Size && SS->Content &&
+ (uint64_t)(*SS->Size) < SS->Content->binary_size())
+ return ".stack_sizes: Size must be greater than or equal to the content "
+ "size";
+
+ // We accept Content, Size or both together when there are no Entries.
+ if (!SS->Entries)
+ return {};
+
+ if (SS->Size)
+ return ".stack_sizes: Size and Entries cannot be used together";
+ if (SS->Content)
return ".stack_sizes: Content and Entries cannot be used together";
- if (!SS->Content && !SS->Entries)
- return ".stack_sizes: either Content or Entries tag must be specified";
return {};
}
return {};
OpenPOWER on IntegriCloud