diff options
| author | Rui Ueyama <ruiu@google.com> | 2013-09-12 19:14:05 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2013-09-12 19:14:05 +0000 |
| commit | e5416ec2d21854f34801c33ef567072d3e647f6f (patch) | |
| tree | f216f2c3028f202636221ce64abf9cf5a3dbfeb3 /lld/lib/ReaderWriter/Native | |
| parent | 1e2e3ea584121f523aa4118f383927ed6b73246c (diff) | |
| download | bcm5719-llvm-e5416ec2d21854f34801c33ef567072d3e647f6f.tar.gz bcm5719-llvm-e5416ec2d21854f34801c33ef567072d3e647f6f.zip | |
Add a fallback mechanism for undefined atom.
In COFF, an undefined symbol can have up to one alternative name. If a symbol
is resolved by its regular name, then it's linked normally. If a symbol is not
found in any input files, all references to the regular name are resolved using
the alternative name. If the alternative name is not found, it's a link error.
This mechanism is called "weak externals".
To support this mechanism, I added a new member function fallback() to undefined
atom. If an undefined atom has the second name, fallback() returns a new undefined
atom that should be used instead of the original one to resolve undefines. If it
does not have the second name, the function returns nullptr.
Differential Revision: http://llvm-reviews.chandlerc.com/D1550
llvm-svn: 190625
Diffstat (limited to 'lld/lib/ReaderWriter/Native')
| -rw-r--r-- | lld/lib/ReaderWriter/Native/NativeFileFormat.h | 2 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/Native/ReaderNative.cpp | 13 |
2 files changed, 12 insertions, 3 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; |

