Index: ELF/LTO.cpp =================================================================== --- ELF/LTO.cpp +++ ELF/LTO.cpp @@ -204,8 +204,10 @@ handleUndefinedAsmRefs(Sym, GV, AsmUndefinedRefs); continue; } - auto *B = dyn_cast(S->body()); - if (!B || B->file() != &F) + SymbolBody *B = S->body(); + if (B->kind() != SymbolBody::DefinedRegularKind) + continue; + if (B->File != &F) continue; // We collect the set of symbols we want to internalize here Index: ELF/OutputSections.cpp =================================================================== --- ELF/OutputSections.cpp +++ ELF/OutputSections.cpp @@ -1463,8 +1463,6 @@ case SymbolBody::LazyArchiveKind: case SymbolBody::LazyObjectKind: break; - case SymbolBody::DefinedBitcodeKind: - llvm_unreachable("should have been replaced"); } return nullptr; } Index: ELF/SymbolTable.cpp =================================================================== --- ELF/SymbolTable.cpp +++ ELF/SymbolTable.cpp @@ -471,7 +471,7 @@ /*IsUsedInRegularObj*/ false, F); int Cmp = compareDefinedNonCommon(S, WasInserted, Binding); if (Cmp > 0) - replaceBody(S, Name, StOther, Type, F); + replaceBody>(S, Name, StOther, Type, F); else if (Cmp == 0) reportDuplicate(S->body(), F); return S; Index: ELF/Symbols.h =================================================================== --- ELF/Symbols.h +++ ELF/Symbols.h @@ -45,7 +45,6 @@ DefinedRegularKind = DefinedFirst, SharedKind, DefinedCommonKind, - DefinedBitcodeKind, DefinedSyntheticKind, DefinedLast = DefinedSyntheticKind, UndefinedKind, @@ -159,14 +158,6 @@ static bool classof(const SymbolBody *S) { return S->isDefined(); } }; -// The defined symbol in LLVM bitcode files. -class DefinedBitcode : public Defined { -public: - DefinedBitcode(StringRef Name, uint8_t StOther, uint8_t Type, BitcodeFile *F); - static bool classof(const SymbolBody *S); - BitcodeFile *file() { return (BitcodeFile *)this->File; } -}; - template class DefinedCommon : public Defined { public: DefinedCommon(StringRef N, uint64_t Size, uint64_t Alignment, uint8_t StOther, @@ -217,6 +208,12 @@ llvm::ELF::STT_NOTYPE), Value(0), Size(0), Section(NullInputSection) {} + DefinedRegular(StringRef Name, uint8_t StOther, uint8_t Type, BitcodeFile *F) + : Defined(SymbolBody::DefinedRegularKind, Name, StOther, Type), Value(0), + Size(0), Section(NullInputSection) { + this->File = F; + } + static bool classof(const SymbolBody *S) { return S->kind() == SymbolBody::DefinedRegularKind; } @@ -439,11 +436,11 @@ // large and aligned enough to store any derived class of SymbolBody. We // assume that the size and alignment of ELF64LE symbols is sufficient for any // ELFT, and we verify this with the static_asserts in replaceBody. - llvm::AlignedCharArrayUnion< - DefinedBitcode, DefinedCommon, - DefinedRegular, - DefinedSynthetic, Undefined, - SharedSymbol, LazyArchive, LazyObject> + llvm::AlignedCharArrayUnion, + DefinedRegular, + DefinedSynthetic, + Undefined, SharedSymbol, + LazyArchive, LazyObject> Body; SymbolBody *body() { return reinterpret_cast(Body.buffer); } Index: ELF/Symbols.cpp =================================================================== --- ELF/Symbols.cpp +++ ELF/Symbols.cpp @@ -81,8 +81,6 @@ case SymbolBody::LazyObjectKind: assert(Body.symbol()->IsUsedInRegularObj && "lazy symbol reached writer"); return 0; - case SymbolBody::DefinedBitcodeKind: - llvm_unreachable("should have been replaced"); } llvm_unreachable("invalid symbol kind"); } @@ -192,16 +190,6 @@ Defined::Defined(Kind K, uint32_t NameOffset, uint8_t StOther, uint8_t Type) : SymbolBody(K, NameOffset, StOther, Type) {} -DefinedBitcode::DefinedBitcode(StringRef Name, uint8_t StOther, uint8_t Type, - BitcodeFile *F) - : Defined(DefinedBitcodeKind, Name, StOther, Type) { - this->File = F; -} - -bool DefinedBitcode::classof(const SymbolBody *S) { - return S->kind() == DefinedBitcodeKind; -} - Undefined::Undefined(StringRef Name, uint8_t StOther, uint8_t Type, InputFile *File) : SymbolBody(SymbolBody::UndefinedKind, Name, StOther, Type) {