From: Saleem Abdulrasool Date: Wed, 3 Jun 2020 19:20:35 +0000 (+0000) Subject: lld: add basic static library search X-Git-Tag: llvmorg-12-init~4206 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=116e38fd8b89fb20279cbf7edb4a49a7ab5c7764;p=platform%2Fupstream%2Fllvm.git lld: add basic static library search This is a very basic static library search addition. This is the pre-Xcode4 behaviour of searching all paths for the shared version before searching for the static version of the library. This behaviour is supposed to be inverted with `-search_paths_first` being the default. This adds the library search with the intention of providing the setup to merge the paths into one path and making it controllable by `OPT_search_paths_first`. --- diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp index c653e86..723c62c 100644 --- a/lld/MachO/Driver.cpp +++ b/lld/MachO/Driver.cpp @@ -80,7 +80,15 @@ static Optional findDylib(StringRef name) { if (fs::exists(path)) return path; } - error("library not found for -l" + name); + return None; +} + +static Optional findArchive(StringRef name) { + for (StringRef dir : config->searchPaths) { + std::string path = (dir + "/lib" + name + ".a").str(); + if (fs::exists(path)) + return path; + } return None; } @@ -286,10 +294,16 @@ bool macho::link(llvm::ArrayRef argsArr, bool canExitEarly, case OPT_INPUT: addFile(arg->getValue()); break; - case OPT_l: - if (Optional path = findDylib(arg->getValue())) + case OPT_l: { + StringRef name = arg->getValue(); + if (Optional path = findDylib(name)) + addFile(*path); + else if (Optional path = findArchive(name)) addFile(*path); + else + error("library not found for -l" + name); break; + } case OPT_platform_version: { handlePlatformVersion(it, end); // Can advance "it". break; diff --git a/lld/test/MachO/static-link.s b/lld/test/MachO/static-link.s new file mode 100644 index 0000000..f826080 --- /dev/null +++ b/lld/test/MachO/static-link.s @@ -0,0 +1,30 @@ +# REQUIRES: x86 + +# RUN: mkdir -p %t +# +# RUN: llvm-mc -filetype obj -triple x86_64-apple-darwin %p/Inputs/libgoodbye.s -o %t/goodbye.o +# RUN: llvm-ar --format=darwin crs %t/libgoodbye.a %t/goodbye.o +# +# RUN: llvm-mc -filetype obj -triple x86_64-apple-darwin %s -o %t/test.o +# RUN: lld -flavor darwinnew -o %t/test -Z -L%t -lgoodbye %t/test.o +# +# RUN: llvm-objdump --syms -d -r %t/test | FileCheck %s + +# CHECK: SYMBOL TABLE: +# CHECK: {{0+}}[[ADDR:[0-9a-f]+]] g O __TEXT,__cstring _goodbye_world + +# CHECK: Disassembly of section __TEXT,__text +# CHECK-LABEL: <_main>: +# CHECK: leaq {{.*}}(%rip), %rsi # [[ADDR]] <_goodbye_world> + +.section __TEXT,__text +.global _main + +_main: + movl $0x2000004, %eax # write() + mov $1, %rdi # stdout + leaq _goodbye_world(%rip), %rsi + mov $15, %rdx # length + syscall + mov $0, %rax + ret