diff --git a/extension/apple/Benchmark/App/App.entitlements b/extension/apple/Benchmark/App/App.entitlements
new file mode 100644
index 00000000000..e461e7f22f6
--- /dev/null
+++ b/extension/apple/Benchmark/App/App.entitlements
@@ -0,0 +1,12 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.files.user-selected.read-only
+
+ com.apple.developer.kernel.increased-memory-limit
+
+
+
diff --git a/extension/apple/Benchmark/App/App.swift b/extension/apple/Benchmark/App/App.swift
new file mode 100644
index 00000000000..30fbd221dc0
--- /dev/null
+++ b/extension/apple/Benchmark/App/App.swift
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+import SwiftUI
+
+@main
+struct BenchmarkApp: App {
+ var body: some Scene {
+ WindowGroup {}
+ }
+}
diff --git a/extension/apple/Benchmark/Benchmark.xcodeproj/project.pbxproj b/extension/apple/Benchmark/Benchmark.xcodeproj/project.pbxproj
new file mode 100644
index 00000000000..4dcffaffbf6
--- /dev/null
+++ b/extension/apple/Benchmark/Benchmark.xcodeproj/project.pbxproj
@@ -0,0 +1,535 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 56;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 03B2D3682C8A515A0046936E /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B2D3672C8A515A0046936E /* App.swift */; };
+ 03B2D37A2C8A515C0046936E /* Tests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 03B2D3792C8A515C0046936E /* Tests.mm */; };
+ 03C7FA382C8AA3EC00E6E9AE /* Models in Resources */ = {isa = PBXBuildFile; fileRef = 03C7FA322C8AA24200E6E9AE /* Models */; };
+ 03ED6CFF2C8AAFB300F2D6EE /* backend_coreml.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6CFE2C8AAFB300F2D6EE /* backend_coreml.xcframework */; };
+ 03ED6D012C8AAFB300F2D6EE /* backend_mps.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6D002C8AAFB300F2D6EE /* backend_mps.xcframework */; };
+ 03ED6D032C8AAFB300F2D6EE /* backend_xnnpack.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6D022C8AAFB300F2D6EE /* backend_xnnpack.xcframework */; };
+ 03ED6D052C8AAFB300F2D6EE /* executorch.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6D042C8AAFB300F2D6EE /* executorch.xcframework */; };
+ 03ED6D072C8AAFB300F2D6EE /* kernels_custom.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6D062C8AAFB300F2D6EE /* kernels_custom.xcframework */; };
+ 03ED6D092C8AAFB300F2D6EE /* kernels_optimized.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6D082C8AAFB300F2D6EE /* kernels_optimized.xcframework */; };
+ 03ED6D0B2C8AAFB300F2D6EE /* kernels_portable.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6D0A2C8AAFB300F2D6EE /* kernels_portable.xcframework */; };
+ 03ED6D0D2C8AAFB300F2D6EE /* kernels_quantized.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6D0C2C8AAFB300F2D6EE /* kernels_quantized.xcframework */; };
+ 03ED6D0F2C8AAFE900F2D6EE /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6D0E2C8AAFE900F2D6EE /* libsqlite3.0.tbd */; };
+ 03ED6D112C8AAFF200F2D6EE /* MetalPerformanceShadersGraph.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6D102C8AAFF200F2D6EE /* MetalPerformanceShadersGraph.framework */; };
+ 03ED6D132C8AAFF700F2D6EE /* MetalPerformanceShaders.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6D122C8AAFF700F2D6EE /* MetalPerformanceShaders.framework */; };
+ 03ED6D152C8AAFFF00F2D6EE /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6D142C8AAFFF00F2D6EE /* Metal.framework */; };
+ 03ED6D172C8AB00500F2D6EE /* CoreML.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6D162C8AB00500F2D6EE /* CoreML.framework */; };
+ 03ED6D192C8AB00A00F2D6EE /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03ED6D182C8AB00A00F2D6EE /* Accelerate.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 03B2D3762C8A515C0046936E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 03B2D35C2C8A515A0046936E /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 03B2D3632C8A515A0046936E;
+ remoteInfo = Benchmark;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 037C96A02C8A570B00B3DF38 /* Tests.xctestplan */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Tests.xctestplan; sourceTree = ""; };
+ 03B019502C8A80D30044D558 /* Tests.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Tests.xcconfig; sourceTree = ""; };
+ 03B2D3642C8A515A0046936E /* Benchmark.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Benchmark.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 03B2D3672C8A515A0046936E /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; };
+ 03B2D36D2C8A515B0046936E /* App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = App.entitlements; sourceTree = ""; };
+ 03B2D3752C8A515C0046936E /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 03B2D3792C8A515C0046936E /* Tests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = Tests.mm; sourceTree = ""; };
+ 03C7FA322C8AA24200E6E9AE /* Models */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Models; sourceTree = SOURCE_ROOT; };
+ 03ED6CFE2C8AAFB300F2D6EE /* backend_coreml.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = backend_coreml.xcframework; path = Frameworks/backend_coreml.xcframework; sourceTree = ""; };
+ 03ED6D002C8AAFB300F2D6EE /* backend_mps.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = backend_mps.xcframework; path = Frameworks/backend_mps.xcframework; sourceTree = ""; };
+ 03ED6D022C8AAFB300F2D6EE /* backend_xnnpack.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = backend_xnnpack.xcframework; path = Frameworks/backend_xnnpack.xcframework; sourceTree = ""; };
+ 03ED6D042C8AAFB300F2D6EE /* executorch.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = executorch.xcframework; path = Frameworks/executorch.xcframework; sourceTree = ""; };
+ 03ED6D062C8AAFB300F2D6EE /* kernels_custom.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = kernels_custom.xcframework; path = Frameworks/kernels_custom.xcframework; sourceTree = ""; };
+ 03ED6D082C8AAFB300F2D6EE /* kernels_optimized.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = kernels_optimized.xcframework; path = Frameworks/kernels_optimized.xcframework; sourceTree = ""; };
+ 03ED6D0A2C8AAFB300F2D6EE /* kernels_portable.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = kernels_portable.xcframework; path = Frameworks/kernels_portable.xcframework; sourceTree = ""; };
+ 03ED6D0C2C8AAFB300F2D6EE /* kernels_quantized.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = kernels_quantized.xcframework; path = Frameworks/kernels_quantized.xcframework; sourceTree = ""; };
+ 03ED6D0E2C8AAFE900F2D6EE /* libsqlite3.0.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.0.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS17.5.sdk/usr/lib/libsqlite3.0.tbd; sourceTree = DEVELOPER_DIR; };
+ 03ED6D102C8AAFF200F2D6EE /* MetalPerformanceShadersGraph.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalPerformanceShadersGraph.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS17.5.sdk/System/Library/Frameworks/MetalPerformanceShadersGraph.framework; sourceTree = DEVELOPER_DIR; };
+ 03ED6D122C8AAFF700F2D6EE /* MetalPerformanceShaders.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalPerformanceShaders.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS17.5.sdk/System/Library/Frameworks/MetalPerformanceShaders.framework; sourceTree = DEVELOPER_DIR; };
+ 03ED6D142C8AAFFF00F2D6EE /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS17.5.sdk/System/Library/Frameworks/Metal.framework; sourceTree = DEVELOPER_DIR; };
+ 03ED6D162C8AB00500F2D6EE /* CoreML.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreML.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS17.5.sdk/System/Library/Frameworks/CoreML.framework; sourceTree = DEVELOPER_DIR; };
+ 03ED6D182C8AB00A00F2D6EE /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS17.5.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 03B2D3612C8A515A0046936E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 03B2D3722C8A515C0046936E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 03ED6D192C8AB00A00F2D6EE /* Accelerate.framework in Frameworks */,
+ 03ED6D172C8AB00500F2D6EE /* CoreML.framework in Frameworks */,
+ 03ED6D152C8AAFFF00F2D6EE /* Metal.framework in Frameworks */,
+ 03ED6D132C8AAFF700F2D6EE /* MetalPerformanceShaders.framework in Frameworks */,
+ 03ED6D112C8AAFF200F2D6EE /* MetalPerformanceShadersGraph.framework in Frameworks */,
+ 03ED6D0F2C8AAFE900F2D6EE /* libsqlite3.0.tbd in Frameworks */,
+ 03ED6CFF2C8AAFB300F2D6EE /* backend_coreml.xcframework in Frameworks */,
+ 03ED6D032C8AAFB300F2D6EE /* backend_xnnpack.xcframework in Frameworks */,
+ 03ED6D092C8AAFB300F2D6EE /* kernels_optimized.xcframework in Frameworks */,
+ 03ED6D012C8AAFB300F2D6EE /* backend_mps.xcframework in Frameworks */,
+ 03ED6D0D2C8AAFB300F2D6EE /* kernels_quantized.xcframework in Frameworks */,
+ 03ED6D0B2C8AAFB300F2D6EE /* kernels_portable.xcframework in Frameworks */,
+ 03ED6D052C8AAFB300F2D6EE /* executorch.xcframework in Frameworks */,
+ 03ED6D072C8AAFB300F2D6EE /* kernels_custom.xcframework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 03B2D35B2C8A515A0046936E = {
+ isa = PBXGroup;
+ children = (
+ 03B2D3662C8A515A0046936E /* App */,
+ 03ED6CEB2C8AAF5300F2D6EE /* Frameworks */,
+ 03C7FA322C8AA24200E6E9AE /* Models */,
+ 03B2D3782C8A515C0046936E /* Tests */,
+ 03B2D3652C8A515A0046936E /* Products */,
+ );
+ sourceTree = "";
+ };
+ 03B2D3652C8A515A0046936E /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 03B2D3642C8A515A0046936E /* Benchmark.app */,
+ 03B2D3752C8A515C0046936E /* Tests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 03B2D3662C8A515A0046936E /* App */ = {
+ isa = PBXGroup;
+ children = (
+ 03B2D3672C8A515A0046936E /* App.swift */,
+ 03B2D36D2C8A515B0046936E /* App.entitlements */,
+ );
+ path = App;
+ sourceTree = SOURCE_ROOT;
+ };
+ 03B2D3782C8A515C0046936E /* Tests */ = {
+ isa = PBXGroup;
+ children = (
+ 03B2D3792C8A515C0046936E /* Tests.mm */,
+ 03B019502C8A80D30044D558 /* Tests.xcconfig */,
+ 037C96A02C8A570B00B3DF38 /* Tests.xctestplan */,
+ );
+ path = Tests;
+ sourceTree = SOURCE_ROOT;
+ };
+ 03ED6CEB2C8AAF5300F2D6EE /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 03ED6D182C8AB00A00F2D6EE /* Accelerate.framework */,
+ 03ED6D162C8AB00500F2D6EE /* CoreML.framework */,
+ 03ED6D142C8AAFFF00F2D6EE /* Metal.framework */,
+ 03ED6D122C8AAFF700F2D6EE /* MetalPerformanceShaders.framework */,
+ 03ED6D102C8AAFF200F2D6EE /* MetalPerformanceShadersGraph.framework */,
+ 03ED6D0E2C8AAFE900F2D6EE /* libsqlite3.0.tbd */,
+ 03ED6CFE2C8AAFB300F2D6EE /* backend_coreml.xcframework */,
+ 03ED6D002C8AAFB300F2D6EE /* backend_mps.xcframework */,
+ 03ED6D022C8AAFB300F2D6EE /* backend_xnnpack.xcframework */,
+ 03ED6D042C8AAFB300F2D6EE /* executorch.xcframework */,
+ 03ED6D062C8AAFB300F2D6EE /* kernels_custom.xcframework */,
+ 03ED6D082C8AAFB300F2D6EE /* kernels_optimized.xcframework */,
+ 03ED6D0A2C8AAFB300F2D6EE /* kernels_portable.xcframework */,
+ 03ED6D0C2C8AAFB300F2D6EE /* kernels_quantized.xcframework */,
+ );
+ name = Frameworks;
+ sourceTree = SOURCE_ROOT;
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 03B2D3632C8A515A0046936E /* App */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 03B2D3892C8A515C0046936E /* Build configuration list for PBXNativeTarget "App" */;
+ buildPhases = (
+ 03B2D3602C8A515A0046936E /* Sources */,
+ 03B2D3612C8A515A0046936E /* Frameworks */,
+ 03B2D3622C8A515A0046936E /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = App;
+ productName = Benchmark;
+ productReference = 03B2D3642C8A515A0046936E /* Benchmark.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 03B2D3742C8A515C0046936E /* Tests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 03B2D38C2C8A515C0046936E /* Build configuration list for PBXNativeTarget "Tests" */;
+ buildPhases = (
+ 03B2D3712C8A515C0046936E /* Sources */,
+ 03B2D3722C8A515C0046936E /* Frameworks */,
+ 03B2D3732C8A515C0046936E /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 03B2D3772C8A515C0046936E /* PBXTargetDependency */,
+ );
+ name = Tests;
+ productName = BenchmarkTests;
+ productReference = 03B2D3752C8A515C0046936E /* Tests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 03B2D35C2C8A515A0046936E /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1540;
+ LastUpgradeCheck = 1540;
+ TargetAttributes = {
+ 03B2D3632C8A515A0046936E = {
+ CreatedOnToolsVersion = 15.4;
+ };
+ 03B2D3742C8A515C0046936E = {
+ CreatedOnToolsVersion = 15.4;
+ TestTargetID = 03B2D3632C8A515A0046936E;
+ };
+ };
+ };
+ buildConfigurationList = 03B2D35F2C8A515A0046936E /* Build configuration list for PBXProject "Benchmark" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 03B2D35B2C8A515A0046936E;
+ productRefGroup = 03B2D3652C8A515A0046936E /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 03B2D3632C8A515A0046936E /* App */,
+ 03B2D3742C8A515C0046936E /* Tests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 03B2D3622C8A515A0046936E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 03B2D3732C8A515C0046936E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 03C7FA382C8AA3EC00E6E9AE /* Models in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 03B2D3602C8A515A0046936E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 03B2D3682C8A515A0046936E /* App.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 03B2D3712C8A515C0046936E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 03B2D37A2C8A515C0046936E /* Tests.mm in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 03B2D3772C8A515C0046936E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 03B2D3632C8A515A0046936E /* App */;
+ targetProxy = 03B2D3762C8A515C0046936E /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 03B2D3872C8A515C0046936E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "c++17";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 03B2D3882C8A515C0046936E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "c++17";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ };
+ name = Release;
+ };
+ 03B2D38A2C8A515C0046936E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_ENTITLEMENTS = App/App.entitlements;
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = "";
+ ENABLE_PREVIEWS = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
+ "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
+ "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
+ "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
+ "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
+ "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
+ "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
+ "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.0;
+ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
+ "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
+ MACOSX_DEPLOYMENT_TARGET = 11.0;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = org.pytorch.executorch.Benchmark;
+ PRODUCT_NAME = Benchmark;
+ SDKROOT = auto;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 03B2D38B2C8A515C0046936E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_ENTITLEMENTS = App/App.entitlements;
+ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = "";
+ ENABLE_PREVIEWS = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
+ "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
+ "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
+ "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
+ "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
+ "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
+ "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
+ "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.0;
+ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
+ "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
+ MACOSX_DEPLOYMENT_TARGET = 11.0;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = org.pytorch.executorch.Benchmark;
+ PRODUCT_NAME = Benchmark;
+ SDKROOT = auto;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 03B2D38D2C8A515C0046936E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 03B019502C8A80D30044D558 /* Tests.xcconfig */;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = "";
+ GENERATE_INFOPLIST_FILE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.0;
+ MACOSX_DEPLOYMENT_TARGET = 10.15;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = org.pytorch.executorch.BenchmarkTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = auto;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Benchmark.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Benchmark";
+ };
+ name = Debug;
+ };
+ 03B2D38E2C8A515C0046936E /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 03B019502C8A80D30044D558 /* Tests.xcconfig */;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = "";
+ GENERATE_INFOPLIST_FILE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.0;
+ MACOSX_DEPLOYMENT_TARGET = 10.15;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = org.pytorch.executorch.BenchmarkTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = auto;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Benchmark.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Benchmark";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 03B2D35F2C8A515A0046936E /* Build configuration list for PBXProject "Benchmark" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 03B2D3872C8A515C0046936E /* Debug */,
+ 03B2D3882C8A515C0046936E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 03B2D3892C8A515C0046936E /* Build configuration list for PBXNativeTarget "App" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 03B2D38A2C8A515C0046936E /* Debug */,
+ 03B2D38B2C8A515C0046936E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 03B2D38C2C8A515C0046936E /* Build configuration list for PBXNativeTarget "Tests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 03B2D38D2C8A515C0046936E /* Debug */,
+ 03B2D38E2C8A515C0046936E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 03B2D35C2C8A515A0046936E /* Project object */;
+}
diff --git a/extension/apple/Benchmark/Benchmark.xcodeproj/xcshareddata/xcschemes/Benchmark.xcscheme b/extension/apple/Benchmark/Benchmark.xcodeproj/xcshareddata/xcschemes/Benchmark.xcscheme
new file mode 100644
index 00000000000..ebfe1e5fd35
--- /dev/null
+++ b/extension/apple/Benchmark/Benchmark.xcodeproj/xcshareddata/xcschemes/Benchmark.xcscheme
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/extension/apple/Benchmark/Tests/Tests.mm b/extension/apple/Benchmark/Tests/Tests.mm
new file mode 100644
index 00000000000..5cf958765d3
--- /dev/null
+++ b/extension/apple/Benchmark/Tests/Tests.mm
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+#import
+
+#import
+
+#import
+#import
+
+using namespace ::executorch::extension;
+using namespace ::executorch::runtime;
+
+@interface Tests : XCTestCase
+@end
+
+@implementation Tests
+
++ (void)initialize {
+ if (self == [Tests class]) {
+ NSString *modelsDir = [[NSBundle bundleForClass:[self class]].resourcePath
+ stringByAppendingPathComponent:@"Models"];
+ NSArray *models =
+ [NSFileManager.defaultManager contentsOfDirectoryAtPath:modelsDir
+ error:nil];
+ for (NSString *model in models) {
+ NSString *modelName = model.stringByDeletingPathExtension;
+ NSString *modelPath = [modelsDir stringByAppendingPathComponent:model];
+ XCTAssertGreaterThan(modelPath.length, 0);
+
+ SEL testLoadSelector = NSSelectorFromString(
+ [NSString stringWithFormat:@"test_load_%@", modelName]);
+ IMP testLoadImplementation = imp_implementationWithBlock(^(id _self) {
+ auto __block module = std::make_unique(modelPath.UTF8String);
+ [_self
+ measureWithMetrics:@[ [XCTClockMetric new], [XCTMemoryMetric new] ]
+ options:XCTMeasureOptions.defaultOptions
+ block:^{
+ XCTAssertEqual(module->load_method("forward"),
+ Error::Ok);
+ }];
+ });
+ class_addMethod(
+ [self class], testLoadSelector, testLoadImplementation, "v@:");
+
+ SEL testForwardSelector = NSSelectorFromString(
+ [NSString stringWithFormat:@"test_forward_%@", modelName]);
+ IMP testForwardImplementation = imp_implementationWithBlock(^(id _self) {
+ auto __block module = std::make_unique(modelPath.UTF8String);
+ XCTAssertEqual(module->load_method("forward"), Error::Ok);
+
+ const auto method_meta = module->method_meta("forward");
+ XCTAssertEqual(method_meta.error(), Error::Ok);
+
+ const auto num_inputs = method_meta->num_inputs();
+ XCTAssertGreaterThan(num_inputs, 0);
+
+ std::vector> buffers;
+ buffers.reserve(num_inputs);
+ std::vector tensors;
+ tensors.reserve(num_inputs);
+ std::vector __block inputs;
+ inputs.reserve(num_inputs);
+
+ for (auto index = 0; index < num_inputs; ++index) {
+ auto input_tag = method_meta->input_tag(index);
+ XCTAssertEqual(input_tag.error(), Error::Ok);
+
+ switch (*input_tag) {
+ case Tag::Tensor: {
+ const auto tensor_meta = method_meta->input_tensor_meta(index);
+ XCTAssertEqual(tensor_meta.error(), Error::Ok);
+
+ const auto sizes = tensor_meta->sizes();
+ buffers.emplace_back(tensor_meta->nbytes(),
+ 0b01010101); // Set all bytes to be non-zero.
+ tensors.emplace_back(from_blob(buffers.rbegin()->data(),
+ {sizes.begin(), sizes.end()},
+ tensor_meta->scalar_type()));
+ inputs.emplace_back(tensors.back());
+ } break;
+ default:
+ XCTFail("Unsupported tag %i at input %d", *input_tag, index);
+ }
+ }
+ [_self
+ measureWithMetrics:@[ [XCTClockMetric new], [XCTMemoryMetric new] ]
+ options:XCTMeasureOptions.defaultOptions
+ block:^{
+ XCTAssertEqual(module->forward(inputs).error(),
+ Error::Ok);
+ }];
+ });
+ class_addMethod(
+ [self class], testForwardSelector, testForwardImplementation, "v@:");
+ }
+ }
+}
+
+@end
diff --git a/extension/apple/Benchmark/Tests/Tests.xcconfig b/extension/apple/Benchmark/Tests/Tests.xcconfig
new file mode 100644
index 00000000000..e8168046c3d
--- /dev/null
+++ b/extension/apple/Benchmark/Tests/Tests.xcconfig
@@ -0,0 +1,26 @@
+OTHER_LDFLAGS[sdk=iphonesimulator*] = $(inherited) \
+-force_load $(BUILT_PRODUCTS_DIR)/libexecutorch-simulator-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libkernels_portable-simulator-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libkernels_custom-simulator-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libkernels_quantized-simulator-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libbackend_coreml-simulator-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libbackend_mps-simulator-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libbackend_xnnpack-simulator-release.a
+
+OTHER_LDFLAGS[sdk=iphoneos*] = $(inherited) \
+-force_load $(BUILT_PRODUCTS_DIR)/libexecutorch-ios-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libkernels_portable-ios-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libkernels_custom-ios-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libkernels_quantized-ios-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libbackend_coreml-ios-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libbackend_mps-ios-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libbackend_xnnpack-ios-release.a
+
+OTHER_LDFLAGS[sdk=macos*] = $(inherited) \
+-force_load $(BUILT_PRODUCTS_DIR)/libexecutorch-macos-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libkernels_portable-macos-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libkernels_custom-macos-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libkernels_quantized-macos-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libbackend_coreml-macos-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libbackend_mps-macos-release.a \
+-force_load $(BUILT_PRODUCTS_DIR)/libbackend_xnnpack-macos-release.a
diff --git a/extension/apple/Benchmark/Tests/Tests.xctestplan b/extension/apple/Benchmark/Tests/Tests.xctestplan
new file mode 100644
index 00000000000..025f50f1942
--- /dev/null
+++ b/extension/apple/Benchmark/Tests/Tests.xctestplan
@@ -0,0 +1,28 @@
+{
+ "configurations" : [
+ {
+ "id" : "0430A5ED-FD8D-444E-9933-740E01CCD53C",
+ "name" : "Test Scheme Action",
+ "options" : {
+
+ }
+ }
+ ],
+ "defaultOptions" : {
+ "targetForVariableExpansion" : {
+ "containerPath" : "container:Benchmark.xcodeproj",
+ "identifier" : "03B2D3632C8A515A0046936E",
+ "name" : "App"
+ }
+ },
+ "testTargets" : [
+ {
+ "target" : {
+ "containerPath" : "container:Benchmark.xcodeproj",
+ "identifier" : "03B2D3742C8A515C0046936E",
+ "name" : "Tests"
+ }
+ }
+ ],
+ "version" : 1
+}