diff options
author | Rui Ueyama <ruiu@google.com> | 2017-12-06 22:08:17 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2017-12-06 22:08:17 +0000 |
commit | de42122e33e5a159a660ae3443b227e5d9c517b4 (patch) | |
tree | c4e6e955405972d163300b532826f0d61414bb39 /lld | |
parent | 8abf53067ab526587d84731679a26b009b3ba57b (diff) |
Always evaluate the second argument for CHECK() lazily.
This patch is to rename check CHECK and make it a C macro, so that
we can evaluate the second argument lazily.
Differential Revision: https://reviews.llvm.org/D40915
Diffstat (limited to 'lld')
-rw-r--r-- | lld/COFF/Driver.cpp | 18 | ||||
-rw-r--r-- | lld/COFF/DriverUtils.cpp | 4 | ||||
-rw-r--r-- | lld/COFF/InputFiles.cpp | 10 | ||||
-rw-r--r-- | lld/COFF/Writer.cpp | 2 | ||||
-rw-r--r-- | lld/ELF/Driver.cpp | 10 | ||||
-rw-r--r-- | lld/ELF/InputFiles.cpp | 77 | ||||
-rw-r--r-- | lld/include/lld/Common/ErrorHandler.h | 26 | ||||
-rw-r--r-- | lld/wasm/InputFiles.cpp | 8 |
8 files changed, 76 insertions, 79 deletions
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 4d6d264ee0a..0855d627af4 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -131,7 +131,7 @@ void LinkerDriver::addBuffer(std::unique_ptr<MemoryBuffer> MB, case file_magic::archive: if (WholeArchive) { std::unique_ptr<Archive> File = - check(Archive::create(MBRef), + CHECK(Archive::create(MBRef), MBRef.getBufferIdentifier() + ": failed to parse archive"); for (MemoryBufferRef M : getArchiveMembers(File.get())) @@ -196,7 +196,7 @@ void LinkerDriver::enqueueArchiveMember(const Archive::Child &C, StringRef SymName, StringRef ParentName) { if (!C.getParent()->isThin()) { - MemoryBufferRef MB = check( + MemoryBufferRef MB = CHECK( C.getMemoryBufferRef(), "could not get the buffer for the member defining symbol " + SymName); enqueueTask([=]() { Driver->addArchiveBuffer(MB, SymName, ParentName); }); @@ -204,7 +204,7 @@ void LinkerDriver::enqueueArchiveMember(const Archive::Child &C, } auto Future = std::make_shared<std::future<MBErrPair>>(createFutureForFile( - check(C.getFullName(), + CHECK(C.getFullName(), "could not get the filename for the member defining symbol " + SymName))); enqueueTask([=]() { @@ -531,8 +531,8 @@ static void createImportLibrary(bool AsLib) { } static void parseModuleDefs(StringRef Path) { - std::unique_ptr<MemoryBuffer> MB = check( - MemoryBuffer::getFile(Path, -1, false, true), "could not open " + Path); + std::unique_ptr<MemoryBuffer> MB = CHECK( + MemoryBuffer::getFile(Path, -1, false, true), "could not open " + Path); COFFModuleDefinition M = check(parseCOFFModuleDefinition( MB->getMemBufferRef(), Config->Machine, Config->MinGW)); @@ -577,7 +577,7 @@ static bool needsRebuilding(MemoryBufferRef MB) { // The MSVC linker doesn't support thin archives, so if it's a thin // archive, we always need to rebuild it. std::unique_ptr<Archive> File = - check(Archive::create(MB), "Failed to read " + MB.getBufferIdentifier()); + CHECK(Archive::create(MB), "Failed to read " + MB.getBufferIdentifier()); if (File->isThin()) return true; @@ -598,7 +598,7 @@ static bool needsRebuilding(MemoryBufferRef MB) { // its path is returned. static Optional<std::string> filterBitcodeFiles(StringRef Path, std::vector<std::string> &TemporaryFiles) { - std::unique_ptr<MemoryBuffer> MB = check( + std::unique_ptr<MemoryBuffer> MB = CHECK( MemoryBuffer::getFile(Path, -1, false, true), "could not open " + Path); MemoryBufferRef MBRef = MB->getMemBufferRef(); file_magic Magic = identify_magic(MBRef.getBuffer()); @@ -611,7 +611,7 @@ filterBitcodeFiles(StringRef Path, std::vector<std::string> &TemporaryFiles) { return Path.str(); std::unique_ptr<Archive> File = - check(Archive::create(MBRef), + CHECK(Archive::create(MBRef), MBRef.getBufferIdentifier() + ": failed to parse archive"); std::vector<NewArchiveMember> New; @@ -957,7 +957,7 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) { // Handle /lldsavecachepolicy if (auto *Arg = Args.getLastArg(OPT_lldltocachepolicy)) - Config->LTOCachePolicy = check( + Config->LTOCachePolicy = CHECK( parseCachePruningPolicy(Arg->getValue()), Twine("/lldltocachepolicy: invalid cache policy: ") + Arg->getValue()); diff --git a/lld/COFF/DriverUtils.cpp b/lld/COFF/DriverUtils.cpp index 818a02466d4..27a52d1ba99 100644 --- a/lld/COFF/DriverUtils.cpp +++ b/lld/COFF/DriverUtils.cpp @@ -317,7 +317,7 @@ public: // is called (you cannot remove an opened file on Windows.) std::unique_ptr<MemoryBuffer> getMemoryBuffer() { // IsVolatileSize=true forces MemoryBuffer to not use mmap(). - return check(MemoryBuffer::getFile(Path, /*FileSize=*/-1, + return CHECK(MemoryBuffer::getFile(Path, /*FileSize=*/-1, /*RequiresNullTerminator=*/false, /*IsVolatileSize=*/true), "could not open " + Path); @@ -402,7 +402,7 @@ static std::string createManifestXmlWithExternalMt(StringRef DefaultXml) { E.add("/out:" + StringRef(User.Path)); E.run(); - return check(MemoryBuffer::getFile(User.Path), "could not open " + User.Path) + return CHECK(MemoryBuffer::getFile(User.Path), "could not open " + User.Path) .get() ->getBuffer(); } diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp index df72aa50aef..73fccdbd006 100644 --- a/lld/COFF/InputFiles.cpp +++ b/lld/COFF/InputFiles.cpp @@ -63,7 +63,7 @@ ArchiveFile::ArchiveFile(MemoryBufferRef M) : InputFile(ArchiveKind, M) {} void ArchiveFile::parse() { // Parse a MemoryBufferRef as an archive file. - File = check(Archive::create(MB), toString(this)); + File = CHECK(Archive::create(MB), toString(this)); // Read the symbol table to construct Lazy objects. for (const Archive::Symbol &Sym : File->symbols()) @@ -73,7 +73,7 @@ void ArchiveFile::parse() { // Returns a buffer pointing to a member file containing a given symbol. void ArchiveFile::addMember(const Archive::Symbol *Sym) { const Archive::Child &C = - check(Sym->getMember(), + CHECK(Sym->getMember(), "could not get the member for symbol " + Sym->getName()); // Return an empty buffer if we have already returned the same buffer. @@ -88,10 +88,10 @@ std::vector<MemoryBufferRef> getArchiveMembers(Archive *File) { Error Err = Error::success(); for (const ErrorOr<Archive::Child> &COrErr : File->children(Err)) { Archive::Child C = - check(COrErr, + CHECK(COrErr, File->getFileName() + ": could not get the child of the archive"); MemoryBufferRef MBRef = - check(C.getMemoryBufferRef(), + CHECK(C.getMemoryBufferRef(), File->getFileName() + ": could not get the buffer for a child of the archive"); V.push_back(MBRef); @@ -104,7 +104,7 @@ std::vector<MemoryBufferRef> getArchiveMembers(Archive *File) { void ObjFile::parse() { // Parse a memory buffer as a COFF file. - std::unique_ptr<Binary> Bin = check(createBinary(MB), toString(this)); + std::unique_ptr<Binary> Bin = CHECK(createBinary(MB), toString(this)); if (auto *Obj = dyn_cast<COFFObjectFile>(Bin.get())) { Bin.release(); diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index 1231cd48a5e..ec0f9847912 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -784,7 +784,7 @@ template <typename PEHeaderTy> void Writer::writeHeader() { } void Writer::openFile(StringRef Path) { - Buffer = check( + Buffer = CHECK( FileOutputBuffer::create(Path, FileSize, FileOutputBuffer::F_executable), "failed to open " + Path); } diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index ff1dd2251de..b859eff6e2f 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -136,7 +136,7 @@ static std::tuple<ELFKind, uint16_t, uint8_t> parseEmulation(StringRef Emul) { std::vector<std::pair<MemoryBufferRef, uint64_t>> static getArchiveMembers( MemoryBufferRef MB) { std::unique_ptr<Archive> File = - check(Archive::create(MB), + CHECK(Archive::create(MB), MB.getBufferIdentifier() + ": failed to parse archive"); std::vector<std::pair<MemoryBufferRef, uint64_t>> V; @@ -144,10 +144,10 @@ std::vector<std::pair<MemoryBufferRef, uint64_t>> static getArchiveMembers( bool AddToTar = File->isThin() && Tar; for (const ErrorOr<Archive::Child> &COrErr : File->children(Err)) { Archive::Child C = - check(COrErr, MB.getBufferIdentifier() + + CHECK(COrErr, MB.getBufferIdentifier() + ": could not get the child of the archive"); MemoryBufferRef MBRef = - check(C.getMemoryBufferRef(), + CHECK(C.getMemoryBufferRef(), MB.getBufferIdentifier() + ": could not get the buffer for a child of the archive"); if (AddToTar) @@ -192,7 +192,7 @@ void LinkerDriver::addFile(StringRef Path, bool WithLOption) { } std::unique_ptr<Archive> File = - check(Archive::create(MBRef), Path + ": failed to parse archive"); + CHECK(Archive::create(MBRef), Path + ": failed to parse archive"); // If an archive file has no symbol table, it is likely that a user // is attempting LTO and using a default ar command that doesn't @@ -651,7 +651,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { Config->Target1Rel = Args.hasFlag(OPT_target1_rel, OPT_target1_abs, false); Config->Target2 = getTarget2(Args); Config->ThinLTOCacheDir = Args.getLastArgValue(OPT_thinlto_cache_dir); - Config->ThinLTOCachePolicy = check( + Config->ThinLTOCachePolicy = CHECK( parseCachePruningPolicy(Args.getLastArgValue(OPT_thinlto_cache_policy)), "--thinlto-cache-policy: invalid cache policy"); Config->ThinLTOJobs = args::getInteger(Args, OPT_thinlto_jobs, -1u); diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 00b35e83d89..2eed28a0406 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -209,19 +209,19 @@ typename ELFT::SymRange ELFFileBase<ELFT>::getGlobalELFSyms() { template <class ELFT> uint32_t ELFFileBase<ELFT>::getSectionIndex(const Elf_Sym &Sym) const { - return checkLazy(getObj().getSectionIndex(&Sym, ELFSyms, SymtabSHNDX), - [=]() { return toString(this); }); + return CHECK(getObj().getSectionIndex(&Sym, ELFSyms, SymtabSHNDX), + toString(this)); } template <class ELFT> void ELFFileBase<ELFT>::initSymtab(ArrayRef<Elf_Shdr> Sections, const Elf_Shdr *Symtab) { FirstNonLocal = Symtab->sh_info; - ELFSyms = check(getObj().symbols(Symtab), toString(this)); + ELFSyms = CHECK(getObj().symbols(Symtab), toString(this)); if (FirstNonLocal == 0 || FirstNonLocal > ELFSyms.size()) fatal(toString(this) + ": invalid sh_info in symbol table"); - StringTable = check(getObj().getStringTableForSymtab(*Symtab, Sections), + StringTable = CHECK(getObj().getStringTableForSymtab(*Symtab, Sections), toString(this)); } @@ -253,15 +253,13 @@ StringRef ObjFile<ELFT>::getShtGroupSignature(ArrayRef<Elf_Shdr> Sections, // Group signatures are stored as symbol names in object files. // sh_info contains a symbol index, so we fetch a symbol and read its name. if (this->ELFSyms.empty()) - this->initSymtab(Sections, - checkLazy(object::getSection<ELFT>(Sections, Sec.sh_link), - [=]() { return toString(this); })); + this->initSymtab( + Sections, + CHECK(object::getSection<ELFT>(Sections, Sec.sh_link), toString(this))); - const Elf_Sym *Sym = - checkLazy(object::getSymbol<ELFT>(this->ELFSyms, Sec.sh_info), - [=]() { return toString(this); }); - StringRef Signature = checkLazy(Sym->getName(this->StringTable), - [=]() { return toString(this); }); + const Elf_Sym *Sym = CHECK( + object::getSymbol<ELFT>(this->ELFSyms, Sec.sh_info), toString(this)); + StringRef Signature = CHECK(Sym->getName(this->StringTable), toString(this)); // As a special case, if a symbol is a section symbol and has no name, // we use a section name as a signature. @@ -279,9 +277,8 @@ template <class ELFT> ArrayRef<typename ObjFile<ELFT>::Elf_Word> ObjFile<ELFT>::getShtGroupEntries(const Elf_Shdr &Sec) { const ELFFile<ELFT> &Obj = this->getObj(); - ArrayRef<Elf_Word> Entries = - checkLazy(Obj.template getSectionContentsAsArray<Elf_Word>(&Sec), - [=]() { return toString(this); }); + ArrayRef<Elf_Word> Entries = CHECK( + Obj.template getSectionContentsAsArray<Elf_Word>(&Sec), toString(this)); if (Entries.empty() || Entries[0] != GRP_COMDAT) fatal(toString(this) + ": unsupported SHT_GROUP format"); return Entries.slice(1); @@ -327,11 +324,11 @@ void ObjFile<ELFT>::initializeSections( const ELFFile<ELFT> &Obj = this->getObj(); ArrayRef<Elf_Shdr> ObjSections = - check(this->getObj().sections(), toString(this)); + CHECK(this->getObj().sections(), toString(this)); uint64_t Size = ObjSections.size(); this->Sections.resize(Size); this->SectionStringTable = - check(Obj.getSectionStringTable(ObjSections), toString(this)); + CHECK(Obj.getSectionStringTable(ObjSections), toString(this)); for (size_t I = 0, E = ObjSections.size(); I < E; I++) { if (this->Sections[I] == &InputSection::Discarded) @@ -378,7 +375,7 @@ void ObjFile<ELFT>::initializeSections( break; case SHT_SYMTAB_SHNDX: this->SymtabSHNDX = - check(Obj.getSHNDXTable(Sec, ObjSections), toString(this)); + CHECK(Obj.getSHNDXTable(Sec, ObjSections), toString(this)); break; case SHT_STRTAB: case SHT_NULL: @@ -523,14 +520,13 @@ InputSectionBase *ObjFile<ELFT>::createInputSection(const Elf_Shdr &Sec) { size_t NumRelocations; if (Sec.sh_type == SHT_RELA) { - ArrayRef<Elf_Rela> Rels = checkLazy(this->getObj().relas(&Sec), - [=]() { return toString(this); }); + ArrayRef<Elf_Rela> Rels = + CHECK(this->getObj().relas(&Sec), toString(this)); Target->FirstRelocation = Rels.begin(); NumRelocations = Rels.size(); Target->AreRelocsRela = true; } else { - ArrayRef<Elf_Rel> Rels = checkLazy(this->getObj().rels(&Sec), - [=]() { return toString(this); }); + ArrayRef<Elf_Rel> Rels = CHECK(this->getObj().rels(&Sec), toString(this)); Target->FirstRelocation = Rels.begin(); NumRelocations = Rels.size(); Target->AreRelocsRela = false; @@ -599,8 +595,8 @@ InputSectionBase *ObjFile<ELFT>::createInputSection(const Elf_Shdr &Sec) { template <class ELFT> StringRef ObjFile<ELFT>::getSectionName(const Elf_Shdr &Sec) { - return checkLazy(this->getObj().getSectionName(&Sec, SectionStringTable), - [=]() { return toString(this); }); + return CHECK(this->getObj().getSectionName(&Sec, SectionStringTable), + toString(this)); } template <class ELFT> void ObjFile<ELFT>::initializeSymbols() { @@ -632,7 +628,7 @@ template <class ELFT> Symbol *ObjFile<ELFT>::createSymbol(const Elf_Sym *Sym) { if (Binding == STB_LOCAL) { if (Sym->getType() == STT_FILE) - SourceFile = check(Sym->getName(this->StringTable), toString(this)); + SourceFile = CHECK(Sym->getName(this->StringTable), toString(this)); if (this->StringTable.size() <= Sym->st_name) fatal(toString(this) + ": invalid symbol name offset"); @@ -644,8 +640,7 @@ template <class ELFT> Symbol *ObjFile<ELFT>::createSymbol(const Elf_Sym *Sym) { return make<Defined>(this, Name, Binding, StOther, Type, Value, Size, Sec); } - StringRef Name = checkLazy(Sym->getName(this->StringTable), - [=]() { return toString(this); }); + StringRef Name = CHECK(Sym->getName(this->StringTable), toString(this)); switch (Sym->st_shndx) { case SHN_UNDEF: @@ -686,7 +681,7 @@ template <class ELFT> void ArchiveFile::parse() { std::pair<MemoryBufferRef, uint64_t> ArchiveFile::getMember(const Archive::Symbol *Sym) { Archive::Child C = - check(Sym->getMember(), toString(this) + + CHECK(Sym->getMember(), toString(this) + ": could not get the member for symbol " + Sym->getName()); @@ -694,13 +689,13 @@ ArchiveFile::getMember(const Archive::Symbol *Sym) { return {MemoryBufferRef(), 0}; MemoryBufferRef Ret = - check(C.getMemoryBufferRef(), + CHECK(C.getMemoryBufferRef(), toString(this) + ": could not get the buffer for the member defining symbol " + Sym->getName()); if (C.getParent()->isThin() && Tar) - Tar->append(relativeToRoot(check(C.getFullName(), toString(this))), + Tar->append(relativeToRoot(CHECK(C.getFullName(), toString(this))), Ret.getBuffer()); if (C.getParent()->isThin()) return {Ret, 0}; @@ -717,7 +712,7 @@ SharedFile<ELFT>::SharedFile(MemoryBufferRef M, StringRef DefaultSoName) template <class ELFT> void SharedFile<ELFT>::parseSoName() { const Elf_Shdr *DynamicSec = nullptr; const ELFFile<ELFT> Obj = this->getObj(); - ArrayRef<Elf_Shdr> Sections = check(Obj.sections(), toString(this)); + ArrayRef<Elf_Shdr> Sections = CHECK(Obj.sections(), toString(this)); // Search for .dynsym, .dynamic, .symtab, .gnu.version and .gnu.version_d. for (const Elf_Shdr &Sec : Sections) { @@ -732,7 +727,7 @@ template <class ELFT> void SharedFile<ELFT>::parseSoName() { break; case SHT_SYMTAB_SHNDX: this->SymtabSHNDX = - check(Obj.getSHNDXTable(Sec, Sections), toString(this)); + CHECK(Obj.getSHNDXTable(Sec, Sections), toString(this)); break; case SHT_GNU_versym: this->VersymSec = &Sec; @@ -750,7 +745,7 @@ template <class ELFT> void SharedFile<ELFT>::parseSoName() { if (!DynamicSec) return; ArrayRef<Elf_Dyn> Arr = - check(Obj.template getSectionContentsAsArray<Elf_Dyn>(DynamicSec), + CHECK(Obj.template getSectionContentsAsArray<Elf_Dyn>(DynamicSec), toString(this)); for (const Elf_Dyn &Dyn : Arr) { if (Dyn.d_tag == DT_SONAME) { @@ -811,7 +806,7 @@ template <class ELFT> void SharedFile<ELFT>::parseRest() { std::vector<const Elf_Verdef *> Verdefs = parseVerdefs(Versym); ArrayRef<Elf_Shdr> Sections = - check(this->getObj().sections(), toString(this)); + CHECK(this->getObj().sections(), toString(this)); // Add symbols to the symbol table. Elf_Sym_Range Syms = this->getGlobalELFSyms(); @@ -824,7 +819,7 @@ template <class ELFT> void SharedFile<ELFT>::parseRest() { bool Hidden = VersymIndex & VERSYM_HIDDEN; VersymIndex = VersymIndex & ~VERSYM_HIDDEN; - StringRef Name = check(Sym.getName(this->StringTable), toString(this)); + StringRef Name = CHECK(Sym.getName(this->StringTable), toString(this)); if (Sym.isUndefined()) { Undefs.push_back(Name); continue; @@ -921,7 +916,7 @@ BitcodeFile::BitcodeFile(MemoryBufferRef MB, StringRef ArchiveName, MemoryBufferRef MBRef(MB.getBuffer(), Saver.save(ArchiveName + MB.getBufferIdentifier() + utostr(OffsetInArchive))); - Obj = check(lto::InputFile::create(MBRef), toString(this)); + Obj = CHECK(lto::InputFile::create(MBRef), toString(this)); Triple T(Obj->getTargetTriple()); EKind = getBitcodeELFKind(T); @@ -1086,20 +1081,20 @@ template <class ELFT> std::vector<StringRef> LazyObjFile::getElfSymbols() { typedef typename ELFT::SymRange Elf_Sym_Range; ELFFile<ELFT> Obj = check(ELFFile<ELFT>::create(this->MB.getBuffer())); - ArrayRef<Elf_Shdr> Sections = check(Obj.sections(), toString(this)); + ArrayRef<Elf_Shdr> Sections = CHECK(Obj.sections(), toString(this)); for (const Elf_Shdr &Sec : Sections) { if (Sec.sh_type != SHT_SYMTAB) continue; - Elf_Sym_Range Syms = check(Obj.symbols(&Sec), toString(this)); + Elf_Sym_Range Syms = CHECK(Obj.symbols(&Sec), toString(this)); uint32_t FirstNonLocal = Sec.sh_info; StringRef StringTable = - check(Obj.getStringTableForSymtab(Sec, Sections), toString(this)); + CHECK(Obj.getStringTableForSymtab(Sec, Sections), toString(this)); std::vector<StringRef> V; for (const Elf_Sym &Sym : Syms.slice(FirstNonLocal)) if (Sym.st_shndx != SHN_UNDEF) - V.push_back(check(Sym.getName(StringTable), toString(this))); + V.push_back(CHECK(Sym.getName(StringTable), toString(this))); return V; } return {}; @@ -1107,7 +1102,7 @@ template <class ELFT> std::vector<StringRef> LazyObjFile::getElfSymbols() { std::vector<StringRef> LazyObjFile::getBitcodeSymbols() { std::unique_ptr<lto::InputFile> Obj = - check(lto::InputFile::create(this->MB), toString(this)); + CHECK(lto::InputFile::create(this->MB), toString(this)); std::vector<StringRef> V; for (const lto::InputFile::Symbol &Sym : Obj->symbols()) if (!Sym.isUndefined()) diff --git a/lld/include/lld/Common/ErrorHandler.h b/lld/include/lld/Common/ErrorHandler.h index f43d4520ea9..5f544b88155 100644 --- a/lld/include/lld/Common/ErrorHandler.h +++ b/lld/include/lld/Common/ErrorHandler.h @@ -74,7 +74,7 @@ inline uint64_t errorCount() { return errorHandler().ErrorCount; } LLVM_ATTRIBUTE_NORETURN void exitLld(int Val); -// check() functions are convenient functions to strip errors +// check functions are convenient functions to strip errors // from error-or-value objects. template <class T> T check(ErrorOr<T> E) { if (auto EC = E.getError()) @@ -88,25 +88,27 @@ template <class T> T check(Expected<T> E) { return std::move(*E); } -template <class T> T check(ErrorOr<T> E, const Twine &Prefix) { +template <class T> +T check2(ErrorOr<T> E, llvm::function_ref<std::string()> Prefix) { if (auto EC = E.getError()) - fatal(Prefix + ": " + EC.message()); - return std::move(*E); -} - -template <class T> T check(Expected<T> E, const Twine &Prefix) { - if (!E) - fatal(Prefix + ": " + toString(E.takeError())); + fatal(Prefix() + ": " + EC.message()); return std::move(*E); } -// A lazy variant that only allocates error messages when there is an error. template <class T> -T checkLazy(Expected<T> E, llvm::function_ref<std::string()> getPrefix) { +T check2(Expected<T> E, llvm::function_ref<std::string()> Prefix) { if (!E) - fatal(getPrefix() + ": " + toString(E.takeError())); + fatal(Prefix() + ": " + toString(E.takeError())); return std::move(*E); } + +inline std::string checkToString(const Twine &S) { return S.str(); } +inline std::string checkToString(std::string S) { return S; } +inline std::string checkToString(const char *S) { return S; } + +// To evaluate the second argument lazily, we use C macro. +#define CHECK(E, S) check2(E, [&] { return checkToString(S); }) + } // namespace lld #endif diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp index c259bdb8d4f..90bca13c86c 100644 --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -104,7 +104,7 @@ uint32_t ObjFile::relocateGlobalIndex(uint32_t Original) const { void ObjFile::parse() { // Parse a memory buffer as a wasm file. DEBUG(dbgs() << "Parsing object: " << toString(this) << "\n"); - std::unique_ptr<Binary> Bin = check(createBinary(MB), toString(this)); + std::unique_ptr<Binary> Bin = CHECK(createBinary(MB), toString(this)); auto *Obj = dyn_cast<WasmObjectFile>(Bin.get()); if (!Obj) @@ -223,7 +223,7 @@ Symbol *ObjFile::createDefined(const WasmSymbol &Sym, void ArchiveFile::parse() { // Parse a MemoryBufferRef as an archive file. DEBUG(dbgs() << "Parsing library: " << toString(this) << "\n"); - File = check(Archive::create(MB), toString(this)); + File = CHECK(Archive::create(MB), toString(this)); // Read the symbol table to construct Lazy symbols. int Count = 0; @@ -236,7 +236,7 @@ void ArchiveFile::parse() { void ArchiveFile::addMember(const Archive::Symbol *Sym) { const Archive::Child &C = - check(Sym->getMember(), + CHECK(Sym->getMember(), "could not get the member for symbol " + Sym->getName()); // Don't try to load the same member twice (this can happen when members @@ -248,7 +248,7 @@ void ArchiveFile::addMember(const Archive::Symbol *Sym) { DEBUG(dbgs() << "from archive: " << toString(this) << "\n"); MemoryBufferRef MB = - check(C.getMemoryBufferRef(), + CHECK(C.getMemoryBufferRef(), "could not get the buffer for the member defining symbol " + Sym->getName()); |