Skip to content

Commit 3edf63c

Browse files
committed
[lld-link] better error message when failing to open archive members
Summary: The message "could not get the buffer for the member defining symbol" now also contains the name of the archive and the name of the archive member that we tried to open. Reviewers: ruiu Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D57974 llvm-svn: 353572
1 parent 7f98e3c commit 3edf63c

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

lld/COFF/Driver.cpp

+19-9
Original file line numberDiff line numberDiff line change
@@ -224,23 +224,33 @@ void LinkerDriver::addArchiveBuffer(MemoryBufferRef MB, StringRef SymName,
224224
void LinkerDriver::enqueueArchiveMember(const Archive::Child &C,
225225
StringRef SymName,
226226
StringRef ParentName) {
227+
228+
auto ReportBufferError = [=](Error &&E,
229+
StringRef ChildName) {
230+
fatal("could not get the buffer for the member defining symbol " +
231+
SymName + ": " + ParentName + "(" + ChildName + "): " +
232+
toString(std::move(E)));
233+
};
234+
227235
if (!C.getParent()->isThin()) {
228-
MemoryBufferRef MB = CHECK(
229-
C.getMemoryBufferRef(),
230-
"could not get the buffer for the member defining symbol " + SymName);
236+
Expected<MemoryBufferRef> MBOrErr = C.getMemoryBufferRef();
237+
if (!MBOrErr)
238+
ReportBufferError(MBOrErr.takeError(), check(C.getFullName()));
239+
MemoryBufferRef MB = MBOrErr.get();
231240
enqueueTask([=]() { Driver->addArchiveBuffer(MB, SymName, ParentName); });
232241
return;
233242
}
234243

235-
auto Future = std::make_shared<std::future<MBErrPair>>(createFutureForFile(
236-
CHECK(C.getFullName(),
237-
"could not get the filename for the member defining symbol " +
238-
SymName)));
244+
std::string ChildName = CHECK(
245+
C.getFullName(),
246+
"could not get the filename for the member defining symbol " +
247+
SymName);
248+
auto Future = std::make_shared<std::future<MBErrPair>>(
249+
createFutureForFile(ChildName));
239250
enqueueTask([=]() {
240251
auto MBOrErr = Future->get();
241252
if (MBOrErr.second)
242-
fatal("could not get the buffer for the member defining " + SymName +
243-
": " + MBOrErr.second.message());
253+
ReportBufferError(errorCodeToError(MBOrErr.second), ChildName);
244254
Driver->addArchiveBuffer(takeBuffer(std::move(MBOrErr.first)), SymName,
245255
ParentName);
246256
});

0 commit comments

Comments
 (0)