diff options
Diffstat (limited to 'lld/lib/ReaderWriter')
| -rw-r--r-- | lld/lib/ReaderWriter/Native/NativeFileFormat.h | 2 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/Native/ReaderNative.cpp | 13 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp | 17 |
3 files changed, 25 insertions, 7 deletions
diff --git a/lld/lib/ReaderWriter/Native/NativeFileFormat.h b/lld/lib/ReaderWriter/Native/NativeFileFormat.h index 5a715e54e37..6686eb340cd 100644 --- a/lld/lib/ReaderWriter/Native/NativeFileFormat.h +++ b/lld/lib/ReaderWriter/Native/NativeFileFormat.h @@ -164,10 +164,10 @@ struct NativeAtomAttributesV1 { struct NativeUndefinedAtomIvarsV1 { uint32_t nameOffset; uint32_t flags; + uint32_t fallbackNameOffset; }; - // // The NCS_SharedLibraryAtomsV1 chunk contains an array of these structs // diff --git a/lld/lib/ReaderWriter/Native/ReaderNative.cpp b/lld/lib/ReaderWriter/Native/ReaderNative.cpp index 31024a06fab..0554dcecd1f 100644 --- a/lld/lib/ReaderWriter/Native/ReaderNative.cpp +++ b/lld/lib/ReaderWriter/Native/ReaderNative.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "lld/ReaderWriter/Reader.h" +#include "lld/ReaderWriter/Simple.h" #include "lld/Core/Atom.h" #include "lld/Core/Error.h" @@ -134,10 +135,12 @@ public: return (CanBeNull)(_ivarData->flags & 0x3); } + virtual const UndefinedAtom *fallback() const; private: const File *_file; const NativeUndefinedAtomIvarsV1 *_ivarData; + mutable std::unique_ptr<const SimpleUndefinedAtom> _fallback; }; @@ -860,8 +863,14 @@ inline StringRef NativeUndefinedAtomV1::name() const { return _file->string(_ivarData->nameOffset); } - - +inline const UndefinedAtom *NativeUndefinedAtomV1::fallback() const { + if (!_ivarData->fallbackNameOffset) + return nullptr; + if (!_fallback) + _fallback.reset(new SimpleUndefinedAtom( + *_file, _file->string(_ivarData->fallbackNameOffset))); + return _fallback.get(); +} inline const lld::File& NativeSharedLibraryAtomV1::file() const { return *_file; diff --git a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp index 404bad73d99..5109097bd2f 100644 --- a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp +++ b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "lld/ReaderWriter/Reader.h" +#include "lld/ReaderWriter/Simple.h" #include "lld/ReaderWriter/Writer.h" #include "lld/Core/ArchiveLibraryFile.h" @@ -957,10 +958,13 @@ template <> struct MappingTraits<const lld::UndefinedAtom *> { class NormalizedAtom : public lld::UndefinedAtom { public: NormalizedAtom(IO &io) - : _file(fileFromContext(io)), _name(), _canBeNull(canBeNullNever) {} + : _file(fileFromContext(io)), _name(), _canBeNull(canBeNullNever), + _fallback(nullptr) {} + NormalizedAtom(IO &io, const lld::UndefinedAtom *atom) : _file(fileFromContext(io)), _name(atom->name()), - _canBeNull(atom->canBeNull()) {} + _canBeNull(atom->canBeNull()), _fallback(atom->fallback()) {} + const lld::UndefinedAtom *denormalize(IO &io) { ContextInfo *info = reinterpret_cast<ContextInfo *>(io.getContext()); assert(info != nullptr); @@ -972,10 +976,11 @@ template <> struct MappingTraits<const lld::UndefinedAtom *> { DEBUG_WITH_TYPE("WriterYAML", llvm::dbgs() << "created UndefinedAtom named: '" << _name - << "' (" << (void *)_name.data() << ", " - << _name.size() << ")\n"); + << "' (" << (void *)_name.data() << ", " + << _name.size() << ")\n"); return this; } + // Extract current File object from YAML I/O parsing context const lld::File &fileFromContext(IO &io) { ContextInfo *info = reinterpret_cast<ContextInfo *>(io.getContext()); @@ -987,10 +992,12 @@ template <> struct MappingTraits<const lld::UndefinedAtom *> { virtual const lld::File &file() const { return _file; } virtual StringRef name() const { return _name; } virtual CanBeNull canBeNull() const { return _canBeNull; } + virtual const UndefinedAtom *fallback() const { return _fallback; } const lld::File &_file; StringRef _name; CanBeNull _canBeNull; + const UndefinedAtom *_fallback; }; static void mapping(IO &io, const lld::UndefinedAtom *&atom) { @@ -1000,6 +1007,8 @@ template <> struct MappingTraits<const lld::UndefinedAtom *> { io.mapRequired("name", keys->_name); io.mapOptional("can-be-null", keys->_canBeNull, lld::UndefinedAtom::canBeNullNever); + io.mapOptional("fallback", keys->_fallback, + (const lld::UndefinedAtom *)nullptr); } }; |

