diff options
-rw-r--r-- | lld/include/lld/ReaderWriter/MachOLinkingContext.h | 4 | ||||
-rw-r--r-- | lld/lib/Driver/DarwinLdDriver.cpp | 20 | ||||
-rw-r--r-- | lld/lib/Driver/DarwinLdOptions.td | 3 | ||||
-rw-r--r-- | lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp | 2 | ||||
-rw-r--r-- | lld/test/mach-o/sdk-version-error.yaml | 22 | ||||
-rw-r--r-- | lld/test/mach-o/version-min-load-command.yaml | 11 |
6 files changed, 61 insertions, 1 deletions
diff --git a/lld/include/lld/ReaderWriter/MachOLinkingContext.h b/lld/include/lld/ReaderWriter/MachOLinkingContext.h index 976c2754fd2..f317072a198 100644 --- a/lld/include/lld/ReaderWriter/MachOLinkingContext.h +++ b/lld/include/lld/ReaderWriter/MachOLinkingContext.h @@ -166,6 +166,9 @@ public: uint32_t osMinVersion() const { return _osMinVersion; } + uint32_t sdkVersion() const { return _sdkVersion; } + void setSdkVersion(uint64_t v) { _sdkVersion = v; } + uint32_t swiftVersion() const { return _swiftVersion; } /// \brief Checks whether a given path on the filesystem exists. @@ -420,6 +423,7 @@ private: Arch _arch; OS _os; uint32_t _osMinVersion; + uint32_t _sdkVersion = 0; uint64_t _pageZeroSize; uint64_t _pageSize; uint64_t _baseAddress; diff --git a/lld/lib/Driver/DarwinLdDriver.cpp b/lld/lib/Driver/DarwinLdDriver.cpp index f883ac6a8fe..775c6a345e4 100644 --- a/lld/lib/Driver/DarwinLdDriver.cpp +++ b/lld/lib/Driver/DarwinLdDriver.cpp @@ -792,6 +792,26 @@ bool DarwinLdDriver::parse(llvm::ArrayRef<const char *> args, } } + // Handle sdk_version + if (llvm::opt::Arg *arg = parsedArgs.getLastArg(OPT_sdk_version)) { + uint32_t sdkVersion = 0; + if (MachOLinkingContext::parsePackedVersion(arg->getValue(), + sdkVersion)) { + diagnostics << "error: malformed sdkVersion value\n"; + return false; + } + ctx.setSdkVersion(sdkVersion); + } else if (ctx.generateVersionLoadCommand()) { + // If we don't have an sdk version, but were going to emit a load command + // with min_version, then we need to give an warning as we have no sdk + // version to put in that command. + // FIXME: We need to decide whether to make this an error. + diagnostics << "warning: -sdk_version is required when emitting " + "min version load command. " + "Setting sdk version to match provided min version\n"; + ctx.setSdkVersion(ctx.osMinVersion()); + } + // Handle stack_size if (llvm::opt::Arg *stackSize = parsedArgs.getLastArg(OPT_stack_size)) { uint64_t stackSizeVal; diff --git a/lld/lib/Driver/DarwinLdOptions.td b/lld/lib/Driver/DarwinLdOptions.td index dd37cbba2bc..74ccc836e5e 100644 --- a/lld/lib/Driver/DarwinLdOptions.td +++ b/lld/lib/Driver/DarwinLdOptions.td @@ -33,6 +33,9 @@ def iphoneos_version_min : Separate<["-"], "iphoneos_version_min">, def ios_simulator_version_min : Separate<["-"], "ios_simulator_version_min">, MetaVarName<"<version>">, HelpText<"Minimum iOS simulator version">, Group<grp_opts>; +def sdk_version : Separate<["-"], "sdk_version">, + MetaVarName<"<version>">, + HelpText<"SDK version">, Group<grp_opts>; def version_load_command : Flag<["-"], "version_load_command">, HelpText<"Force generation of a version load command">, Group<grp_opts>; def no_version_load_command : Flag<["-"], "no_version_load_command">, diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp index c09634d115e..a2b33796b8f 100644 --- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp +++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp @@ -1248,7 +1248,7 @@ normalizedFromAtoms(const lld::File &atomFile, normFile.minOSverson = context.osMinVersion(); // FIXME: We need to get the SDK version from the system. For now the min // OS version is better than nothing. - normFile.sdkVersion = context.osMinVersion(); + normFile.sdkVersion = context.sdkVersion(); if (context.generateVersionLoadCommand() && context.os() != MachOLinkingContext::OS::unknown) diff --git a/lld/test/mach-o/sdk-version-error.yaml b/lld/test/mach-o/sdk-version-error.yaml new file mode 100644 index 00000000000..2607bb8e9c5 --- /dev/null +++ b/lld/test/mach-o/sdk-version-error.yaml @@ -0,0 +1,22 @@ +# RUN: not lld -flavor darwin -arch x86_64 -sdk_version 10.blah %s -o %t 2>&1 | FileCheck %s --check-prefix=ERROR + +--- !mach-o +arch: x86_64 +file-type: MH_OBJECT +flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ] +sections: + - segment: __TEXT + section: __text + type: S_REGULAR + attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ] + address: 0x0000000000000000 + content: [ 0x00, 0x00, 0x00, 0x00 ] +global-symbols: + - name: _main + type: N_SECT + scope: [ N_EXT ] + sect: 1 + value: 0x0000000000000000 +... + +# ERROR: malformed sdkVersion value
\ No newline at end of file diff --git a/lld/test/mach-o/version-min-load-command.yaml b/lld/test/mach-o/version-min-load-command.yaml index 95f7c8e9109..aa378a71fcf 100644 --- a/lld/test/mach-o/version-min-load-command.yaml +++ b/lld/test/mach-o/version-min-load-command.yaml @@ -1,9 +1,12 @@ # RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s -o %t -dylib %p/Inputs/libSystem.yaml && llvm-objdump -private-headers %t | FileCheck %s +# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s -o %t -dylib %p/Inputs/libSystem.yaml 2>&1 | FileCheck %s --check-prefix=WARNING # RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s -o %t -dylib %p/Inputs/libSystem.yaml -static -version_load_command && llvm-objdump -private-headers %t | FileCheck %s # RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s -o %t -dylib %p/Inputs/libSystem.yaml -no_version_load_command && llvm-objdump -private-headers %t | FileCheck %s --check-prefix=NO_VERSION_MIN # RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s -o %t -dylib %p/Inputs/libSystem.yaml -static -version_load_command -no_version_load_command && llvm-objdump -private-headers %t | FileCheck %s --check-prefix=NO_VERSION_MIN # RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s -o %t -dylib %p/Inputs/libSystem.yaml -static && llvm-objdump -private-headers %t | FileCheck %s --check-prefix=NO_VERSION_MIN +# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 -sdk_version 10.9 %s -o %t -dylib %p/Inputs/libSystem.yaml && llvm-objdump -private-headers %t | FileCheck %s --check-prefix=SDK_VERSION + --- !mach-o arch: x86_64 file-type: MH_OBJECT @@ -29,4 +32,12 @@ global-symbols: # CHECK: version 10.8 # CHECK: sdk 10.8 +# SDK_VERSION: Load command {{[0-9]*}} +# SDK_VERSION: cmd LC_VERSION_MIN_MACOSX +# SDK_VERSION: cmdsize 16 +# SDK_VERSION: version 10.8 +# SDK_VERSION: sdk 10.9 + +# WARNING: warning: -sdk_version is required when emitting min version load command. Setting sdk version to match provided min version + # NO_VERSION_MIN-NOT: LC_VERSION_MIN_MACOSX |