aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp')
-rw-r--r--llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp44
1 files changed, 22 insertions, 22 deletions
diff --git a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
index cd39428..f3904b9 100644
--- a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
+++ b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
@@ -139,35 +139,28 @@ static void doList(opt::InputArgList& Args) {
fatalOpenError(std::move(Err), B->getBufferIdentifier());
}
-static COFF::MachineTypes getCOFFFileMachine(MemoryBufferRef MB) {
+static Expected<COFF::MachineTypes> getCOFFFileMachine(MemoryBufferRef MB) {
std::error_code EC;
auto Obj = object::COFFObjectFile::create(MB);
- if (!Obj) {
- llvm::errs() << MB.getBufferIdentifier()
- << ": failed to open: " << Obj.takeError() << '\n';
- exit(1);
- }
+ if (!Obj)
+ return Obj.takeError();
uint16_t Machine = (*Obj)->getMachine();
if (Machine != COFF::IMAGE_FILE_MACHINE_I386 &&
Machine != COFF::IMAGE_FILE_MACHINE_AMD64 &&
Machine != COFF::IMAGE_FILE_MACHINE_ARMNT &&
Machine != COFF::IMAGE_FILE_MACHINE_ARM64) {
- llvm::errs() << MB.getBufferIdentifier() << ": unknown machine: " << Machine
- << '\n';
- exit(1);
+ return createStringError(inconvertibleErrorCode(),
+ "unknown machine: " + std::to_string(Machine));
}
return static_cast<COFF::MachineTypes>(Machine);
}
-static COFF::MachineTypes getBitcodeFileMachine(MemoryBufferRef MB) {
+static Expected<COFF::MachineTypes> getBitcodeFileMachine(MemoryBufferRef MB) {
Expected<std::string> TripleStr = getBitcodeTargetTriple(MB);
- if (!TripleStr) {
- llvm::errs() << MB.getBufferIdentifier()
- << ": failed to get target triple from bitcode\n";
- exit(1);
- }
+ if (!TripleStr)
+ return TripleStr.takeError();
switch (Triple(*TripleStr).getArch()) {
case Triple::x86:
@@ -179,9 +172,8 @@ static COFF::MachineTypes getBitcodeFileMachine(MemoryBufferRef MB) {
case Triple::aarch64:
return COFF::IMAGE_FILE_MACHINE_ARM64;
default:
- llvm::errs() << MB.getBufferIdentifier()
- << ": unknown arch in target triple " << *TripleStr << '\n';
- exit(1);
+ return createStringError(inconvertibleErrorCode(),
+ "unknown arch in target triple: " + *TripleStr);
}
}
@@ -201,7 +193,7 @@ static void appendFile(std::vector<NewArchiveMember> &Members,
// If a user attempts to add an archive to another archive, llvm-lib doesn't
// handle the first archive file as a single file. Instead, it extracts all
- // members from the archive and add them to the second archive. This beahvior
+ // members from the archive and add them to the second archive. This behavior
// is for compatibility with Microsoft's lib command.
if (Magic == file_magic::archive) {
Error Err = Error::success();
@@ -233,9 +225,17 @@ static void appendFile(std::vector<NewArchiveMember> &Members,
// in writeArchive() which needs to support many tools, can't assume the
// input is COFF, and doesn't have a good way to report errors.
if (Magic == file_magic::coff_object || Magic == file_magic::bitcode) {
- COFF::MachineTypes FileMachine = (Magic == file_magic::coff_object)
- ? getCOFFFileMachine(MB)
- : getBitcodeFileMachine(MB);
+ Expected<COFF::MachineTypes> MaybeFileMachine =
+ (Magic == file_magic::coff_object) ? getCOFFFileMachine(MB)
+ : getBitcodeFileMachine(MB);
+ if (!MaybeFileMachine) {
+ handleAllErrors(MaybeFileMachine.takeError(), [&](const ErrorInfoBase &EIB) {
+ llvm::errs() << MB.getBufferIdentifier() << ": " << EIB.message()
+ << "\n";
+ });
+ exit(1);
+ }
+ COFF::MachineTypes FileMachine = *MaybeFileMachine;
// FIXME: Once lld-link rejects multiple resource .obj files:
// Call convertResToCOFF() on .res files and add the resulting