Add support for the 'macCatalyst' MachO platform
authorAlex Lorenz <arphaman@gmail.com>
Tue, 2 Jul 2019 23:47:11 +0000 (23:47 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Tue, 2 Jul 2019 23:47:11 +0000 (23:47 +0000)
Mac Catalyst is a new MachO platform in macOS Catalina.
It always uses the build_version MachO load command.

Differential Revision: https://reviews.llvm.org/D64107

llvm-svn: 364981

llvm/include/llvm/BinaryFormat/MachO.h
llvm/include/llvm/Object/MachO.h
llvm/lib/MC/MCAsmStreamer.cpp
llvm/lib/MC/MCParser/DarwinAsmParser.cpp
llvm/lib/MC/MCStreamer.cpp
llvm/test/CodeGen/X86/macCatalyst.ll [new file with mode: 0644]
llvm/test/MC/MachO/build-version-maccatalyst.s [new file with mode: 0644]
llvm/test/MC/MachO/darwin-version-min-load-command.s
llvm/test/tools/llvm-objdump/X86/macho-maccatalyst-build-version.yaml [new file with mode: 0644]

index 089add5..a01393a 100644 (file)
@@ -487,6 +487,7 @@ enum PlatformType {
   PLATFORM_TVOS = 3,
   PLATFORM_WATCHOS = 4,
   PLATFORM_BRIDGEOS = 5,
+  PLATFORM_MACCATALYST = 6,
   PLATFORM_IOSSIMULATOR = 7,
   PLATFORM_TVOSSIMULATOR = 8,
   PLATFORM_WATCHOSSIMULATOR = 9
index 17edd9c..71c835c 100644 (file)
@@ -608,6 +608,7 @@ public:
     case MachO::PLATFORM_TVOS: return "tvos";
     case MachO::PLATFORM_WATCHOS: return "watchos";
     case MachO::PLATFORM_BRIDGEOS: return "bridgeos";
+    case MachO::PLATFORM_MACCATALYST: return "maccatalyst";
     case MachO::PLATFORM_IOSSIMULATOR: return "iossimulator";
     case MachO::PLATFORM_TVOSSIMULATOR: return "tvossimulator";
     case MachO::PLATFORM_WATCHOSSIMULATOR: return "watchossimulator";
index 350502d..a78092e 100644 (file)
@@ -541,6 +541,7 @@ static const char *getPlatformName(MachO::PlatformType Type) {
   case MachO::PLATFORM_TVOS:             return "tvos";
   case MachO::PLATFORM_WATCHOS:          return "watchos";
   case MachO::PLATFORM_BRIDGEOS:         return "bridgeos";
+  case MachO::PLATFORM_MACCATALYST:      return "maccatalyst";
   case MachO::PLATFORM_IOSSIMULATOR:     return "iossimulator";
   case MachO::PLATFORM_TVOSSIMULATOR:    return "tvossimulator";
   case MachO::PLATFORM_WATCHOSSIMULATOR: return "watchossimulator";
index 09d41db..1b5b012 100644 (file)
@@ -1148,6 +1148,7 @@ static Triple::OSType getOSTypeFromPlatform(MachO::PlatformType Type) {
   case MachO::PLATFORM_TVOS:    return Triple::TvOS;
   case MachO::PLATFORM_WATCHOS: return Triple::WatchOS;
   case MachO::PLATFORM_BRIDGEOS:         /* silence warning */ break;
+  case MachO::PLATFORM_MACCATALYST: return Triple::IOS;
   case MachO::PLATFORM_IOSSIMULATOR:     /* silence warning */ break;
   case MachO::PLATFORM_TVOSSIMULATOR:    /* silence warning */ break;
   case MachO::PLATFORM_WATCHOSSIMULATOR: /* silence warning */ break;
@@ -1168,6 +1169,7 @@ bool DarwinAsmParser::parseBuildVersion(StringRef Directive, SMLoc Loc) {
     .Case("ios", MachO::PLATFORM_IOS)
     .Case("tvos", MachO::PLATFORM_TVOS)
     .Case("watchos", MachO::PLATFORM_WATCHOS)
+    .Case("maccatalyst", MachO::PLATFORM_MACCATALYST)
     .Default(0);
   if (Platform == 0)
     return Error(PlatformLoc, "unknown platform name");
index b7986ee..decbb96 100644 (file)
@@ -1077,6 +1077,15 @@ void MCStreamer::EmitVersionForTarget(const Triple &Target,
   unsigned Major;
   unsigned Minor;
   unsigned Update;
+  if (Target.isMacCatalystEnvironment()) {
+    // Mac Catalyst always uses the build version load command.
+    Target.getiOSVersion(Major, Minor, Update);
+    assert(Major && "A non-zero major version is expected");
+    EmitBuildVersion(MachO::PLATFORM_MACCATALYST, Major, Minor, Update,
+                     SDKVersion);
+    return;
+  }
+
   MCVersionMinType VersionType;
   if (Target.isWatchOS()) {
     VersionType = MCVM_WatchOSVersionMin;
diff --git a/llvm/test/CodeGen/X86/macCatalyst.ll b/llvm/test/CodeGen/X86/macCatalyst.ll
new file mode 100644 (file)
index 0000000..190c467
--- /dev/null
@@ -0,0 +1,3 @@
+; RUN: llc %s -o - | FileCheck %s
+target triple="x86_64-apple-ios13.0-maccatalyst"
+; CHECK: .build_version maccatalyst, 13, 0
diff --git a/llvm/test/MC/MachO/build-version-maccatalyst.s b/llvm/test/MC/MachO/build-version-maccatalyst.s
new file mode 100644 (file)
index 0000000..9056780
--- /dev/null
@@ -0,0 +1,4 @@
+// RUN: llvm-mc -triple x86_64-apple-ios %s | FileCheck %s
+
+.build_version maccatalyst,13,0
+// CHECK: .build_version maccatalyst, 13, 0
index 7fd4daa..05f61f0 100644 (file)
@@ -1,6 +1,7 @@
 // RUN: llvm-mc -triple x86_64-apple-macosx10.10.0 %s -filetype=obj -o - | llvm-objdump -macho -private-headers - | FileCheck %s
 // RUN: llvm-mc -triple x86_64-apple-ios8.0.0 %s -filetype=obj -o - | llvm-objdump -macho -private-headers - | FileCheck %s --check-prefix=CHECK-IOS
 // RUN: llvm-mc -triple x86_64-apple-darwin %s -filetype=obj -o - | llvm-objdump -macho -private-headers - | FileCheck %s --check-prefix=CHECK-DARWIN
+// RUN: llvm-mc -triple x86_64-apple-ios13.0-maccatalyst %s -filetype=obj -o - | llvm-objdump -macho -private-headers - | FileCheck %s --check-prefix=CHECK-MACCATALYST
 
 // Test version-min load command should be inferred from triple and should always be generated on Darwin
 // CHECK: Load command
 // CHECK-BRIDGEOS-NEXT:       sdk n/a
 // CHECK-BRIDGEOS-NEXT:     minos 2.0
 // CHECK-BRIDGEOS-NEXT:    ntools 0
+
+// CHECK-MACCATALYST:           cmd LC_BUILD_VERSION
+// CHECK-MACCATALYST-NEXT:  cmdsize 24
+// CHECK-MACCATALYST-NEXT: platform maccatalyst
+// CHECK-MACCATALYST-NEXT:      sdk n/a
+// CHECK-MACCATALYST-NEXT:    minos 13.0
+// CHECK-MACCATALYST-NEXT:   ntools 0
diff --git a/llvm/test/tools/llvm-objdump/X86/macho-maccatalyst-build-version.yaml b/llvm/test/tools/llvm-objdump/X86/macho-maccatalyst-build-version.yaml
new file mode 100644 (file)
index 0000000..4d2f5d6
--- /dev/null
@@ -0,0 +1,54 @@
+# RUN: yaml2obj %s | llvm-objdump -macho -private-headers - | FileCheck %s
+
+--- !mach-o
+FileHeader:
+  magic:           0xFEEDFACF
+  cputype:         0x01000007
+  cpusubtype:      0x00000003
+  filetype:        0x00000004
+  ncmds:           2
+  sizeofcmds:      192
+  flags:           0x00000000
+  reserved:        0
+LoadCommands:
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         152
+    segname:         __TEXT
+    vmaddr:          4294967296
+    vmsize:          8192
+    fileoff:         0
+    filesize:        3099
+    maxprot:         7
+    initprot:        5
+    nsects:          1
+    flags:           0
+    Sections:
+      - sectname:        __text
+        segname:         __TEXT
+        addr:            0x0000000100001160
+        size:            3099
+        offset:          0x00001160
+        align:           4
+        reloff:          0x00000000
+        nreloc:          0
+        flags:           0x80000400
+        reserved1:       0x00000000
+        reserved2:       0x00000000
+        reserved3:       0x00000000
+  - cmd:             LC_BUILD_VERSION
+    cmdsize:         32
+    platform:        6
+    minos:           0x000D0000
+    sdk:             0x00090000
+    ntools:          1
+    Tools:
+      - tool:        1
+        version:     0x00000000
+...
+
+CHECK: Load command 1
+CHECK-NEXT:       cmd LC_BUILD_VERSION
+CHECK-NEXT:   cmdsize 32
+CHECK-NEXT:  platform maccatalyst
+CHECK-NEXT:       sdk 9.0
+CHECK-NEXT:     minos 13.0