Skip to content

Commit

Permalink
[lld-macho] Support parsing of bitcode within archives
Browse files Browse the repository at this point in the history
Also error out if we find anything other than an object or bitcode file
in the archive.

Note that we were previously inserting the symbols and sections of the
unpacked ObjFile into the containing ArchiveFile. This was actually
unnecessary -- we can just insert the ObjectFile (or BitcodeFile) into
the `inputFiles` vector. This is the approach taken by LLD-ELF.

Reviewed By: thakis

Differential Revision: https://reviews.llvm.org/D92539
  • Loading branch information
int3 committed Dec 8, 2020
1 parent 7b007ac commit 78976bf
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 5 deletions.
21 changes: 16 additions & 5 deletions lld/MachO/InputFiles.cpp
Expand Up @@ -631,15 +631,26 @@ void ArchiveFile::fetch(const object::Archive::Symbol &sym) {
// to it later.
const object::Archive::Symbol sym_copy = sym;

auto file = make<ObjFile>(mb, modTime, getName());
InputFile *file;
switch (identify_magic(mb.getBuffer())) {
case file_magic::macho_object:
file = make<ObjFile>(mb, modTime, getName());
break;
case file_magic::bitcode:
file = make<BitcodeFile>(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)
Expand Down
13 changes: 13 additions & 0 deletions 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
}
20 changes: 20 additions & 0 deletions 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
28 changes: 28 additions & 0 deletions 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

0 comments on commit 78976bf

Please sign in to comment.