From 074af2daf5f33b884088dc0200b1acb038bfcaec Mon Sep 17 00:00:00 2001 From: Alexander Shaposhnikov Date: Thu, 24 Oct 2019 17:35:10 -0700 Subject: [PATCH] [llvm-objcopy][MachO] Add support for min os version load commands Add support for min os version load commands. Test plan: make check-all Differential revision: https://reviews.llvm.org/D69419 --- .../MachO/Inputs/min_iphoneos_version_lc.yaml | 15 ++++++++++++++ .../MachO/Inputs/min_macos_version_lc.yaml | 15 ++++++++++++++ .../MachO/Inputs/min_tvos_version_lc.yaml | 15 ++++++++++++++ .../MachO/Inputs/min_watchos_version_lc.yaml | 15 ++++++++++++++ .../MachO/min-version-load-commands.test | 20 +++++++++++++++++++ .../llvm-objcopy/MachO/MachOLayoutBuilder.cpp | 3 +++ 6 files changed, 83 insertions(+) create mode 100644 llvm/test/tools/llvm-objcopy/MachO/Inputs/min_iphoneos_version_lc.yaml create mode 100644 llvm/test/tools/llvm-objcopy/MachO/Inputs/min_macos_version_lc.yaml create mode 100644 llvm/test/tools/llvm-objcopy/MachO/Inputs/min_tvos_version_lc.yaml create mode 100644 llvm/test/tools/llvm-objcopy/MachO/Inputs/min_watchos_version_lc.yaml create mode 100644 llvm/test/tools/llvm-objcopy/MachO/min-version-load-commands.test diff --git a/llvm/test/tools/llvm-objcopy/MachO/Inputs/min_iphoneos_version_lc.yaml b/llvm/test/tools/llvm-objcopy/MachO/Inputs/min_iphoneos_version_lc.yaml new file mode 100644 index 000000000000..2ed4ebaa3be3 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/MachO/Inputs/min_iphoneos_version_lc.yaml @@ -0,0 +1,15 @@ +--- !mach-o +FileHeader: + magic: 0xFEEDFACE + cputype: 0x0000000C + cpusubtype: 0x00000009 + filetype: 0x00000001 + ncmds: 1 + sizeofcmds: 16 + flags: 0x00002000 +LoadCommands: + - cmd: LC_VERSION_MIN_IPHONEOS + cmdsize: 16 + version: 327680 + sdk: 0 +... diff --git a/llvm/test/tools/llvm-objcopy/MachO/Inputs/min_macos_version_lc.yaml b/llvm/test/tools/llvm-objcopy/MachO/Inputs/min_macos_version_lc.yaml new file mode 100644 index 000000000000..7787d54c2609 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/MachO/Inputs/min_macos_version_lc.yaml @@ -0,0 +1,15 @@ +--- !mach-o +FileHeader: + magic: 0xFEEDFACE + cputype: 0x0000000C + cpusubtype: 0x00000009 + filetype: 0x00000001 + ncmds: 1 + sizeofcmds: 16 + flags: 0x00002000 +LoadCommands: + - cmd: LC_VERSION_MIN_MACOSX + cmdsize: 16 + version: 327680 + sdk: 0 +... diff --git a/llvm/test/tools/llvm-objcopy/MachO/Inputs/min_tvos_version_lc.yaml b/llvm/test/tools/llvm-objcopy/MachO/Inputs/min_tvos_version_lc.yaml new file mode 100644 index 000000000000..64eb77bc8c54 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/MachO/Inputs/min_tvos_version_lc.yaml @@ -0,0 +1,15 @@ +--- !mach-o +FileHeader: + magic: 0xFEEDFACE + cputype: 0x0000000C + cpusubtype: 0x00000009 + filetype: 0x00000001 + ncmds: 1 + sizeofcmds: 16 + flags: 0x00002000 +LoadCommands: + - cmd: LC_VERSION_MIN_TVOS + cmdsize: 16 + version: 327680 + sdk: 0 +... diff --git a/llvm/test/tools/llvm-objcopy/MachO/Inputs/min_watchos_version_lc.yaml b/llvm/test/tools/llvm-objcopy/MachO/Inputs/min_watchos_version_lc.yaml new file mode 100644 index 000000000000..27f1c78d85b8 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/MachO/Inputs/min_watchos_version_lc.yaml @@ -0,0 +1,15 @@ +--- !mach-o +FileHeader: + magic: 0xFEEDFACE + cputype: 0x0000000C + cpusubtype: 0x00000009 + filetype: 0x00000001 + ncmds: 1 + sizeofcmds: 16 + flags: 0x00002000 +LoadCommands: + - cmd: LC_VERSION_MIN_WATCHOS + cmdsize: 16 + version: 327680 + sdk: 0 +... diff --git a/llvm/test/tools/llvm-objcopy/MachO/min-version-load-commands.test b/llvm/test/tools/llvm-objcopy/MachO/min-version-load-commands.test new file mode 100644 index 000000000000..42dce2e192c1 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/MachO/min-version-load-commands.test @@ -0,0 +1,20 @@ +## This test verifies that llvm-objcopy correctly handles min os version load commands. +## We use separate input files since one binary is not allowed to contain more than one +## load command of this type (LC_VERSION_MIN_IPHONEOS, LC_VERSION_MIN_MACOSX, +## LC_VERSION_MIN_TVOS, LC_VERSION_MIN_WATCHOS). + +# RUN: yaml2obj %p/Inputs/min_iphoneos_version_lc.yaml > %t.iphoneos +# RUN: llvm-objcopy %t.iphoneos %t.iphoneos.copy +# RUN: cmp %t.iphoneos %t.iphoneos.copy + +# RUN: yaml2obj %p/Inputs/min_macos_version_lc.yaml > %t.macos +# RUN: llvm-objcopy %t.macos %t.macos.copy +# RUN: cmp %t.macos %t.macos.copy + +# RUN: yaml2obj %p/Inputs/min_tvos_version_lc.yaml > %t.tvos +# RUN: llvm-objcopy %t.tvos %t.tvos.copy +# RUN: cmp %t.tvos %t.tvos.copy + +# RUN: yaml2obj %p/Inputs/min_watchos_version_lc.yaml > %t.watchos +# RUN: llvm-objcopy %t.watchos %t.watchos.copy +# RUN: cmp %t.watchos %t.watchos.copy diff --git a/llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp b/llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp index f621f3aa09cf..006eb8ce7c49 100644 --- a/llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp +++ b/llvm/tools/llvm-objcopy/MachO/MachOLayoutBuilder.cpp @@ -318,6 +318,9 @@ Error MachOLayoutBuilder::layoutTail(uint64_t Offset) { case MachO::LC_SEGMENT: case MachO::LC_SEGMENT_64: case MachO::LC_VERSION_MIN_MACOSX: + case MachO::LC_VERSION_MIN_IPHONEOS: + case MachO::LC_VERSION_MIN_TVOS: + case MachO::LC_VERSION_MIN_WATCHOS: case MachO::LC_BUILD_VERSION: case MachO::LC_ID_DYLIB: case MachO::LC_LOAD_DYLIB: