diff --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp --- a/lld/MachO/InputFiles.cpp +++ b/lld/MachO/InputFiles.cpp @@ -631,15 +631,26 @@ // to it later. const object::Archive::Symbol sym_copy = sym; - auto file = make(mb, modTime, getName()); + InputFile *file; + switch (identify_magic(mb.getBuffer())) { + case file_magic::macho_object: + file = make(mb, modTime, getName()); + break; + case file_magic::bitcode: + file = make(mb); + break; + default: + StringRef bufname = + CHECK(c.getName(), toString(this) + ": could not get buffer name"); + error(toString(this) + ": archive member " + bufname + + " has unhandled file type"); + return; + } + inputFiles.push_back(file); // ld64 doesn't demangle sym here even with -demangle. Match that, so // intentionally no call to toMachOString() here. printArchiveMemberLoad(sym_copy.getName(), file); - - symbols.insert(symbols.end(), file->symbols.begin(), file->symbols.end()); - subsections.insert(subsections.end(), file->subsections.begin(), - file->subsections.end()); } BitcodeFile::BitcodeFile(MemoryBufferRef mbref) diff --git a/lld/test/MachO/bitcode-nodatalayout.ll b/lld/test/MachO/bitcode-nodatalayout.ll new file mode 100644 --- /dev/null +++ b/lld/test/MachO/bitcode-nodatalayout.ll @@ -0,0 +1,13 @@ +; REQUIRES: x86 +; RUN: llvm-as %s -o %t.o +; RUN: not %lld %t.o -o /dev/null 2>&1 | FileCheck %s + +; CHECK: error: input module has no datalayout + +; This bitcode file has no datalayout. +; Check that we error out producing a reasonable diagnostic. +target triple = "x86_64-apple-macosx10.15.0" + +define void @_start() { + ret void +} diff --git a/lld/test/MachO/invalid/bad-archive-member.s b/lld/test/MachO/invalid/bad-archive-member.s new file mode 100644 --- /dev/null +++ b/lld/test/MachO/invalid/bad-archive-member.s @@ -0,0 +1,20 @@ +# REQUIRES: x86 +# RUN: split-file %s %t +# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/foo.s -o %t/foo.o +# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o +# RUN: %lld -dylib -lSystem %t/foo.o -o %t/foo.dylib +# RUN: rm -f %t/foo.a +# RUN: llvm-ar rcs %t/foo.a %t/foo.dylib +# RUN: not %lld %t/test.o %t/foo.a -o /dev/null 2>&1 | FileCheck %s -DFILE=%t/foo.a +# CHECK: error: [[FILE]]: archive member foo.dylib has unhandled file type + +#--- foo.s +.globl _foo +_foo: + ret + +#--- test.s +.globl _main +_main: + callq _foo + ret diff --git a/lld/test/MachO/lto-archive.ll b/lld/test/MachO/lto-archive.ll new file mode 100644 --- /dev/null +++ b/lld/test/MachO/lto-archive.ll @@ -0,0 +1,28 @@ +; REQUIRES: x86 +; RUN: split-file %s %t +; RUN: llvm-as %t/foo.ll -o %t/foo.o +; RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o +; RUN: rm -f %t/foo.a +; RUN: llvm-ar rcs %t/foo.a %t/foo.o +; RUN: %lld -save-temps -lSystem %t/test.o %t/foo.a -o %t/test +; RUN: llvm-objdump -d --macho --no-show-raw-insn %t/test | FileCheck %s + +; CHECK: _main: +; CHECK-NEXT: callq _foo +; CHECK-NEXT: retq + +;--- foo.ll + +target triple = "x86_64-apple-macosx10.15.0" +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" + +define void @foo() { + ret void +} + +;--- test.s + +.globl _main +_main: + callq _foo + ret