diff options
author | Rui Ueyama <ruiu@google.com> | 2016-03-11 18:46:51 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2016-03-11 18:46:51 +0000 |
commit | f7149554029129edb893f7271f4f584a11ef1d9a (patch) | |
tree | 640e2a90627e4e46de2db34b1ce139aaca09a25c | |
parent | 2230483812b21eab10e5e645207b31e4b8b202e2 (diff) | |
download | bcm5719-llvm-f7149554029129edb893f7271f4f584a11ef1d9a.tar.gz bcm5719-llvm-f7149554029129edb893f7271f4f584a11ef1d9a.zip |
Revert r263252: "[ELF] - Change all messages to lowercase to be consistent."
This reverts commit r263252 because the change contained unrelated changes.
llvm-svn: 263272
-rw-r--r-- | lld/ELF/Driver.cpp | 14 | ||||
-rw-r--r-- | lld/ELF/InputFiles.cpp | 112 | ||||
-rw-r--r-- | lld/ELF/InputFiles.h | 15 | ||||
-rw-r--r-- | lld/ELF/InputSection.cpp | 17 | ||||
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 8 | ||||
-rw-r--r-- | lld/ELF/OutputSections.cpp | 8 | ||||
-rw-r--r-- | lld/ELF/SymbolTable.cpp | 42 | ||||
-rw-r--r-- | lld/ELF/Symbols.cpp | 6 | ||||
-rw-r--r-- | lld/ELF/Target.cpp | 24 | ||||
-rw-r--r-- | lld/test/ELF/basic.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/driver.test | 6 | ||||
-rw-r--r-- | lld/test/ELF/invalid-cie-reference.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/invalid-elf.test | 13 | ||||
-rw-r--r-- | lld/test/ELF/invalid-relocations.test | 2 | ||||
-rw-r--r-- | lld/test/ELF/libsearch.s | 4 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript-sections-padding.s | 4 | ||||
-rw-r--r-- | lld/test/ELF/merge-string-error.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/merge-string-no-null.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/mips-gnu-hash.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/ppc64-addr16-error.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/relocation-in-merge.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/relocation-past-merge-end.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/splitstacks.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/sysroot.s | 2 | ||||
-rw-r--r-- | lld/test/ELF/writable-merge.s | 2 |
25 files changed, 156 insertions, 141 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 99a53291876..2fd24e4b77a 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -61,9 +61,9 @@ static std::pair<ELFKind, uint16_t> parseEmulation(StringRef S) { if (S == "aarch64linux") return {ELF64LEKind, EM_AARCH64}; if (S == "i386pe" || S == "i386pep" || S == "thumb2pe") - error("windows targets are not supported on the ELF frontend: " + S); + error("Windows targets are not supported on the ELF frontend: " + S); else - error("unknown emulation: " + S); + error("Unknown emulation: " + S); return {ELFNoneKind, 0}; } @@ -112,7 +112,7 @@ void LinkerDriver::addFile(StringRef Path) { return; case file_magic::elf_shared_object: if (Config->Relocatable) { - error("attempted static link of dynamic object " + Path); + error("Attempted static link of dynamic object " + Path); return; } Files.push_back(createSharedFile(MBRef)); @@ -126,7 +126,7 @@ void LinkerDriver::addFile(StringRef Path) { void LinkerDriver::addLibrary(StringRef Name) { std::string Path = searchLibrary(Name); if (Path.empty()) - error("unable to find library -l" + Name); + error("Unable to find library -l" + Name); else addFile(Path); } @@ -137,7 +137,7 @@ static void checkOptions(opt::InputArgList &Args) { // The MIPS ABI as of 2016 does not support the GNU-style symbol lookup // table which is a relatively new feature. if (Config->EMachine == EM_MIPS && Config->GnuHash) - error("the .gnu.hash section is not compatible with the MIPS target."); + error("The .gnu.hash section is not compatible with the MIPS target."); if (Config->EMachine == EM_AMDGPU && !Config->Entry.empty()) error("-e option is not valid for AMDGPU."); @@ -262,7 +262,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { if (auto *Arg = Args.getLastArg(OPT_O)) { StringRef Val = Arg->getValue(); if (Val.getAsInteger(10, Config->Optimize)) - error("invalid optimization level"); + error("Invalid optimization level"); } if (auto *Arg = Args.getLastArg(OPT_hash_style)) { @@ -273,7 +273,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { } else if (S == "both") { Config->GnuHash = true; } else if (S != "sysv") - error("unknown hash style: " + S); + error("Unknown hash style: " + S); } for (auto *Arg : Args.filtered(OPT_undefined)) diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 021b14c38dd..fcc05c2a2c6 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -53,7 +53,7 @@ ELFFileBase<ELFT>::getElfSymbols(bool OnlyGlobals) { uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end()); uint32_t FirstNonLocal = Symtab->sh_info; if (FirstNonLocal > NumSymbols) - fatal("invalid sh_info in symbol table"); + fatal("Invalid sh_info in symbol table"); if (OnlyGlobals) return make_range(Syms.begin() + FirstNonLocal, Syms.end()); @@ -137,7 +137,7 @@ elf::ObjectFile<ELFT>::getShtGroupEntries(const Elf_Shdr &Sec) { ArrayRef<uint32_X> Entries = check(Obj.template getSectionContentsAsArray<uint32_X>(&Sec)); if (Entries.empty() || Entries[0] != GRP_COMDAT) - fatal("unsupported SHT_GROUP format"); + fatal("Unsupported SHT_GROUP format"); return Entries.slice(1); } @@ -148,7 +148,7 @@ static bool shouldMerge(const typename ELFFile<ELFT>::Elf_Shdr &Sec) { if (!(Flags & SHF_MERGE)) return false; if (Flags & SHF_WRITE) - fatal("writable SHF_MERGE sections are not supported"); + fatal("Writable SHF_MERGE sections are not supported"); uintX_t EntSize = Sec.sh_entsize; if (!EntSize || Sec.sh_size % EntSize) fatal("SHF_MERGE section size must be a multiple of sh_entsize"); @@ -187,7 +187,7 @@ void elf::ObjectFile<ELFT>::initializeSections( continue; for (uint32_t SecIndex : getShtGroupEntries(Sec)) { if (SecIndex >= Size) - fatal("invalid section index in group"); + fatal("Invalid section index in group"); Sections[SecIndex] = InputSection<ELFT>::Discarded; } break; @@ -204,7 +204,7 @@ void elf::ObjectFile<ELFT>::initializeSections( case SHT_REL: { uint32_t RelocatedSectionIndex = Sec.sh_info; if (RelocatedSectionIndex >= Size) - fatal("invalid relocated section index"); + fatal("Invalid relocated section index"); InputSectionBase<ELFT> *RelocatedSection = Sections[RelocatedSectionIndex]; // Strictly speaking, a relocation section must be included in the @@ -213,7 +213,7 @@ void elf::ObjectFile<ELFT>::initializeSections( if (RelocatedSection == InputSection<ELFT>::Discarded) continue; if (!RelocatedSection) - fatal("unsupported relocation reference"); + fatal("Unsupported relocation reference"); if (Config->Relocatable) { // For -r, relocation sections are handled as regular input sections. Sections[I] = new (Alloc) InputSection<ELFT>(this, &Sec); @@ -221,10 +221,10 @@ void elf::ObjectFile<ELFT>::initializeSections( S->RelocSections.push_back(&Sec); } else if (auto *S = dyn_cast<EHInputSection<ELFT>>(RelocatedSection)) { if (S->RelocSection) - fatal("multiple relocation sections to .eh_frame are not supported"); + fatal("Multiple relocation sections to .eh_frame are not supported"); S->RelocSection = &Sec; } else { - fatal("relocations pointing to SHF_MERGE are not supported"); + fatal("Relocations pointing to SHF_MERGE are not supported"); } break; } @@ -247,7 +247,7 @@ elf::ObjectFile<ELFT>::createInputSection(const Elf_Shdr &Sec) { return InputSection<ELFT>::Discarded; if (Name == ".note.GNU-split-stack") - error("objects using splitstacks are not supported"); + error("Objects using splitstacks are not supported"); // A MIPS object file has a special section that contains register // usage info, which needs to be handled by the linker specially. @@ -281,7 +281,7 @@ elf::ObjectFile<ELFT>::getSection(const Elf_Sym &Sym) const { if (Index == 0) return nullptr; if (Index >= Sections.size() || !Sections[Index]) - fatal("invalid section index"); + fatal("Invalid section index"); InputSectionBase<ELFT> *S = Sections[Index]; if (S == InputSectionBase<ELFT>::Discarded) return S; @@ -397,7 +397,7 @@ template <class ELFT> void SharedFile<ELFT>::parseSoName() { if (Dyn.d_tag == DT_SONAME) { uintX_t Val = Dyn.getVal(); if (Val >= this->StringTable.size()) - fatal("invalid DT_SONAME entry"); + fatal("Invalid DT_SONAME entry"); SoName = StringRef(this->StringTable.data() + Val); return; } @@ -433,7 +433,51 @@ static uint8_t getGvVisibility(const GlobalValue *GV) { case GlobalValue::ProtectedVisibility: return STV_PROTECTED; } - llvm_unreachable("unknown visibility"); + llvm_unreachable("Unknown visibility"); +} + +SymbolBody * +BitcodeFile::createSymbolBody(const DenseSet<const Comdat *> &KeptComdats, + const IRObjectFile &Obj, + const BasicSymbolRef &Sym) { + const GlobalValue *GV = Obj.getSymbolGV(Sym.getRawDataRefImpl()); + assert(GV); + if (const Comdat *C = GV->getComdat()) + if (!KeptComdats.count(C)) + return nullptr; + + uint8_t Visibility = getGvVisibility(GV); + + SmallString<64> Name; + raw_svector_ostream OS(Name); + Sym.printName(OS); + StringRef NameRef = Saver.save(StringRef(Name)); + + const Module &M = Obj.getModule(); + SymbolBody *Body; + uint32_t Flags = Sym.getFlags(); + bool IsWeak = Flags & BasicSymbolRef::SF_Weak; + if (Flags & BasicSymbolRef::SF_Undefined) { + Body = new (Alloc) Undefined(NameRef, IsWeak, Visibility, false); + } else if (Flags & BasicSymbolRef::SF_Common) { + const DataLayout &DL = M.getDataLayout(); + uint64_t Size = DL.getTypeAllocSize(GV->getValueType()); + Body = new (Alloc) + DefinedCommon(NameRef, Size, GV->getAlignment(), IsWeak, Visibility); + } else { + Body = new (Alloc) DefinedBitcode(NameRef, IsWeak, Visibility); + } + Body->IsTls = GV->isThreadLocal(); + return Body; +} + +bool BitcodeFile::shouldSkip(const BasicSymbolRef &Sym) { + uint32_t Flags = Sym.getFlags(); + if (!(Flags & BasicSymbolRef::SF_Global)) + return true; + if (Flags & BasicSymbolRef::SF_FormatSpecific) + return true; + return false; } void BitcodeFile::parse(DenseSet<StringRef> &ComdatGroups) { @@ -448,43 +492,9 @@ void BitcodeFile::parse(DenseSet<StringRef> &ComdatGroups) { KeptComdats.insert(&P.second); } - for (const BasicSymbolRef &Sym : Obj->symbols()) { - const GlobalValue *GV = Obj->getSymbolGV(Sym.getRawDataRefImpl()); - assert(GV); - uint32_t Flags = Sym.getFlags(); - if (const Comdat *C = GV->getComdat()) - if (!KeptComdats.count(C)) - continue; - if (!(Flags & BasicSymbolRef::SF_Global)) - continue; - if (GV->hasAppendingLinkage()) { - ExtraKeeps.push_back(GV->getName().copy(Alloc)); - continue; - } - if (Flags & BasicSymbolRef::SF_FormatSpecific) - continue; - uint8_t Visibility = getGvVisibility(GV); - - SmallString<64> Name; - raw_svector_ostream OS(Name); - Sym.printName(OS); - StringRef NameRef = Saver.save(StringRef(Name)); - - SymbolBody *Body; - bool IsWeak = Flags & BasicSymbolRef::SF_Weak; - if (Flags & BasicSymbolRef::SF_Undefined) { - Body = new (Alloc) Undefined(NameRef, IsWeak, Visibility, false); - } else if (Flags & BasicSymbolRef::SF_Common) { - const DataLayout &DL = M.getDataLayout(); - uint64_t Size = DL.getTypeAllocSize(GV->getValueType()); - Body = new (Alloc) - DefinedCommon(NameRef, Size, GV->getAlignment(), IsWeak, Visibility); - } else { - Body = new (Alloc) DefinedBitcode(NameRef, IsWeak, Visibility); - } - Body->IsTls = GV->isThreadLocal(); - SymbolBodies.push_back(Body); - } + for (const BasicSymbolRef &Sym : Obj->symbols()) + if (!shouldSkip(Sym)) + SymbolBodies.push_back(createSymbolBody(KeptComdats, *Obj, Sym)); } template <typename T> @@ -506,7 +516,7 @@ template <template <class> class T> static std::unique_ptr<InputFile> createELFFile(MemoryBufferRef MB) { std::pair<unsigned char, unsigned char> Type = getElfArchType(MB.getBuffer()); if (Type.second != ELF::ELFDATA2LSB && Type.second != ELF::ELFDATA2MSB) - fatal("invalid data encoding: " + MB.getBufferIdentifier()); + fatal("Invalid data encoding: " + MB.getBufferIdentifier()); if (Type.first == ELF::ELFCLASS32) { if (Type.second == ELF::ELFDATA2LSB) @@ -518,7 +528,7 @@ static std::unique_ptr<InputFile> createELFFile(MemoryBufferRef MB) { return createELFFileAux<T<ELF64LE>>(MB); return createELFFileAux<T<ELF64BE>>(MB); } - fatal("invalid file class: " + MB.getBufferIdentifier()); + fatal("Invalid file class: " + MB.getBufferIdentifier()); } std::unique_ptr<InputFile> elf::createObjectFile(MemoryBufferRef MB, diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h index 9019241015a..5cd9df16ccc 100644 --- a/lld/ELF/InputFiles.h +++ b/lld/ELF/InputFiles.h @@ -18,8 +18,10 @@ #include "lld/Core/LLVM.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/IR/Comdat.h" #include "llvm/Object/Archive.h" #include "llvm/Object/ELF.h" +#include "llvm/Object/IRObjectFile.h" #include "llvm/Support/StringSaver.h" namespace lld { @@ -180,19 +182,16 @@ public: static bool classof(const InputFile *F); void parse(llvm::DenseSet<StringRef> &ComdatGroups); ArrayRef<SymbolBody *> getSymbols() { return SymbolBodies; } - ArrayRef<StringRef> getExtraKeeps() { return ExtraKeeps; } + static bool shouldSkip(const llvm::object::BasicSymbolRef &Sym); private: std::vector<SymbolBody *> SymbolBodies; - // Some symbols like llvm.global_ctors are internal to the IR and so - // don't show up in SymbolBodies, but must be kept when creating the - // combined LTO module. We track them here. - // We currently use a different Module for creating SymbolBody's vs when - // we are creating the combined LTO module, and so we can't store IR - // pointers directly and must rely on the IR names. - std::vector<StringRef> ExtraKeeps; llvm::BumpPtrAllocator Alloc; llvm::StringSaver Saver{Alloc}; + SymbolBody * + createSymbolBody(const llvm::DenseSet<const llvm::Comdat *> &KeptComdats, + const llvm::object::IRObjectFile &Obj, + const llvm::object::BasicSymbolRef &Sym); }; // .so file. diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 4001034238a..1c211636203 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -25,7 +25,7 @@ using namespace lld; using namespace lld::elf; template <class ELFT> -InputSectionBase<ELFT>::InputSectionBase(ObjectFile<ELFT> *File, +InputSectionBase<ELFT>::InputSectionBase(elf::ObjectFile<ELFT> *File, const Elf_Shdr *Header, Kind SectionKind) : Header(Header), File(File), SectionKind(SectionKind), Repl(this) { @@ -62,7 +62,7 @@ InputSectionBase<ELFT>::getOffset(uintX_t Offset) { // so it should never be copied to output. llvm_unreachable("MIPS .reginfo reached writeTo()."); } - llvm_unreachable("invalid section kind"); + llvm_unreachable("Invalid section kind"); } template <class ELFT> @@ -93,7 +93,8 @@ InputSectionBase<ELFT>::getRelocTarget(const Elf_Rela &Rel) const { } template <class ELFT> -InputSection<ELFT>::InputSection(ObjectFile<ELFT> *F, const Elf_Shdr *Header) +InputSection<ELFT>::InputSection(elf::ObjectFile<ELFT> *F, + const Elf_Shdr *Header) : InputSectionBase<ELFT>(F, Header, Base::Regular) {} template <class ELFT> @@ -331,12 +332,12 @@ void InputSection<ELFT>::replace(InputSection<ELFT> *Other) { template <class ELFT> SplitInputSection<ELFT>::SplitInputSection( - ObjectFile<ELFT> *File, const Elf_Shdr *Header, + elf::ObjectFile<ELFT> *File, const Elf_Shdr *Header, typename InputSectionBase<ELFT>::Kind SectionKind) : InputSectionBase<ELFT>(File, Header, SectionKind) {} template <class ELFT> -EHInputSection<ELFT>::EHInputSection(ObjectFile<ELFT> *F, +EHInputSection<ELFT>::EHInputSection(elf::ObjectFile<ELFT> *F, const Elf_Shdr *Header) : SplitInputSection<ELFT>(F, Header, InputSectionBase<ELFT>::EHFrame) { // Mark .eh_frame sections as live by default because there are @@ -386,7 +387,7 @@ SplitInputSection<ELFT>::getRangeAndSize(uintX_t Offset) { StringRef Data((const char *)D.data(), D.size()); uintX_t Size = Data.size(); if (Offset >= Size) - fatal("entry is past the end of the section"); + fatal("Entry is past the end of the section"); // Find the element this offset points to. auto I = std::upper_bound( @@ -424,13 +425,13 @@ MergeInputSection<ELFT>::getOffset(uintX_t Offset) { } template <class ELFT> -MipsReginfoInputSection<ELFT>::MipsReginfoInputSection(ObjectFile<ELFT> *F, +MipsReginfoInputSection<ELFT>::MipsReginfoInputSection(elf::ObjectFile<ELFT> *F, const Elf_Shdr *Hdr) : InputSectionBase<ELFT>(F, Hdr, InputSectionBase<ELFT>::MipsReginfo) { // Initialize this->Reginfo. ArrayRef<uint8_t> D = this->getSectionData(); if (D.size() != sizeof(Elf_Mips_RegInfo<ELFT>)) - fatal("invalid size of .reginfo section"); + fatal("Invalid size of .reginfo section"); Reginfo = reinterpret_cast<const Elf_Mips_RegInfo<ELFT> *>(D.data()); } diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 677abb116b5..b4580b5fe7c 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -296,7 +296,7 @@ void ScriptParser::addFile(StringRef S) { } else { std::string Path = findFromSearchPaths(S); if (Path.empty()) - setError("unable to find " + S); + setError("Unable to find " + S); else Driver->addFile(Saver.save(Path)); } @@ -419,7 +419,7 @@ std::vector<uint8_t> ScriptParser::parseHex(StringRef S) { S = S.substr(2); uint8_t H; if (B.getAsInteger(16, H)) { - setError("not a HEX value: " + B); + setError("Not a HEX value: " + B); return {}; } Hex.push_back(H); @@ -442,13 +442,13 @@ void ScriptParser::readOutputSectionDescription() { readSectionPatterns(OutSec, true); expect(")"); } else { - setError("unknown command " + Tok); + setError("Unknown command " + Tok); } } StringRef Tok = peek(); if (Tok.startswith("=")) { if (!Tok.startswith("=0x")) { - setError("filler should be a HEX value"); + setError("Filler should be a HEX value"); return; } Tok = Tok.substr(3); diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index a84cedc5b02..a3a331ff8cf 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -256,7 +256,7 @@ typename ELFFile<ELFT>::uintX_t DynamicReloc<ELFT>::getOffset() const { case Off_GotPlt: return Sym->getGotPltVA<ELFT>(); } - llvm_unreachable("invalid offset kind"); + llvm_unreachable("Invalid offset kind"); } template <class ELFT> void RelocationSection<ELFT>::writeTo(uint8_t *Buf) { @@ -1150,7 +1150,7 @@ void EHOutputSection<ELFT>::addSectionAux( uint32_t CieOffset = Offset + 4 - ID; auto I = OffsetToIndex.find(CieOffset); if (I == OffsetToIndex.end()) - fatal("invalid CIE reference"); + fatal("Invalid CIE reference"); Cies[I->second].Fdes.push_back(EHRegion<ELFT>(S, Index)); Out<ELFT>::EhFrameHdr->reserveFde(); this->Header.sh_size += alignTo(Length, sizeof(uintX_t)); @@ -1266,7 +1266,7 @@ void MergeOutputSection<ELFT>::addSection(InputSectionBase<ELFT> *C) { while (!Data.empty()) { size_t End = findNull(Data, EntSize); if (End == StringRef::npos) - fatal("string is not null terminated"); + fatal("String is not null terminated"); StringRef Entry = Data.substr(0, End + EntSize); uintX_t OutputOffset = Builder.add(Entry); if (shouldTailMerge()) @@ -1512,7 +1512,7 @@ SymbolTableSection<ELFT>::getOutputSection(SymbolBody *Sym) { case SymbolBody::LazyKind: break; case SymbolBody::DefinedBitcodeKind: - llvm_unreachable("should have been replaced"); + llvm_unreachable("Should have been replaced"); } return nullptr; } diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index ae6b77b56c8..aa97595ee11 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -84,7 +84,8 @@ void SymbolTable<ELFT>::addFile(std::unique_ptr<InputFile> File) { BitcodeFiles.emplace_back(cast<BitcodeFile>(File.release())); F->parse(ComdatGroups); for (SymbolBody *B : F->getSymbols()) - resolve(B); + if (B) + resolve(B); return; } @@ -118,7 +119,7 @@ std::unique_ptr<InputFile> SymbolTable<ELFT>::codegen(Module &M) { std::string ErrMsg; const Target *TheTarget = TargetRegistry::lookupTarget(TripleStr, ErrMsg); if (!TheTarget) - fatal("target not found: " + ErrMsg); + fatal("Target not found: " + ErrMsg); TargetOptions Options; Reloc::Model R = Config->Shared ? Reloc::PIC_ : Reloc::Static; @@ -129,7 +130,7 @@ std::unique_ptr<InputFile> SymbolTable<ELFT>::codegen(Module &M) { legacy::PassManager CodeGenPasses; if (TM->addPassesToEmitFile(CodeGenPasses, OS, TargetMachine::CGFT_ObjectFile)) - fatal("failed to setup codegen"); + fatal("Failed to setup codegen"); CodeGenPasses.run(M); LtoBuffer = MemoryBuffer::getMemBuffer(OwningLTOData, "", false); if (Config->SaveTemps) @@ -139,28 +140,33 @@ std::unique_ptr<InputFile> SymbolTable<ELFT>::codegen(Module &M) { static void addBitcodeFile(IRMover &Mover, BitcodeFile &F, LLVMContext &Context) { - std::unique_ptr<MemoryBuffer> Buffer = - MemoryBuffer::getMemBuffer(F.MB, false); - std::unique_ptr<Module> M = - check(getLazyBitcodeModule(std::move(Buffer), Context, - /*ShouldLazyLoadMetadata*/ false)); + + std::unique_ptr<IRObjectFile> Obj = + check(IRObjectFile::create(F.MB, Context)); std::vector<GlobalValue *> Keep; - for (SymbolBody *B : F.getSymbols()) { - if (&B->repl() != B) + unsigned BodyIndex = 0; + ArrayRef<SymbolBody *> Bodies = F.getSymbols(); + + for (const BasicSymbolRef &Sym : Obj->symbols()) { + GlobalValue *GV = Obj->getSymbolGV(Sym.getRawDataRefImpl()); + assert(GV); + if (GV->hasAppendingLinkage()) { + Keep.push_back(GV); + continue; + } + if (BitcodeFile::shouldSkip(Sym)) + continue; + SymbolBody *B = Bodies[BodyIndex++]; + if (!B || &B->repl() != B) continue; auto *DB = dyn_cast<DefinedBitcode>(B); if (!DB) continue; - GlobalValue *GV = M->getNamedValue(B->getName()); - assert(GV); Keep.push_back(GV); } - for (StringRef S : F.getExtraKeeps()) { - GlobalValue *GV = M->getNamedValue(S); - assert(GV); - Keep.push_back(GV); - } - Mover.move(std::move(M), Keep, [](GlobalValue &, IRMover::ValueAdder) {}); + + Mover.move(Obj->takeModule(), Keep, + [](GlobalValue &, IRMover::ValueAdder) {}); } // This is for use when debugging LTO. diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index aea97c49ab8..30179e4a3bf 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -73,12 +73,12 @@ getSymVA(const SymbolBody &Body, typename ELFFile<ELFT>::uintX_t &Addend) { case SymbolBody::UndefinedKind: return 0; case SymbolBody::LazyKind: - assert(Body.isUsedInRegularObj() && "lazy symbol reached writer"); + assert(Body.isUsedInRegularObj() && "Lazy symbol reached writer"); return 0; case SymbolBody::DefinedBitcodeKind: - llvm_unreachable("should have been replaced"); + llvm_unreachable("Should have been replaced"); } - llvm_unreachable("invalid symbol kind"); + llvm_unreachable("Invalid symbol kind"); } template <class ELFT> diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index ed89aade3ab..1fbd5bca10b 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -46,28 +46,28 @@ template <unsigned N> static void checkInt(int64_t V, uint32_t Type) { if (isInt<N>(V)) return; StringRef S = getELFRelocationTypeName(Config->EMachine, Type); - error("relocation " + S + " out of range"); + error("Relocation " + S + " out of range"); } template <unsigned N> static void checkUInt(uint64_t V, uint32_t Type) { if (isUInt<N>(V)) return; StringRef S = getELFRelocationTypeName(Config->EMachine, Type); - error("relocation " + S + " out of range"); + error("Relocation " + S + " out of range"); } template <unsigned N> static void checkIntUInt(uint64_t V, uint32_t Type) { if (isInt<N>(V) || isUInt<N>(V)) return; StringRef S = getELFRelocationTypeName(Config->EMachine, Type); - error("relocation " + S + " out of range"); + error("Relocation " + S + " out of range"); } template <unsigned N> static void checkAlignment(uint64_t V, uint32_t Type) { if ((V & (N - 1)) == 0) return; StringRef S = getELFRelocationTypeName(Config->EMachine, Type); - error("improper alignment for relocation " + S); + error("Improper alignment for relocation " + S); } template <class ELFT> bool isGnuIFunc(const SymbolBody &S) { @@ -246,7 +246,7 @@ TargetInfo *createTarget() { case ELF32BEKind: return new MipsTargetInfo<ELF32BE>(); default: - fatal("unsupported MIPS target"); + fatal("Unsupported MIPS target"); } case EM_PPC: return new PPCTargetInfo(); @@ -255,7 +255,7 @@ TargetInfo *createTarget() { case EM_X86_64: return new X86_64TargetInfo(); } - fatal("unknown target machine"); + fatal("Unknown target machine"); } TargetInfo::~TargetInfo() {} @@ -566,7 +566,7 @@ size_t X86TargetInfo::relaxTls(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type, relocateOne(Loc, BufEnd, R_386_TLS_LE, P, SA); return 0; } - llvm_unreachable("unknown TLS optimization"); + llvm_unreachable("Unknown TLS optimization"); } // "Ulrich Drepper, ELF Handling For Thread-Local Storage" (5.1 @@ -914,7 +914,7 @@ size_t X86_64TargetInfo::relaxTls(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type, // The next relocation should be against __tls_get_addr, so skip it return 1; } - llvm_unreachable("unknown TLS optimization"); + llvm_unreachable("Unknown TLS optimization"); } void X86_64TargetInfo::relocateOne(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type, @@ -1470,7 +1470,7 @@ size_t AArch64TargetInfo::relaxTls(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type, case R_AARCH64_TLSDESC_ADD_LO12_NC: case R_AARCH64_TLSDESC_CALL: { if (canBePreempted(S)) - fatal("unsupported TLS optimization"); + fatal("Unsupported TLS optimization"); uint64_t X = S.getVA<ELF64LE>(); relocateTlsGdToLe(Type, Loc, BufEnd, P, X); return 0; @@ -1480,7 +1480,7 @@ size_t AArch64TargetInfo::relaxTls(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type, relocateTlsIeToLe(Type, Loc, BufEnd, P, S.getVA<ELF64LE>()); return 0; } - llvm_unreachable("unknown TLS optimization"); + llvm_unreachable("Unknown TLS optimization"); } // Global-Dynamic relocations can be relaxed to Local-Exec if both binary is @@ -1519,7 +1519,7 @@ void AArch64TargetInfo::relocateTlsGdToLe(uint32_t Type, uint8_t *Loc, NewInst = 0xf2800000 | ((X & 0xffff) << 5); break; default: - llvm_unreachable("unsupported Relocation for TLS GD to LE relax"); + llvm_unreachable("Unsupported Relocation for TLS GD to LE relax"); } write32le(Loc, NewInst); } @@ -1544,7 +1544,7 @@ void AArch64TargetInfo::relocateTlsIeToLe(uint32_t Type, uint8_t *Loc, unsigned RegNo = (Inst & 0x1f); NewInst = (0xf2800000 | RegNo) | ((X & 0xffff) << 5); } else { - llvm_unreachable("invalid Relocation for TLS IE to LE Relax"); + llvm_unreachable("Invalid Relocation for TLS IE to LE Relax"); } write32le(Loc, NewInst); } diff --git a/lld/test/ELF/basic.s b/lld/test/ELF/basic.s index f2bf93b7544..bbc674ced2e 100644 --- a/lld/test/ELF/basic.s +++ b/lld/test/ELF/basic.s @@ -213,4 +213,4 @@ _start: # DUP: duplicate symbol: _start in {{.*}} and {{.*}} # RUN: not ld.lld %t -o %t -m wrong_emul 2>&1 | FileCheck --check-prefix=UNKNOWN_EMUL %s -# UNKNOWN_EMUL: unknown emulation: wrong_emul +# UNKNOWN_EMUL: Unknown emulation: wrong_emul diff --git a/lld/test/ELF/driver.test b/lld/test/ELF/driver.test index cf6601ade02..9c83fa52253 100644 --- a/lld/test/ELF/driver.test +++ b/lld/test/ELF/driver.test @@ -6,9 +6,9 @@ # UNKNOWN: warning: unknown argument: --unknown1 # UNKNOWN: warning: unknown argument: --unknown2 # UNKNOWN: unknown argument(s) found -# UNKNOWN: unknown emulation: foo +# UNKNOWN: Unknown emulation: foo # UNKNOWN: cannot open /no/such/file -# UNKNOWN: unable to find library -lnosuchlib +# UNKNOWN: Unable to find library -lnosuchlib # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t # RUN: not ld.lld %t -o /no/such/file 2>&1 | FileCheck -check-prefix=MISSING %s @@ -23,7 +23,7 @@ ## Attempt to link DSO with -r # RUN: ld.lld -shared %t -o %t.so # RUN: not ld.lld -r %t.so %t -o %tfail 2>&1 | FileCheck -check-prefix=ERR %s -# ERR: attempted static link of dynamic object +# ERR: Attempted static link of dynamic object ## Attempt to use -r and -shared together # RUN: not ld.lld -r -shared %t -o %tfail 2>&1 | FileCheck -check-prefix=ERR2 %s diff --git a/lld/test/ELF/invalid-cie-reference.s b/lld/test/ELF/invalid-cie-reference.s index fba2467e216..1b099d19b7e 100644 --- a/lld/test/ELF/invalid-cie-reference.s +++ b/lld/test/ELF/invalid-cie-reference.s @@ -29,4 +29,4 @@ .long 0x0 .long 0x0 -// CHECK: invalid CIE reference +// CHECK: Invalid CIE reference diff --git a/lld/test/ELF/invalid-elf.test b/lld/test/ELF/invalid-elf.test index c3a97d37ffa..05e95cab0d2 100644 --- a/lld/test/ELF/invalid-elf.test +++ b/lld/test/ELF/invalid-elf.test @@ -2,27 +2,26 @@ # RUN: not ld.lld %t %p/Inputs/invalid-data-encoding.a -o %t2 2>&1 | \ # RUN: FileCheck --check-prefix=INVALID-DATA-ENC %s -# INVALID-DATA-ENC: invalid data encoding: test.o +# INVALID-DATA-ENC: Invalid data encoding: test.o # RUN: not ld.lld %t %p/Inputs/invalid-file-class.a -o %t2 2>&1 | \ # RUN: FileCheck --check-prefix=INVALID-FILE-CLASS %s -# INVALID-FILE-CLASS: invalid file class: test.o +# INVALID-FILE-CLASS: Invalid file class: test.o # RUN: not ld.lld %p/Inputs/invalid-symtab-sh_info.elf -o %t2 2>&1 | \ # RUN: FileCheck --check-prefix=INVALID-SYMTAB-SHINFO %s -# INVALID-SYMTAB-SHINFO: invalid sh_info in symbol table +# INVALID-SYMTAB-SHINFO: Invalid sh_info in symbol table # RUN: not ld.lld %p/Inputs/invalid-binding.elf -o %t2 2>&1 | \ # RUN: FileCheck --check-prefix=INVALID-BINDING %s # INVALID-BINDING: unexpected binding # RUN: not ld.lld %p/Inputs/invalid-section-index.elf -o %t2 2>&1 | \ -# RUN: FileCheck --check-prefix=INVALID-SECTION-INDEX-LLD %s -# INVALID-SECTION-INDEX-LLD: invalid section index +# RUN: FileCheck --check-prefix=INVALID-SECTION-INDEX %s +# INVALID-SECTION-INDEX: Invalid section index # RUN: not ld.lld %p/Inputs/invalid-shstrndx.so -o %t2 2>&1 | \ # RUN: FileCheck --check-prefix=INVALID-SECTION-INDEX %s -# INVALID-SECTION-INDEX: Invalid section index # RUN: not ld.lld %p/Inputs/invalid-shentsize-zero.elf -o %t2 2>&1 | \ # RUN: FileCheck --check-prefix=INVALID-SHENTSIZE-ZERO %s @@ -30,6 +29,6 @@ # RUN: not ld.lld %p/Inputs/invalid-multiple-eh-relocs.elf -o %t2 2>&1 | \ # RUN: FileCheck --check-prefix=INVALID-EH-RELOCS %s -# INVALID-EH-RELOCS: multiple relocation sections to .eh_frame are not supported +# INVALID-EH-RELOCS: Multiple relocation sections to .eh_frame are not supported .long foo diff --git a/lld/test/ELF/invalid-relocations.test b/lld/test/ELF/invalid-relocations.test index 1278ba5d51c..2b4a6c4a421 100644 --- a/lld/test/ELF/invalid-relocations.test +++ b/lld/test/ELF/invalid-relocations.test @@ -19,4 +19,4 @@ Symbols: Global: - Name: lulz -# CHECK: invalid relocated section index +# CHECK: Invalid relocated section index diff --git a/lld/test/ELF/libsearch.s b/lld/test/ELF/libsearch.s index 5f5aea79eef..c965b9ba91f 100644 --- a/lld/test/ELF/libsearch.s +++ b/lld/test/ELF/libsearch.s @@ -23,7 +23,7 @@ // Should fail if cannot find specified library (without -L switch) // RUN: not ld.lld -o %t3 %t.o -lls 2>&1 \ // RUN: | FileCheck --check-prefix=NOLIB %s -// NOLIB: unable to find library -lls +// NOLIB: Unable to find library -lls // Should use explicitly specified static library // Also ensure that we accept -L <arg> @@ -55,7 +55,7 @@ // RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=STATIC %s // RUN: not ld.lld -o %t3 %t.o -L%t.dir -Bstatic -lls2 2>&1 \ // RUN: | FileCheck --check-prefix=NOLIB2 %s -// NOLIB2: unable to find library -lls2 +// NOLIB2: Unable to find library -lls2 // -Bdynamic should restore default behaviour // RUN: ld.lld -o %t3 %t.o -L%t.dir -Bstatic -Bdynamic -lls diff --git a/lld/test/ELF/linkerscript-sections-padding.s b/lld/test/ELF/linkerscript-sections-padding.s index c6f43336664..eb2c9193ec9 100644 --- a/lld/test/ELF/linkerscript-sections-padding.s +++ b/lld/test/ELF/linkerscript-sections-padding.s @@ -23,13 +23,13 @@ # RUN: echo "SECTIONS { .mysec : { *(.mysec*) } =99 }" > %t.script # RUN: not ld.lld -o %t.out --script %t.script %t 2>&1 \ # RUN: | FileCheck --check-prefix=ERR %s -# ERR: filler should be a HEX value +# ERR: Filler should be a HEX value ## Filler should be a hex value (2): # RUN: echo "SECTIONS { .mysec : { *(.mysec*) } =0x99XX }" > %t.script # RUN: not ld.lld -o %t.out --script %t.script %t 2>&1 \ # RUN: | FileCheck --check-prefix=ERR2 %s -# ERR2: not a HEX value: XX +# ERR2: Not a HEX value: XX .section .mysec.1,"a" .align 16 diff --git a/lld/test/ELF/merge-string-error.s b/lld/test/ELF/merge-string-error.s index 235a3d7383c..58a624329ed 100644 --- a/lld/test/ELF/merge-string-error.s +++ b/lld/test/ELF/merge-string-error.s @@ -8,4 +8,4 @@ .text .long .rodata.str1.1 + 4 -// CHECK: entry is past the end of the section +// CHECK: Entry is past the end of the section diff --git a/lld/test/ELF/merge-string-no-null.s b/lld/test/ELF/merge-string-no-null.s index fd3f5073810..70d6bbbc32e 100644 --- a/lld/test/ELF/merge-string-no-null.s +++ b/lld/test/ELF/merge-string-no-null.s @@ -5,4 +5,4 @@ .section .rodata.str1.1,"aMS",@progbits,1 .ascii "abc" -// CHECK: string is not null terminated +// CHECK: String is not null terminated diff --git a/lld/test/ELF/mips-gnu-hash.s b/lld/test/ELF/mips-gnu-hash.s index 288d54043fc..4b11f213518 100644 --- a/lld/test/ELF/mips-gnu-hash.s +++ b/lld/test/ELF/mips-gnu-hash.s @@ -6,7 +6,7 @@ # RUN: llvm-mc -filetype=obj -triple=mipsel-unknown-linux %s -o %t-el.o # RUN: not ld.lld -shared -hash-style=gnu %t-el.o -o %t-el.so 2>&1 | FileCheck %s -# CHECK: the .gnu.hash section is not compatible with the MIPS target. +# CHECK: The .gnu.hash section is not compatible with the MIPS target. # REQUIRES: mips diff --git a/lld/test/ELF/ppc64-addr16-error.s b/lld/test/ELF/ppc64-addr16-error.s index 2bc8ef2ae4d..c731c6e9735 100644 --- a/lld/test/ELF/ppc64-addr16-error.s +++ b/lld/test/ELF/ppc64-addr16-error.s @@ -5,4 +5,4 @@ .short sym+65539 -// CHECK: relocation R_PPC64_ADDR16 out of range +// CHECK: Relocation R_PPC64_ADDR16 out of range diff --git a/lld/test/ELF/relocation-in-merge.s b/lld/test/ELF/relocation-in-merge.s index 9ce2e4f7915..820208a2caf 100644 --- a/lld/test/ELF/relocation-in-merge.s +++ b/lld/test/ELF/relocation-in-merge.s @@ -1,7 +1,7 @@ // REQUIRES: x86 // RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux // RUN: not ld.lld %t.o -o %t 2>&1 | FileCheck %s -// CHECK: relocations pointing to SHF_MERGE are not supported +// CHECK: Relocations pointing to SHF_MERGE are not supported .section .foo,"aM",@progbits,4 .long bar diff --git a/lld/test/ELF/relocation-past-merge-end.s b/lld/test/ELF/relocation-past-merge-end.s index 409b4e2ed2a..4dadea1e7ac 100644 --- a/lld/test/ELF/relocation-past-merge-end.s +++ b/lld/test/ELF/relocation-past-merge-end.s @@ -1,7 +1,7 @@ // REQUIRES: x86 // RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux // RUN: not ld.lld %t.o -o %t.so -shared 2>&1 | FileCheck %s -// CHECK: entry is past the end of the section +// CHECK: Entry is past the end of the section .long .foo + 1 .section .foo,"aM",@progbits,4 diff --git a/lld/test/ELF/splitstacks.s b/lld/test/ELF/splitstacks.s index 6506b48a251..809ed2b3a47 100644 --- a/lld/test/ELF/splitstacks.s +++ b/lld/test/ELF/splitstacks.s @@ -2,7 +2,7 @@ # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o # RUN: not ld.lld %t1.o -o %t 2>&1 | FileCheck %s -# CHECK: objects using splitstacks are not supported +# CHECK: Objects using splitstacks are not supported .globl _start _start: diff --git a/lld/test/ELF/sysroot.s b/lld/test/ELF/sysroot.s index 202b1050062..35154be125a 100644 --- a/lld/test/ELF/sysroot.s +++ b/lld/test/ELF/sysroot.s @@ -14,7 +14,7 @@ // We need to be sure that there is no suitable library in the /lib directory // RUN: not ld.lld -o %t/r %t/m.o -L/lib -l:libls.a 2>&1 \ // RUN: | FileCheck --check-prefix=NOLIB %s -// NOLIB: unable to find library -l:libls.a +// NOLIB: Unable to find library -l:libls.a // Should just remove the '=' symbol if --sysroot is not specified. // Case 1: relative path diff --git a/lld/test/ELF/writable-merge.s b/lld/test/ELF/writable-merge.s index 63755737d10..dd7b8538e57 100644 --- a/lld/test/ELF/writable-merge.s +++ b/lld/test/ELF/writable-merge.s @@ -1,6 +1,6 @@ // REQUIRES: x86 // RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux // RUN: not ld.lld %t.o -o %t 2>&1 | FileCheck %s -// CHECK: writable SHF_MERGE sections are not supported +// CHECK: Writable SHF_MERGE sections are not supported .section .foo,"awM",@progbits,4 |