forked from OSchip/llvm-project
[XCOFF] Fix link errors from explicit template instantiation
I happen to be using clang-cl+lld-link locally, and I get these link errors: lld-link: error: undefined symbol: public: unsigned short __cdecl llvm::object::XCOFFSectionHeader<struct llvm::object::XCOFFSectionHeader64>::getSectionType(void) const >>> referenced by C:\src\llvm-project\llvm\tools\llvm-readobj\XCOFFDumper.cpp:106 >>> tools\llvm-readobj\CMakeFiles\llvm-readobj.dir\XCOFFDumper.cpp.obj:(public: virtual void __cdecl `anonymous namespace'::XCOFFDumper::printSectionHeaders(void)) I suspect this is because the explicit template instaniation appears before the inline method definitions in the .cpp file, so they aren't available at the point of instantiation. Move the explicit instantiation later. Also, forward declare the explicit instantiation for good measure.
This commit is contained in:
parent
7d2b0ec345
commit
c989993ba1
|
@ -60,6 +60,12 @@ public:
|
|||
bool isReservedSectionType() const;
|
||||
};
|
||||
|
||||
// Explicit extern template declarations.
|
||||
struct XCOFFSectionHeader32;
|
||||
struct XCOFFSectionHeader64;
|
||||
extern template struct XCOFFSectionHeader<XCOFFSectionHeader32>;
|
||||
extern template struct XCOFFSectionHeader<XCOFFSectionHeader64>;
|
||||
|
||||
struct XCOFFSectionHeader32 : XCOFFSectionHeader<XCOFFSectionHeader32> {
|
||||
char Name[XCOFF::NameSize];
|
||||
support::ubig32_t PhysicalAddress;
|
||||
|
|
|
@ -61,6 +61,10 @@ bool XCOFFSectionHeader<T>::isReservedSectionType() const {
|
|||
return getSectionType() & SectionFlagsReservedMask;
|
||||
}
|
||||
|
||||
// Explictly instantiate template classes.
|
||||
template struct XCOFFSectionHeader<XCOFFSectionHeader32>;
|
||||
template struct XCOFFSectionHeader<XCOFFSectionHeader64>;
|
||||
|
||||
bool XCOFFRelocation32::isRelocationSigned() const {
|
||||
return Info & XR_SIGN_INDICATOR_MASK;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue