[PATCH] D104352: [lld-macho] Handle multiple LC_LINKER_OPTIONs
Jez Ng via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 15 21:53:53 PDT 2021
int3 created this revision.
int3 added a reviewer: lld-macho.
Herald added a reviewer: gkm.
Herald added a project: lld-macho.
int3 requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
We previously only parsed the first one.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D104352
Files:
lld/MachO/InputFiles.cpp
lld/test/MachO/lc-linker-option.ll
Index: lld/test/MachO/lc-linker-option.ll
===================================================================
--- lld/test/MachO/lc-linker-option.ll
+++ lld/test/MachO/lc-linker-option.ll
@@ -15,6 +15,8 @@
; RUN: llvm-as %t/l.ll -o %t/l.o
;; The dynamic call to _CFBigNumGetInt128 uses dyld_stub_binder,
;; which needs -lSystem from LC_LINKER_OPTION to get resolved.
+;; The reference to __cxa_allocate_exception will require -lc++ from
+;; LC_LINKER_OPTION to get resolved.
; RUN: %lld %t/l.o -o %t/l -framework CoreFoundation
; RUN: llvm-otool -l %t/l | FileCheck --check-prefix=LIB %s \
; RUN: --implicit-check-not LC_LOAD_DYLIB
@@ -24,12 +26,24 @@
; LIB: cmd LC_LOAD_DYLIB
; LIB-NEXT: cmdsize
; LIB-NEXT: name /usr/lib/libSystem.dylib
+; LIB: cmd LC_LOAD_DYLIB
+; LIB-NEXT: cmdsize
+; LIB-NEXT: name /usr/lib/libc++abi.dylib
;; Check that we don't create duplicate LC_LOAD_DYLIBs.
; RUN: %lld -lSystem %t/l.o -o %t/l -framework CoreFoundation
-; RUN: llvm-otool -l %t/l | FileCheck --check-prefix=FRAME %s \
+; RUN: llvm-otool -l %t/l | FileCheck --check-prefix=LIB2 %s \
; RUN: --implicit-check-not LC_LOAD_DYLIB
-;
+; LIB2: cmd LC_LOAD_DYLIB
+; LIB2-NEXT: cmdsize
+; LIB2-NEXT: name /usr/lib/libSystem.dylib
+; LIB2: cmd LC_LOAD_DYLIB
+; LIB2-NEXT: cmdsize
+; LIB2-NEXT: name /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
+; LIB2: cmd LC_LOAD_DYLIB
+; LIB2-NEXT: cmdsize
+; LIB2-NEXT: name /usr/lib/libc++abi.dylib
+
; RUN: llvm-as %t/invalid.ll -o %t/invalid.o
; RUN: not %lld %t/invalid.o -o /dev/null 2>&1 | FileCheck --check-prefix=INVALID %s
; INVALID: error: -why_load is not allowed in LC_LINKER_OPTION
@@ -53,12 +67,15 @@
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
!0 = !{!"-lSystem"}
-!llvm.linker.options = !{!0, !0}
+!1 = !{!"-lc++"}
+!llvm.linker.options = !{!0, !0, !1}
declare void @_CFBigNumGetInt128(...)
+declare i8* @__cxa_allocate_exception(i64)
define void @main() {
call void bitcast (void (...)* @_CFBigNumGetInt128 to void ()*)()
+ call i8* @__cxa_allocate_exception(i64 4)
ret void
}
Index: lld/MachO/InputFiles.cpp
===================================================================
--- lld/MachO/InputFiles.cpp
+++ lld/MachO/InputFiles.cpp
@@ -704,11 +704,10 @@
if (!checkCompatibility(this))
return;
- if (const load_command *cmd = findCommand(hdr, LC_LINKER_OPTION)) {
- auto *c = reinterpret_cast<const linker_option_command *>(cmd);
- StringRef data{reinterpret_cast<const char *>(c + 1),
- c->cmdsize - sizeof(linker_option_command)};
- parseLCLinkerOption(this, c->count, data);
+ for (auto *cmd : findCommands<linker_option_command>(hdr, LC_LINKER_OPTION)) {
+ StringRef data{reinterpret_cast<const char *>(cmd + 1),
+ cmd->cmdsize - sizeof(linker_option_command)};
+ parseLCLinkerOption(this, cmd->count, data);
}
ArrayRef<Section> sectionHeaders;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D104352.352335.patch
Type: text/x-patch
Size: 3029 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210616/60d519eb/attachment.bin>
More information about the llvm-commits
mailing list