[lld] 78ce89b - [lld/mac] Implement -reexport_framework, -reexport_library, -reexport-l
Nico Weber via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 2 03:37:42 PDT 2021
Author: Nico Weber
Date: 2021-06-02T06:37:34-04:00
New Revision: 78ce89bb1e8049e81aea3e374feab4f5900d257c
URL: https://github.com/llvm/llvm-project/commit/78ce89bb1e8049e81aea3e374feab4f5900d257c
DIFF: https://github.com/llvm/llvm-project/commit/78ce89bb1e8049e81aea3e374feab4f5900d257c.diff
LOG: [lld/mac] Implement -reexport_framework, -reexport_library, -reexport-l
These are slightly easier-to-use versions of -sub_library and -sub_umbrella.
Differential Revision: https://reviews.llvm.org/D103497
Added:
Modified:
lld/MachO/Driver.cpp
lld/MachO/Options.td
lld/test/MachO/sub-library.s
Removed:
################################################################################
diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp
index 113c66910fba..5c116e1e00df 100644
--- a/lld/MachO/Driver.cpp
+++ b/lld/MachO/Driver.cpp
@@ -324,24 +324,34 @@ static InputFile *addFile(StringRef path, bool forceLoadArchive,
return newFile;
}
-static void addLibrary(StringRef name, bool isWeak, bool isExplicit = true) {
+static void addLibrary(StringRef name, bool isWeak, bool isReexport,
+ bool isExplicit) {
if (Optional<StringRef> path = findLibrary(name)) {
if (auto *dylibFile = dyn_cast_or_null<DylibFile>(addFile(*path, false))) {
dylibFile->explicitlyLinked = isExplicit;
if (isWeak)
dylibFile->forceWeakImport = true;
+ if (isReexport) {
+ config->hasReexports = true;
+ dylibFile->reexport = true;
+ }
}
return;
}
error("library not found for -l" + name);
}
-static void addFramework(StringRef name, bool isWeak, bool isExplicit = true) {
+static void addFramework(StringRef name, bool isWeak, bool isReexport,
+ bool isExplicit) {
if (Optional<std::string> path = findFramework(name)) {
if (auto *dylibFile = dyn_cast_or_null<DylibFile>(addFile(*path, false))) {
dylibFile->explicitlyLinked = isExplicit;
if (isWeak)
dylibFile->forceWeakImport = true;
+ if (isReexport) {
+ config->hasReexports = true;
+ dylibFile->reexport = true;
+ }
}
return;
}
@@ -371,10 +381,12 @@ void macho::parseLCLinkerOption(InputFile *f, unsigned argc, StringRef data) {
for (const Arg *arg : args) {
switch (arg->getOption().getID()) {
case OPT_l:
- addLibrary(arg->getValue(), /*isWeak=*/false, /*isExplicit=*/false);
+ addLibrary(arg->getValue(), /*isWeak=*/false, /*isReexport=*/false,
+ /*isExplicit=*/false);
break;
case OPT_framework:
- addFramework(arg->getValue(), /*isWeak=*/false, /*isExplicit=*/false);
+ addFramework(arg->getValue(), /*isWeak=*/false, /*isReexport=*/false,
+ /*isExplicit=*/false);
break;
default:
error(arg->getSpelling() + " is not allowed in LC_LINKER_OPTION");
@@ -866,6 +878,13 @@ void createFiles(const InputArgList &args) {
case OPT_INPUT:
addFile(rerootPath(arg->getValue()), false);
break;
+ case OPT_reexport_library:
+ if (auto *dylibFile = dyn_cast_or_null<DylibFile>(
+ addFile(rerootPath(arg->getValue()), false))) {
+ config->hasReexports = true;
+ dylibFile->reexport = true;
+ }
+ break;
case OPT_weak_library:
if (auto *dylibFile = dyn_cast_or_null<DylibFile>(
addFile(rerootPath(arg->getValue()), false)))
@@ -878,12 +897,16 @@ void createFiles(const InputArgList &args) {
addFile(rerootPath(arg->getValue()), true);
break;
case OPT_l:
+ case OPT_reexport_l:
case OPT_weak_l:
- addLibrary(arg->getValue(), opt.getID() == OPT_weak_l);
+ addLibrary(arg->getValue(), opt.getID() == OPT_weak_l,
+ opt.getID() == OPT_reexport_l, /*isExplicit=*/true);
break;
case OPT_framework:
+ case OPT_reexport_framework:
case OPT_weak_framework:
- addFramework(arg->getValue(), opt.getID() == OPT_weak_framework);
+ addFramework(arg->getValue(), opt.getID() == OPT_weak_framework,
+ opt.getID() == OPT_reexport_framework, /*isExplicit=*/true);
break;
default:
break;
diff --git a/lld/MachO/Options.td b/lld/MachO/Options.td
index fffdeb4af69d..cc5ab09ef550 100644
--- a/lld/MachO/Options.td
+++ b/lld/MachO/Options.td
@@ -117,12 +117,10 @@ def weak_library : Separate<["-"], "weak_library">,
def reexport_l : Joined<["-"], "reexport-l">,
MetaVarName<"<name>">,
HelpText<"Like -l<name>, but export all symbols of <name> from newly created library">,
- Flags<[HelpHidden]>,
Group<grp_libs>;
def reexport_library : Separate<["-"], "reexport_library">,
MetaVarName<"<path>">,
HelpText<"Like bare <path>, but export all symbols of <path> from newly created library">,
- Flags<[HelpHidden]>,
Group<grp_libs>;
def upward_l : Joined<["-"], "upward-l">,
MetaVarName<"<name>">,
@@ -162,7 +160,6 @@ def weak_framework : Separate<["-"], "weak_framework">,
def reexport_framework : Separate<["-"], "reexport_framework">,
MetaVarName<"<name>">,
HelpText<"Like -framework <name>, but export all symbols of <name> from the newly created library">,
- Flags<[HelpHidden]>,
Group<grp_libs>;
def upward_framework : Separate<["-"], "upward_framework">,
MetaVarName<"<name>">,
diff --git a/lld/test/MachO/sub-library.s b/lld/test/MachO/sub-library.s
index 322ce90bb216..5132160d8ee8 100644
--- a/lld/test/MachO/sub-library.s
+++ b/lld/test/MachO/sub-library.s
@@ -18,14 +18,23 @@
## Check that they have the appropriate LC_REEXPORT_DYLIB commands, and that
## NO_REEXPORTED_DYLIBS is (un)set as appropriate.
-# RUN: llvm-objdump --macho --all-headers %t/libhello.dylib | FileCheck %s \
-# RUN: --check-prefix=HELLO-HEADERS
+# RUN: llvm-otool -hv %t/libhello.dylib | \
+# RUN: FileCheck --check-prefix=HELLO-HEADERS %s
# HELLO-HEADERS: NO_REEXPORTED_DYLIBS
-# RUN: llvm-objdump --macho --all-headers %t/libgoodbye.dylib | FileCheck %s \
+# RUN: llvm-otool -l %t/libgoodbye.dylib | FileCheck %s \
# RUN: --check-prefix=REEXPORT-HEADERS -DPATH=%t/libhello.dylib
-# RUN: llvm-objdump --macho --all-headers %t/libsuper.dylib | FileCheck %s \
+# RUN: llvm-otool -l %t/libsuper.dylib | FileCheck %s \
+# RUN: --check-prefix=REEXPORT-HEADERS -DPATH=%t/libgoodbye.dylib
+
+# RUN: %lld -dylib -L%t -reexport-lgoodbye -install_name \
+# RUN: @executable_path/libsuper.dylib %t/libsuper.o -o %t/libsuper.dylib
+# RUN: llvm-otool -l %t/libsuper.dylib | FileCheck %s \
+# RUN: --check-prefix=REEXPORT-HEADERS -DPATH=%t/libgoodbye.dylib
+# RUN: %lld -dylib -reexport_library %t/libgoodbye.dylib -install_name \
+# RUN: @executable_path/libsuper.dylib %t/libsuper.o -o %t/libsuper.dylib
+# RUN: llvm-otool -l %t/libsuper.dylib | FileCheck %s \
# RUN: --check-prefix=REEXPORT-HEADERS -DPATH=%t/libgoodbye.dylib
# REEXPORT-HEADERS-NOT: NO_REEXPORTED_DYLIBS
@@ -53,16 +62,24 @@
## We can match dylibs without extensions too.
-# RUN: mkdir -p %t/Hello.framework/Versions
-# RUN: %lld -dylib %t/libhello.o -o %t/Hello.framework/Versions/Hello
-# RUN: %lld -dylib -o %t/libgoodbye2.dylib -sub_library Hello %t/Hello.framework/Versions/Hello %t/libgoodbye.o
-# RUN: llvm-objdump --macho --all-headers %t/libgoodbye2.dylib | FileCheck %s \
-# RUN: --check-prefix=REEXPORT-HEADERS -DPATH=%t/Hello.framework/Versions/Hello
+# RUN: mkdir -p %t/Hello.framework
+# RUN: %lld -dylib %t/libhello.o -o %t/Hello.framework/Hello
+# RUN: %lld -dylib -o %t/libgoodbye2.dylib -sub_library Hello %t/Hello.framework/Hello %t/libgoodbye.o
+# RUN: llvm-otool -l %t/libgoodbye2.dylib | FileCheck %s \
+# RUN: --check-prefix=REEXPORT-HEADERS -DPATH=%t/Hello.framework/Hello
## -sub_umbrella works almost identically...
-# RUN: %lld -dylib -o %t/libgoodbye3.dylib -sub_umbrella Hello %t/Hello.framework/Versions/Hello %t/libgoodbye.o
-# RUN: llvm-objdump --macho --all-headers %t/libgoodbye3.dylib | FileCheck %s \
-# RUN: --check-prefix=REEXPORT-HEADERS -DPATH=%t/Hello.framework/Versions/Hello
+# RUN: %lld -dylib -o %t/libgoodbye3.dylib -sub_umbrella Hello %t/Hello.framework/Hello %t/libgoodbye.o
+# RUN: llvm-otool -l %t/libgoodbye3.dylib | FileCheck %s \
+# RUN: --check-prefix=REEXPORT-HEADERS -DPATH=%t/Hello.framework/Hello
+
+# RUN: %lld -dylib -o %t/libgoodbye3.dylib -F %t -framework Hello -sub_umbrella Hello %t/libgoodbye.o
+# RUN: llvm-otool -l %t/libgoodbye3.dylib | FileCheck %s \
+# RUN: --check-prefix=REEXPORT-HEADERS -DPATH=%t/Hello.framework/Hello
+
+# RUN: %lld -dylib -o %t/libgoodbye3.dylib -F %t -reexport_framework Hello %t/libgoodbye.o
+# RUN: llvm-otool -l %t/libgoodbye3.dylib | FileCheck %s \
+# RUN: --check-prefix=REEXPORT-HEADERS -DPATH=%t/Hello.framework/Hello
## But it doesn't match .dylib extensions:
# RUN: not %lld -dylib -L%t -sub_umbrella libhello -lhello %t/libgoodbye.o \
More information about the llvm-commits
mailing list