[lld] 116e38f - lld: add basic static library search

Saleem Abdulrasool via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 3 16:32:45 PDT 2020


Author: Saleem Abdulrasool
Date: 2020-06-03T23:32:05Z
New Revision: 116e38fd8b89fb20279cbf7edb4a49a7ab5c7764

URL: https://github.com/llvm/llvm-project/commit/116e38fd8b89fb20279cbf7edb4a49a7ab5c7764
DIFF: https://github.com/llvm/llvm-project/commit/116e38fd8b89fb20279cbf7edb4a49a7ab5c7764.diff

LOG: 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`.

Added: 
    lld/test/MachO/static-link.s

Modified: 
    lld/MachO/Driver.cpp

Removed: 
    


################################################################################
diff  --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp
index c653e8612957..723c62c39185 100644
--- a/lld/MachO/Driver.cpp
+++ b/lld/MachO/Driver.cpp
@@ -80,7 +80,15 @@ static Optional<std::string> findDylib(StringRef name) {
     if (fs::exists(path))
       return path;
   }
-  error("library not found for -l" + name);
+  return None;
+}
+
+static Optional<std::string> 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<const char *> argsArr, bool canExitEarly,
     case OPT_INPUT:
       addFile(arg->getValue());
       break;
-    case OPT_l:
-      if (Optional<std::string> path = findDylib(arg->getValue()))
+    case OPT_l: {
+      StringRef name = arg->getValue();
+      if (Optional<std::string> path = findDylib(name))
+        addFile(*path);
+      else if (Optional<std::string> 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 000000000000..f8260807df6f
--- /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


        


More information about the llvm-commits mailing list