summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Kledzik <kledzik@apple.com>2014-11-06 19:33:57 +0000
committerNick Kledzik <kledzik@apple.com>2014-11-06 19:33:57 +0000
commit24f504001d937737c0403c57fbd1c454645a23f7 (patch)
tree644737acdbfb132a9604bf3268ba60d9cdba49f5
parent4c508df925dbb41b19317d4bb8871f6944114f0c (diff)
downloadbcm5719-llvm-24f504001d937737c0403c57fbd1c454645a23f7.tar.gz
bcm5719-llvm-24f504001d937737c0403c57fbd1c454645a23f7.zip
[mach-o] Add support for -force_load option
The darwin linker has two ways to force all members of an archive to be loaded. The -all_load option applies to all static libraries. The -force_load takes a path to a library and just that library's members are force loaded. llvm-svn: 221477
-rw-r--r--lld/lib/Driver/DarwinLdDriver.cpp3
-rw-r--r--lld/lib/Driver/DarwinLdOptions.td4
-rw-r--r--lld/test/mach-o/force_load-x86_64.yaml38
3 files changed, 45 insertions, 0 deletions
diff --git a/lld/lib/Driver/DarwinLdDriver.cpp b/lld/lib/Driver/DarwinLdDriver.cpp
index 645a3efb650..723b6509395 100644
--- a/lld/lib/Driver/DarwinLdDriver.cpp
+++ b/lld/lib/Driver/DarwinLdDriver.cpp
@@ -658,6 +658,9 @@ bool DarwinLdDriver::parse(int argc, const char *argv[],
case OPT_upward_library:
addFile(arg->getValue(), inputGraph, ctx, false, true);
break;
+ case OPT_force_load:
+ addFile(arg->getValue(), inputGraph, ctx, true, false);
+ break;
case OPT_l:
case OPT_upward_l:
upward = (arg->getOption().getID() == OPT_upward_l);
diff --git a/lld/lib/Driver/DarwinLdOptions.td b/lld/lib/Driver/DarwinLdOptions.td
index d819c03aac0..eefb2c7b92d 100644
--- a/lld/lib/Driver/DarwinLdOptions.td
+++ b/lld/lib/Driver/DarwinLdOptions.td
@@ -107,6 +107,10 @@ def Z : Flag<["-"], "Z">,
def all_load : Flag<["-"], "all_load">,
HelpText<"Forces all members of all static libraries to be loaded">,
Group<grp_libs>;
+def force_load : Separate<["-"], "force_load">,
+ MetaVarName<"<library-path>">,
+ HelpText<"Forces all members of specified static libraries to be loaded">,
+ Group<grp_libs>;
def syslibroot : Separate<["-"], "syslibroot">, MetaVarName<"<dir>">,
HelpText<"Add path to SDK to all absolute library search paths">,
Group<grp_libs>;
diff --git a/lld/test/mach-o/force_load-x86_64.yaml b/lld/test/mach-o/force_load-x86_64.yaml
new file mode 100644
index 00000000000..35905effd2c
--- /dev/null
+++ b/lld/test/mach-o/force_load-x86_64.yaml
@@ -0,0 +1,38 @@
+# RUN: lld -flavor darwin -arch x86_64 %s %p/Inputs/libSystem.yaml \
+# RUN: %p/Inputs/libfoo.a %p/Inputs/libbar.a -o %t1
+# RUN: llvm-nm -m -n %t1 | FileCheck %s
+#
+# RUN: lld -flavor darwin -arch x86_64 %s %p/Inputs/libSystem.yaml \
+# RUN: -force_load %p/Inputs/libfoo.a %p/Inputs/libbar.a -o %t2
+# RUN: llvm-nm -m -n %t2 | FileCheck --check-prefix=CHECKF %s
+#
+# Test that -force_load causes members of static library to be loaded.
+#
+
+--- !mach-o
+arch: x86_64
+file-type: MH_OBJECT
+flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
+has-UUID: false
+OS: unknown
+sections:
+ - segment: __TEXT
+ section: __text
+ type: S_REGULAR
+ attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+ address: 0x0000000000000000
+ content: [ 0xC3 ]
+global-symbols:
+ - name: _main
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ value: 0x0000000000000000
+...
+
+# CHECK: {{[0-9a-f]+}} (__TEXT,__text) external _main
+# CHECK-NOT: {{[0-9a-f]+}} (__TEXT,__text) external _main
+
+# CHECKF: {{[0-9a-f]+}} (__TEXT,__text) external _main
+# CHECKF: {{[0-9a-f]+}} (__TEXT,__text) external _foo
+# CHECKF-NOT: {{[0-9a-f]+}} (__TEXT,__text) external _bar
OpenPOWER on IntegriCloud