summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/YAML
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/ReaderWriter/YAML')
-rw-r--r--lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp33
1 files changed, 28 insertions, 5 deletions
diff --git a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
index 7d702c51e8d..c17240e7369 100644
--- a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
+++ b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
@@ -335,6 +335,16 @@ struct ScalarEnumerationTraits<lld::DefinedAtom::SectionChoice> {
};
template <>
+struct ScalarEnumerationTraits<lld::DefinedAtom::SectionPosition> {
+ static void enumeration(IO &io, lld::DefinedAtom::SectionPosition &value) {
+ io.enumCase(value, "start", lld::DefinedAtom::sectionPositionStart);
+ io.enumCase(value, "early", lld::DefinedAtom::sectionPositionEarly);
+ io.enumCase(value, "any", lld::DefinedAtom::sectionPositionAny);
+ io.enumCase(value, "end", lld::DefinedAtom::sectionPositionEnd);
+ }
+};
+
+template <>
struct ScalarEnumerationTraits<lld::DefinedAtom::Interposable> {
static void enumeration(IO &io, lld::DefinedAtom::Interposable &value) {
io.enumCase(value, "no", lld::DefinedAtom::interposeNo);
@@ -451,10 +461,6 @@ struct ScalarEnumerationTraits<lld::DefinedAtom::ContentType> {
lld::DefinedAtom::typeTLVInitialZeroFill);
io.enumCase(value, "tlv-initializer-ptr",
lld::DefinedAtom::typeTLVInitializerPtr);
- io.enumCase(value, "first-in-section",
- lld::DefinedAtom::typeFirstInSection);
- io.enumCase(value, "last-in-section",
- lld::DefinedAtom::typeLastInSection);
}
};
@@ -617,6 +623,14 @@ struct MappingTraits<const lld::File*> {
return this;
}
+ virtual void setOrdinalAndIncrement(uint64_t &ordinal) const {
+ _ordinal = ordinal++;
+ // Assign sequential ordinals to member files
+ for (const ArchMember &member : _members) {
+ member._content->setOrdinalAndIncrement(ordinal);
+ }
+ }
+
virtual const atom_collection<lld::DefinedAtom> &defined() const {
return _noDefinedAtoms;
}
@@ -824,6 +838,8 @@ struct MappingTraits<const lld::DefinedAtom*> {
NormalizedAtom(IO &io)
: _file(fileFromContext(io)), _name(), _refName(),
_alignment(0), _content(), _references() {
+ static uint32_t ordinalCounter = 1;
+ _ordinal = ordinalCounter++;
}
NormalizedAtom(IO &io, const lld::DefinedAtom *atom)
: _file(fileFromContext(io)),
@@ -835,6 +851,7 @@ struct MappingTraits<const lld::DefinedAtom*> {
_contentType(atom->contentType()),
_alignment(atom->alignment()),
_sectionChoice(atom->sectionChoice()),
+ _sectionPosition(atom->sectionPosition()),
_deadStrip(atom->deadStrip()),
_permissions(atom->permissions()),
_size(atom->size()),
@@ -882,6 +899,7 @@ struct MappingTraits<const lld::DefinedAtom*> {
virtual Alignment alignment() const { return _alignment; }
virtual SectionChoice sectionChoice() const { return _sectionChoice; }
virtual StringRef customSectionName() const { return _sectionName;}
+ virtual SectionPosition sectionPosition() const{return _sectionPosition;}
virtual DeadStripKind deadStrip() const { return _deadStrip; }
virtual ContentPermissions permissions() const { return _permissions; }
virtual bool isThumb() const { return false; }
@@ -891,7 +909,7 @@ struct MappingTraits<const lld::DefinedAtom*> {
reinterpret_cast<const uint8_t *>(_content.data()), _content.size());
}
- virtual uint64_t ordinal() const { return 0; }
+ virtual uint64_t ordinal() const { return _ordinal; }
reference_iterator begin() const {
uintptr_t index = 0;
@@ -923,8 +941,10 @@ struct MappingTraits<const lld::DefinedAtom*> {
ContentType _contentType;
Alignment _alignment;
SectionChoice _sectionChoice;
+ SectionPosition _sectionPosition;
DeadStripKind _deadStrip;
ContentPermissions _permissions;
+ uint32_t _ordinal;
std::vector<ImplicitHex8> _content;
uint64_t _size;
StringRef _sectionName;
@@ -968,6 +988,8 @@ struct MappingTraits<const lld::DefinedAtom*> {
lld::DefinedAtom::sectionBasedOnContent);
io.mapOptional("section-name", keys->_sectionName,
StringRef());
+ io.mapOptional("section-position",keys->_sectionPosition,
+ lld::DefinedAtom::sectionPositionAny);
io.mapOptional("dead-strip", keys->_deadStrip,
lld::DefinedAtom::deadStripNormal);
// default permissions based on content type
@@ -1038,6 +1060,7 @@ struct MappingTraits<const lld::UndefinedAtom*> {
};
+
// YAML conversion for const lld::SharedLibraryAtom*
template <>
struct MappingTraits<const lld::SharedLibraryAtom*> {
OpenPOWER on IntegriCloud