[runtime] add support for mono runtime interpreter (#3058)
* [runtime] build interp-, icalltable- and ilgen libraries so they can be consumed in interpreter configuration * [mtouch] add --interpreter configuration support * [xharness] Add support for removing defines from cloned project files. * [xharness] Run monotouch-test, mscorlib and mini tests with the interpreter too. They're ignored for now, which means we won't run them on the bots. * [mtouch] We're using dlsym when using the interpreter. * [xharness] enable mini regression tests with interpreter on CI
This commit is contained in:
Родитель
2e5ee3e90a
Коммит
394117885c
|
@ -1112,11 +1112,17 @@ install-ios: install-iphoneos
|
|||
$(eval TARGET_LIBMONOSGEN:=$(TARGET_LIBMONOSGEN) $(BUILD_DESTDIR)/$(2)/lib/libmonosgen-2.0.a)
|
||||
$(eval TARGET_SHAREDMONOSGEN:=$(TARGET_SHAREDMONOSGEN) $(BUILD_DESTDIR)/$(2)/tmp-lib/libmonosgen-2.0.dylib)
|
||||
$(eval TARGET_LIBLOGPROFILER:=$(TARGET_LIBLOGPROFILER) $(BUILD_DESTDIR)/$(2)/lib/libmono-profiler-log-static.a)
|
||||
$(eval TARGET_LIBMONOEEINTERP:=$(TARGET_LIBMONOEEINTERP) $(BUILD_DESTDIR)/$(2)/lib/libmono-ee-interp.a)
|
||||
$(eval TARGET_LIBMONOICALLTABLE:=$(TARGET_LIBMONOICALLTABLE) $(BUILD_DESTDIR)/$(2)/lib/libmono-icall-table.a)
|
||||
$(eval TARGET_LIBMONOILGEN:=$(TARGET_LIBMONOILGEN) $(BUILD_DESTDIR)/$(2)/lib/libmono-ilgen.a)
|
||||
$(eval TARGET_SHAREDLIBLOGPROFILER:=$(TARGET_SHAREDLIBLOGPROFILER) $(BUILD_DESTDIR)/$(2)/tmp-lib/libmono-profiler-log.0.dylib)
|
||||
$(eval TARGET_MONOFRAMEWORK:=$(TARGET_MONOFRAMEWORK) $(BUILD_DESTDIR)/$(2)/tmp-lib/Mono)
|
||||
|
||||
$(BUILD_DESTDIR)/$(2)/lib/libmonosgen-2.0.a: .stamp-build-$(2)
|
||||
$(BUILD_DESTDIR)/$(2)/lib/libmono-profiler-log-static.a: .stamp-build-$(2)
|
||||
$(BUILD_DESTDIR)/$(2)/lib/libmono-ee-interp.a: .stamp-build-$(2)
|
||||
$(BUILD_DESTDIR)/$(2)/lib/libmono-icall-table.a: .stamp-build-$(2)
|
||||
$(BUILD_DESTDIR)/$(2)/lib/libmono-ilgen.a: .stamp-build-$(2)
|
||||
$(BUILD_DESTDIR)/$(2)/lib/libmono-profiler-log.a: .stamp-build-$(2)
|
||||
|
||||
$(BUILD_DESTDIR)/$(2)/tmp-lib:
|
||||
|
@ -1190,6 +1196,9 @@ IPHONEOS_TARGETS = \
|
|||
$(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib/libmonosgen-2.0.a \
|
||||
$(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib/libmonosgen-2.0.dylib \
|
||||
$(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib/libmono-profiler-log.a \
|
||||
$(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib/libmono-ee-interp.a \
|
||||
$(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib/libmono-icall-table.a \
|
||||
$(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib/libmono-ilgen.a \
|
||||
$(LIBMONO_PROFILER_IPHONEOS_DYLIB) \
|
||||
$(IOS_DESTDIR)$(IPHONEOS_SDK)/Frameworks/Mono.framework/Mono \
|
||||
$(IOS_DESTDIR)$(IPHONEOS_SDK)/Frameworks/Mono.framework/Info.plist \
|
||||
|
@ -1209,6 +1218,15 @@ $(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib/libmonosgen-2.0.dylib: $(TARGET_SHAREDMONOS
|
|||
$(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib/libmono-profiler-log.a: $(TARGET_LIBLOGPROFILER) | $(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib
|
||||
$(Q) lipo $(TARGET_LIBLOGPROFILER) -create -output $@
|
||||
|
||||
$(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib/libmono-ee-interp.a: $(TARGET_LIBMONOEEINTERP) | $(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib
|
||||
$(Q) lipo $(TARGET_LIBMONOEEINTERP) -create -output $@
|
||||
|
||||
$(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib/libmono-icall-table.a: $(TARGET_LIBMONOICALLTABLE) | $(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib
|
||||
$(Q) lipo $(TARGET_LIBMONOICALLTABLE) -create -output $@
|
||||
|
||||
$(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib/libmono-ilgen.a: $(TARGET_LIBMONOILGEN) | $(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib
|
||||
$(Q) lipo $(TARGET_LIBMONOILGEN) -create -output $@
|
||||
|
||||
$(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib/libmono-profiler-log.dylib: $(TARGET_SHAREDLIBLOGPROFILER) | $(IOS_DESTDIR)$(IPHONEOS_PREFIX)/lib
|
||||
$(Q) lipo $(TARGET_SHAREDLIBLOGPROFILER) -create -output $@
|
||||
$(Q) dsymutil -t 4 -o $@.dSYM $@
|
||||
|
@ -1267,11 +1285,17 @@ clean-watchos: clean-targetwatch
|
|||
WATCHOS_TARGET_LIBMONOSGEN = $(BUILD_DESTDIR)/targetwatch/lib/libmonosgen-2.0.a
|
||||
WATCHOS_TARGET_SHAREDMONOSGEN = $(BUILD_DESTDIR)/targetwatch/lib/libmonosgen-2.0.dylib
|
||||
WATCHOS_TARGET_LIBLOGPROFILER = $(BUILD_DESTDIR)/targetwatch/lib/libmono-profiler-log-static.a
|
||||
WATCHOS_TARGET_LIBMONOEEINTERP = $(BUILD_DESTDIR)/targetwatch/lib/libmono-ee-interp.a
|
||||
WATCHOS_TARGET_LIBMONOICALLTABLE = $(BUILD_DESTDIR)/targetwatch/lib/libmono-icall-table.a
|
||||
WATCHOS_TARGET_LIBMONOILGEN = $(BUILD_DESTDIR)/targetwatch/lib/libmono-ilgen.a
|
||||
WATCHOS_TARGET_SHAREDLIBLOGPROFILER = $(BUILD_DESTDIR)/targetwatch/lib/libmono-profiler-log.0.dylib
|
||||
|
||||
$(WATCHOS_TARGET_LIBMONOSGEN): .stamp-build-targetwatch
|
||||
$(WATCHOS_TARGET_SHAREDMONOSGEN): .stamp-build-targetwatch
|
||||
$(WATCHOS_TARGET_LIBLOGPROFILER): .stamp-build-targetwatch
|
||||
$(WATCHOS_TARGET_LIBMONOEEINTERP): .stamp-build-targetwatch
|
||||
$(WATCHOS_TARGET_LIBMONOICALLTABLE): .stamp-build-targetwatch
|
||||
$(WATCHOS_TARGET_LIBMONOILGEN): .stamp-build-targetwatch
|
||||
$(WATCHOS_TARGET_SHAREDLIBLOGPROFILER): .stamp-build-targetwatch
|
||||
|
||||
device:: watchos
|
||||
|
@ -1280,6 +1304,9 @@ WATCHOS_TARGETS = \
|
|||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/libmonosgen-2.0.a \
|
||||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/libmonosgen-2.0.dylib \
|
||||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/libmono-profiler-log.a \
|
||||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/libmono-ee-interp.a \
|
||||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/libmono-icall-table.a \
|
||||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/libmono-ilgen.a \
|
||||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/Frameworks/Mono.framework/Mono \
|
||||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/Frameworks/Mono.framework/Info.plist \
|
||||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/libmono-profiler-log.dylib \
|
||||
|
@ -1299,6 +1326,15 @@ $(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/libmonosgen-2.0.dylib: $(WATCHOS_TA
|
|||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/libmono-profiler-log.a: $(WATCHOS_TARGET_LIBLOGPROFILER) | $(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib
|
||||
$(Q) $(WATCHOS_BIN_PATH)/lipo $(WATCHOS_TARGET_LIBLOGPROFILER) -create -output $@
|
||||
|
||||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/libmono-ee-interp.a: $(WATCHOS_TARGET_LIBMONOEEINTERP) | $(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib
|
||||
$(Q) $(WATCHOS_BIN_PATH)/lipo $(WATCHOS_TARGET_LIBMONOEEINTERP) -create -output $@
|
||||
|
||||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/libmono-icall-table.a: $(WATCHOS_TARGET_LIBMONOICALLTABLE) | $(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib
|
||||
$(Q) $(WATCHOS_BIN_PATH)/lipo $(WATCHOS_TARGET_LIBMONOICALLTABLE) -create -output $@
|
||||
|
||||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/libmono-ilgen.a: $(WATCHOS_TARGET_LIBMONOILGEN) | $(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib
|
||||
$(Q) $(WATCHOS_BIN_PATH)/lipo $(WATCHOS_TARGET_LIBMONOILGEN) -create -output $@
|
||||
|
||||
$(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib/libmono-profiler-log.dylib: $(WATCHOS_TARGET_SHAREDLIBLOGPROFILER) | $(IOS_DESTDIR)$(XAMARIN_WATCHOS_SDK)/usr/lib
|
||||
$(Q) $(WATCHOS_BIN_PATH)/bitcode_strip $(WATCHOS_TARGET_SHAREDLIBLOGPROFILER) -m -o $@
|
||||
$(Q) $(WATCHOS_BIN_PATH)/install_name_tool -id @rpath/libmono-profiler-log.dylib -change $(SDK_DESTDIR)/ios-targetwatch-release/lib/libmonosgen-2.0.1.dylib @rpath/libmonosgen-2.0.dylib $@
|
||||
|
@ -1360,11 +1396,17 @@ clean-tvos: clean-targettv
|
|||
TVOS_TARGET_LIBMONOSGEN = $(BUILD_DESTDIR)/targettv/lib/libmonosgen-2.0.a
|
||||
TVOS_TARGET_SHAREDMONOSGEN = $(BUILD_DESTDIR)/targettv/lib/libmonosgen-2.0.dylib
|
||||
TVOS_TARGET_LIBLOGPROFILER = $(BUILD_DESTDIR)/targettv/lib/libmono-profiler-log-static.a
|
||||
TVOS_TARGET_LIBMONOEEINTERP = $(BUILD_DESTDIR)/targettv/lib/libmono-ee-interp.a
|
||||
TVOS_TARGET_LIBMONOICALLTABLE = $(BUILD_DESTDIR)/targettv/lib/libmono-icall-table.a
|
||||
TVOS_TARGET_LIBMONOILGEN = $(BUILD_DESTDIR)/targettv/lib/libmono-ilgen.a
|
||||
TVOS_TARGET_SHAREDLIBLOGPROFILER = $(BUILD_DESTDIR)/targettv/lib/libmono-profiler-log.0.dylib
|
||||
|
||||
$(TVOS_TARGET_LIBMONOSGEN): .stamp-build-targettv
|
||||
$(TVOS_TARGET_SHAREDMONOSGEN): .stamp-build-targettv
|
||||
$(TVOS_TARGET_LIBLOGPROFILER): .stamp-build-targettv
|
||||
$(TVOS_TARGET_LIBMONOEEINTERP): .stamp-build-targettv
|
||||
$(TVOS_TARGET_LIBMONOICALLTABLE): .stamp-build-targettv
|
||||
$(TVOS_TARGET_LIBMONOILGEN): .stamp-build-targettv
|
||||
$(TVOS_TARGET_SHAREDLIBLOGPROFILER): .stamp-build-targettv
|
||||
|
||||
device:: tvos
|
||||
|
@ -1373,6 +1415,9 @@ TVOS_TARGETS = \
|
|||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/libmonosgen-2.0.a \
|
||||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/libmonosgen-2.0.dylib \
|
||||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/libmono-profiler-log.a \
|
||||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/libmono-ee-interp.a \
|
||||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/libmono-icall-table.a \
|
||||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/libmono-ilgen.a \
|
||||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/Frameworks/Mono.framework/Mono \
|
||||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/Frameworks/Mono.framework/Info.plist \
|
||||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/libmono-profiler-log.dylib \
|
||||
|
@ -1392,6 +1437,15 @@ $(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/libmonosgen-2.0.dylib: $(TVOS_TARGET_S
|
|||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/libmono-profiler-log.a: $(TVOS_TARGET_LIBLOGPROFILER) | $(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib
|
||||
$(Q) $(TVOS_BIN_PATH)/lipo $(TVOS_TARGET_LIBLOGPROFILER) -create -output $@
|
||||
|
||||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/libmono-ee-interp.a: $(TVOS_TARGET_LIBMONOEEINTERP) | $(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib
|
||||
$(Q) $(TVOS_BIN_PATH)/lipo $(TVOS_TARGET_LIBMONOEEINTERP) -create -output $@
|
||||
|
||||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/libmono-icall-table.a: $(TVOS_TARGET_LIBMONOICALLTABLE) | $(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib
|
||||
$(Q) $(TVOS_BIN_PATH)/lipo $(TVOS_TARGET_LIBMONOICALLTABLE) -create -output $@
|
||||
|
||||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/libmono-ilgen.a: $(TVOS_TARGET_LIBMONOILGEN) | $(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib
|
||||
$(Q) $(TVOS_BIN_PATH)/lipo $(TVOS_TARGET_LIBMONOILGEN) -create -output $@
|
||||
|
||||
$(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib/libmono-profiler-log.dylib: $(TVOS_TARGET_SHAREDLIBLOGPROFILER) | $(IOS_DESTDIR)$(XAMARIN_TVOS_SDK)/usr/lib
|
||||
$(Q) lipo $(TVOS_TARGET_SHAREDLIBLOGPROFILER) -create -output $@
|
||||
$(Q) $(TVOS_BIN_PATH)/install_name_tool -id @rpath/libmono-profiler-log.dylib -change $(SDK_DESTDIR)/ios-targettv-release/lib/libmonosgen-2.0.1.dylib @rpath/libmonosgen-2.0.dylib $@
|
||||
|
|
|
@ -106,6 +106,9 @@ namespace Xamarin.iOS.Tasks
|
|||
[Required]
|
||||
public bool EnableSGenConc { get; set; }
|
||||
|
||||
[Required]
|
||||
public bool UseInterpreter { get; set; }
|
||||
|
||||
[Required]
|
||||
public bool LinkerDumpDependencies { get; set; }
|
||||
|
||||
|
@ -400,6 +403,9 @@ namespace Xamarin.iOS.Tasks
|
|||
if (EnableSGenConc)
|
||||
args.AddLine ("--sgen-conc");
|
||||
|
||||
if (UseInterpreter)
|
||||
args.Add ("--interpreter");
|
||||
|
||||
switch (LinkMode.ToLowerInvariant ()) {
|
||||
case "sdkonly": args.AddLine ("--linksdkonly"); break;
|
||||
case "none": args.AddLine ("--nolink"); break;
|
||||
|
|
|
@ -51,6 +51,7 @@ Copyright (C) 2013-2016 Xamarin. All rights reserved.
|
|||
<MtouchUseThumb Condition="'$(MtouchUseThumb)' == ''">False</MtouchUseThumb>
|
||||
<MtouchProjectDirectory>$(MSBuildProjectDirectory)</MtouchProjectDirectory>
|
||||
<MtouchEnableSGenConc Condition="'$(MtouchEnableSGenConc)' == ''">False</MtouchEnableSGenConc>
|
||||
<MtouchUseInterpreter Condition="'$(MtouchUseInterpreter)' == ''">False</MtouchUseInterpreter>
|
||||
<MtouchVerbosity Condition="$(MtouchVerbosity) == ''">2</MtouchVerbosity>
|
||||
|
||||
<IsMacEnabled>true</IsMacEnabled>
|
||||
|
|
|
@ -828,6 +828,7 @@ Copyright (C) 2013-2016 Xamarin. All rights reserved.
|
|||
UseThumb="$(MtouchUseThumb)"
|
||||
EnableBitcode="$(MtouchEnableBitcode)"
|
||||
EnableSGenConc="$(MtouchEnableSGenConc)"
|
||||
UseInterpreter="$(MtouchUseInterpreter)"
|
||||
AppExtensionReferences="@(_ResolvedAppExtensionReferences)"
|
||||
ArchiveSymbols="$(MonoSymbolArchive)"
|
||||
Verbosity="$(MtouchVerbosity)"
|
||||
|
|
|
@ -263,7 +263,9 @@ typedef enum {
|
|||
MONO_AOT_MODE_NORMAL,
|
||||
MONO_AOT_MODE_HYBRID,
|
||||
MONO_AOT_MODE_FULL,
|
||||
MONO_AOT_MODE_LLVMONLY
|
||||
MONO_AOT_MODE_LLVMONLY,
|
||||
MONO_AOT_MODE_INTERP,
|
||||
MONO_AOT_MODE_INTERP_LLVMONLY,
|
||||
} MonoAotMode;
|
||||
|
||||
/* metadata/marshal.h */
|
||||
|
|
|
@ -157,6 +157,7 @@ namespace xharness
|
|||
public bool Profiling;
|
||||
public string LinkMode;
|
||||
public string Defines;
|
||||
public string Undefines;
|
||||
public bool Ignored;
|
||||
}
|
||||
|
||||
|
@ -180,6 +181,13 @@ namespace xharness
|
|||
case "monotouch-test":
|
||||
yield return new TestData { Variation = "Release (all optimizations)", MTouchExtraArgs = "--registrar:static --optimize:all", Debug = false, Profiling = false, Defines = "OPTIMIZEALL" };
|
||||
yield return new TestData { Variation = "Debug (all optimizations)", MTouchExtraArgs = "--registrar:static --optimize:all", Debug = true, Profiling = false, Defines = "OPTIMIZEALL" };
|
||||
yield return new TestData { Variation = "Debug (interpreter)", MTouchExtraArgs = "--interpreter", Debug = true, Profiling = false, Ignored = true, };
|
||||
break;
|
||||
case "mscorlib":
|
||||
yield return new TestData { Variation = "Debug (interpreter)", MTouchExtraArgs = "--interpreter", Debug = true, Profiling = false, Ignored = true, Undefines = "FULL_AOT_RUNTIME" };
|
||||
break;
|
||||
case "mini":
|
||||
yield return new TestData { Variation = "Debug (interpreter)", MTouchExtraArgs = "--interpreter", Debug = true, Profiling = false, Undefines = "FULL_AOT_RUNTIME" };
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -231,6 +239,7 @@ namespace xharness
|
|||
var profiling = test_data.Profiling;
|
||||
var link_mode = test_data.LinkMode;
|
||||
var defines = test_data.Defines;
|
||||
var undefines = test_data.Undefines;
|
||||
var ignored = test_data.Ignored;
|
||||
|
||||
var clone = task.TestProject.Clone ();
|
||||
|
@ -264,7 +273,15 @@ namespace xharness
|
|||
pr.Xml.Save (pr.Path);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if (!string.IsNullOrEmpty (undefines)) {
|
||||
clone.Xml.RemoveDefines (undefines, task.ProjectPlatform, configuration);
|
||||
if (clone.ProjectReferences != null) {
|
||||
foreach (var pr in clone.ProjectReferences) {
|
||||
pr.Xml.RemoveDefines (undefines, task.ProjectPlatform, configuration);
|
||||
pr.Xml.Save (pr.Path);
|
||||
}
|
||||
}
|
||||
}
|
||||
clone.Xml.SetNode (isMac ? "Profiling" : "MTouchProfiling", profiling ? "True" : "False", task.ProjectPlatform, configuration);
|
||||
|
||||
|
|
|
@ -635,6 +635,35 @@ namespace xharness
|
|||
}
|
||||
}
|
||||
|
||||
public static void RemoveDefines (this XmlDocument csproj, string defines, string platform, string configuration)
|
||||
{
|
||||
var separator = new char [] { ';' };
|
||||
var defs = defines.Split (separator, StringSplitOptions.RemoveEmptyEntries);
|
||||
var projnode = csproj.SelectNodes ("//*[local-name() = 'PropertyGroup']/*[local-name() = 'DefineConstants']");
|
||||
foreach (XmlNode xmlnode in projnode) {
|
||||
if (string.IsNullOrEmpty (xmlnode.InnerText))
|
||||
continue;
|
||||
|
||||
var parent = xmlnode.ParentNode;
|
||||
if (!IsNodeApplicable (parent, platform, configuration))
|
||||
continue;
|
||||
|
||||
var existing = xmlnode.InnerText.Split (separator, StringSplitOptions.RemoveEmptyEntries);
|
||||
var any = false;
|
||||
foreach (var def in defs) {
|
||||
for (var i = 0; i < existing.Length; i++) {
|
||||
if (existing [i] == def) {
|
||||
existing [i] = null;
|
||||
any = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!any)
|
||||
continue;
|
||||
xmlnode.InnerText = string.Join (separator [0].ToString (), existing.Where ((v) => !string.IsNullOrEmpty (v)));
|
||||
}
|
||||
}
|
||||
|
||||
public static void AddAdditionalDefines (this XmlDocument csproj, string value, string platform, string configuration)
|
||||
{
|
||||
var projnode = csproj.SelectNodes ("//*[local-name() = 'PropertyGroup' and @Condition]/*[local-name() = 'DefineConstants']");
|
||||
|
|
|
@ -63,6 +63,7 @@ namespace Xamarin.Bundler {
|
|||
|
||||
public bool? EnableCoopGC;
|
||||
public bool EnableSGenConc;
|
||||
public bool UseInterpreter;
|
||||
public MarshalObjectiveCExceptionMode MarshalObjectiveCExceptions;
|
||||
public MarshalManagedExceptionMode MarshalManagedExceptions;
|
||||
|
||||
|
|
|
@ -443,6 +443,9 @@ namespace Xamarin.Bundler {
|
|||
if (EnableLLVMOnlyBitCode)
|
||||
return false;
|
||||
|
||||
if (UseInterpreter)
|
||||
return true;
|
||||
|
||||
switch (Platform) {
|
||||
case ApplePlatform.iOS:
|
||||
return !Profile.IsSdkAssembly (Path.GetFileNameWithoutExtension (assembly));
|
||||
|
@ -2100,7 +2103,7 @@ namespace Xamarin.Bundler {
|
|||
|
||||
public void BundleAssemblies ()
|
||||
{
|
||||
var strip = ManagedStrip && IsDeviceBuild && !EnableDebug && !PackageManagedDebugSymbols;
|
||||
var strip = !UseInterpreter && ManagedStrip && IsDeviceBuild && !EnableDebug && !PackageManagedDebugSymbols;
|
||||
|
||||
var grouped = Targets.SelectMany ((Target t) => t.Assemblies).GroupBy ((Assembly asm) => asm.Identity);
|
||||
foreach (var @group in grouped) {
|
||||
|
|
|
@ -52,6 +52,16 @@ namespace Xamarin.Bundler {
|
|||
}
|
||||
}
|
||||
|
||||
public bool IsAOTCompiled {
|
||||
get {
|
||||
if (App.UseInterpreter)
|
||||
/* interpreter only requires a few stubs that are attached
|
||||
* to mscorlib.dll, other assemblies won't be AOT compiled */
|
||||
return FileName == "mscorlib.dll";
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Recursively list all the assemblies the specified assembly depends on.
|
||||
HashSet<string> ComputeDependencies (List<Exception> warnings)
|
||||
{
|
||||
|
|
|
@ -926,6 +926,9 @@ namespace Xamarin.Bundler
|
|||
|
||||
// Here we create the tasks to run the AOT compiler.
|
||||
foreach (var a in Assemblies) {
|
||||
if (!a.IsAOTCompiled)
|
||||
continue;
|
||||
|
||||
foreach (var abi in GetArchitectures (a.BuildTarget)) {
|
||||
a.CreateAOTTask (abi);
|
||||
}
|
||||
|
@ -936,6 +939,9 @@ namespace Xamarin.Bundler
|
|||
foreach (var @group in grouped) {
|
||||
var name = @group.Key;
|
||||
var assemblies = @group.AsEnumerable ().ToArray ();
|
||||
if (assemblies.Length <= 0)
|
||||
continue;
|
||||
|
||||
// We ensure elsewhere that all assemblies in a group have the same build target.
|
||||
var build_target = assemblies [0].BuildTarget;
|
||||
|
||||
|
@ -946,8 +952,10 @@ namespace Xamarin.Bundler
|
|||
string compiler_output;
|
||||
var compiler_flags = new CompilerFlags (this);
|
||||
var link_dependencies = new List<CompileTask> ();
|
||||
var infos = assemblies.Select ((asm) => asm.AotInfos [abi]).ToList ();
|
||||
var infos = assemblies.Where ((asm) => asm.AotInfos.ContainsKey (abi)).Select ((asm) => asm.AotInfos [abi]).ToList ();
|
||||
var aottasks = infos.Select ((info) => info.Task);
|
||||
if (aottasks == null)
|
||||
continue;
|
||||
|
||||
var existingLinkTask = infos.Where ((v) => v.LinkTask != null).Select ((v) => v.LinkTask).ToList ();
|
||||
if (existingLinkTask.Count > 0) {
|
||||
|
@ -1102,6 +1110,9 @@ namespace Xamarin.Bundler
|
|||
}
|
||||
}
|
||||
|
||||
if (App.UseInterpreter)
|
||||
return;
|
||||
|
||||
// Code in one assembly (either in a P/Invoke or a third-party library) can depend on a third-party library in another assembly.
|
||||
// This means that we must always build assemblies only when all their dependent assemblies have been built, so that
|
||||
// we can link (natively) with the frameworks/dylibs for those dependent assemblies.
|
||||
|
@ -1450,6 +1461,15 @@ namespace Xamarin.Bundler
|
|||
}
|
||||
}
|
||||
|
||||
if (App.UseInterpreter) {
|
||||
string libinterp = Path.Combine (libdir, "libmono-ee-interp.a");
|
||||
linker_flags.AddLinkWith (libinterp);
|
||||
string libicalltable = Path.Combine (libdir, "libmono-icall-table.a");
|
||||
linker_flags.AddLinkWith (libicalltable);
|
||||
string libilgen = Path.Combine (libdir, "libmono-ilgen.a");
|
||||
linker_flags.AddLinkWith (libilgen);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty (App.UserGccFlags))
|
||||
linker_flags.AddOtherFlag (App.UserGccFlags);
|
||||
|
||||
|
|
|
@ -455,6 +455,7 @@ namespace Xamarin.Bundler
|
|||
bool enable_debug = app.EnableDebug;
|
||||
bool enable_debug_symbols = app.PackageManagedDebugSymbols;
|
||||
bool llvm_only = app.EnableLLVMOnlyBitCode;
|
||||
bool interp = app.UseInterpreter;
|
||||
string arch = abi.AsArchString ();
|
||||
|
||||
args.Append ("--debug ");
|
||||
|
@ -462,7 +463,7 @@ namespace Xamarin.Bundler
|
|||
if (enable_llvm)
|
||||
args.Append ("--llvm ");
|
||||
|
||||
if (!llvm_only)
|
||||
if (!llvm_only && !interp)
|
||||
args.Append ("-O=gsharedvt ");
|
||||
args.Append (app.AotOtherArguments).Append (" ");
|
||||
args.Append ("--aot=mtriple=");
|
||||
|
@ -472,6 +473,8 @@ namespace Xamarin.Bundler
|
|||
args.Append (app.AotArguments);
|
||||
if (llvm_only)
|
||||
args.Append ("llvmonly,");
|
||||
else if (interp)
|
||||
args.Append ("interp,");
|
||||
else
|
||||
args.Append ("full,");
|
||||
|
||||
|
@ -555,6 +558,8 @@ namespace Xamarin.Bundler
|
|||
|
||||
register_assemblies.AppendLine ("\tguint32 exception_gchandle = 0;");
|
||||
foreach (var s in assemblies) {
|
||||
if (!s.IsAOTCompiled)
|
||||
continue;
|
||||
if ((abi & Abi.SimulatorArchMask) == 0) {
|
||||
var info = s.AssemblyDefinition.Name.Name;
|
||||
info = EncodeAotSymbol (info);
|
||||
|
@ -635,6 +640,14 @@ namespace Xamarin.Bundler
|
|||
sw.WriteLine ("xamarin_profiler_symbol_def xamarin_profiler_symbol = NULL;");
|
||||
}
|
||||
|
||||
if (app.UseInterpreter) {
|
||||
sw.WriteLine ("extern \"C\" { void mono_ee_interp_init (const char *); }");
|
||||
sw.WriteLine ("extern \"C\" { void mono_icall_table_init (void); }");
|
||||
sw.WriteLine ("extern \"C\" { void mono_marshal_ilgen_init (void); }");
|
||||
sw.WriteLine ("extern \"C\" { void mono_method_builder_ilgen_init (void); }");
|
||||
sw.WriteLine ("extern \"C\" { void mono_sgen_mono_ilgen_init (void); }");
|
||||
}
|
||||
|
||||
sw.WriteLine ("void xamarin_setup_impl ()");
|
||||
sw.WriteLine ("{");
|
||||
|
||||
|
@ -643,7 +656,15 @@ namespace Xamarin.Bundler
|
|||
|
||||
if (app.EnableLLVMOnlyBitCode)
|
||||
sw.WriteLine ("\tmono_jit_set_aot_mode (MONO_AOT_MODE_LLVMONLY);");
|
||||
|
||||
else if (app.UseInterpreter) {
|
||||
sw.WriteLine ("\tmono_icall_table_init ();");
|
||||
sw.WriteLine ("\tmono_marshal_ilgen_init ();");
|
||||
sw.WriteLine ("\tmono_method_builder_ilgen_init ();");
|
||||
sw.WriteLine ("\tmono_sgen_mono_ilgen_init ();");
|
||||
sw.WriteLine ("\tmono_ee_interp_init (NULL);");
|
||||
sw.WriteLine ("\tmono_jit_set_aot_mode (MONO_AOT_MODE_INTERP);");
|
||||
}
|
||||
|
||||
if (assembly_location.Length > 0)
|
||||
sw.WriteLine ("\txamarin_set_assembly_directories (&assembly_locations);");
|
||||
|
||||
|
@ -843,6 +864,9 @@ namespace Xamarin.Bundler
|
|||
if (app.EnableSGenConc)
|
||||
return false;
|
||||
|
||||
if (app.UseInterpreter)
|
||||
return false;
|
||||
|
||||
if (app.Registrar == RegistrarMode.Static)
|
||||
return false;
|
||||
|
||||
|
@ -1230,6 +1254,7 @@ namespace Xamarin.Bundler
|
|||
app.LLVMOptimizations [asm] = opt;
|
||||
}
|
||||
},
|
||||
{ "interpreter", "Enable the *experimental* interpreter.", v => { app.UseInterpreter = true; }},
|
||||
{ "http-message-handler=", "Specify the default HTTP message handler for HttpClient", v => { http_message_handler = v; }},
|
||||
{ "output-format=", "Specify the output format for some commands. Possible values: Default, XML", v =>
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче