Index: ELF/InputSection.cpp =================================================================== --- ELF/InputSection.cpp +++ ELF/InputSection.cpp @@ -330,7 +330,8 @@ } InputSectionBase *InputSection::getRelocatedSection() { - assert(Type == SHT_RELA || Type == SHT_REL); + if (!File || (Type != SHT_RELA && Type != SHT_REL)) + return nullptr; ArrayRef Sections = File->getSections(); return Sections[Info]; } Index: ELF/LinkerScript.cpp =================================================================== --- ELF/LinkerScript.cpp +++ ELF/LinkerScript.cpp @@ -658,9 +658,8 @@ // to create target sections first. We do not want priority handling // for synthetic sections because them are special. for (InputSectionBase *IS : InputSections) { - if ((IS->Type == SHT_REL || IS->Type == SHT_RELA) && - !isa(IS)) - if (auto *Rel = cast(IS)->getRelocatedSection()) + if (auto *Sec = dyn_cast(IS)) + if (InputSectionBase *Rel = Sec->getRelocatedSection()) if (auto *RelIS = dyn_cast_or_null(Rel->Parent)) Add(RelIS); Add(IS); Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -94,13 +94,13 @@ // This is for --emit-relocs. If .text.foo is emitted as .text.bar, we want // to emit .rela.text.foo as .rela.text.bar for consistency (this is not // technically required, but not doing it is odd). This code guarantees that. - if ((S->Type == SHT_REL || S->Type == SHT_RELA) && - !isa(S)) { - OutputSection *Out = - cast(S)->getRelocatedSection()->getOutputSection(); - if (S->Type == SHT_RELA) - return Saver.save(".rela" + Out->Name); - return Saver.save(".rel" + Out->Name); + if (auto *IS = dyn_cast(S)) { + if (InputSectionBase *Rel = IS->getRelocatedSection()) { + OutputSection *Out = Rel->getOutputSection(); + if (S->Type == SHT_RELA) + return Saver.save(".rela" + Out->Name); + return Saver.save(".rel" + Out->Name); + } } for (StringRef V :