static string OutputDir;
static string MonodroidDir = @"";
+ static string AndroidNdkPath = @"";
static string MaccoreDir = @"";
+ static string TargetDir = @"";
public enum TargetPlatform
{
Targets.Add (new Target {
Platform = TargetPlatform.Android,
Triple = "i686-none-linux-android",
- Build = "mono-x86",
Defines = { "TARGET_X86" }
});
Targets.Add (new Target {
Platform = TargetPlatform.Android,
Triple = "x86_64-none-linux-android",
- Build = "mono-x86_64",
Defines = { "TARGET_AMD64" }
});
Targets.Add (new Target {
Platform = TargetPlatform.Android,
Triple = "armv5-none-linux-androideabi",
- Build = "mono-armv6",
Defines = { "TARGET_ARM", "ARM_FPU_VFP", "HAVE_ARMV5" }
});
Targets.Add (new Target {
Platform = TargetPlatform.Android,
Triple = "armv7-none-linux-androideabi",
- Build = "mono-armv7",
Defines = { "TARGET_ARM", "ARM_FPU_VFP", "HAVE_ARMV5", "HAVE_ARMV6",
"HAVE_ARMV7"
}
Targets.Add (new Target {
Platform = TargetPlatform.Android,
Triple = "aarch64-v8a-linux-android",
- Build = "mono-aarch64",
Defines = { "TARGET_ARM64" }
});
/*Targets.Add(new Target {
Platform = TargetPlatform.Android,
Triple = "mipsel-none-linux-android",
- Build = "mono-mips",
Defines = { "TARGET_MIPS", "__mips__" }
});*/
var options = new DriverOptions();
- var log = new TextDiagnosticPrinter();
- var driver = new Driver(options, log);
+ var driver = new Driver(options);
Setup(driver, target);
driver.Setup();
if (!driver.ParseCode())
return;
- Dump(driver.ASTContext, driver.TargetInfo, target);
+ Dump(driver.Context.ASTContext, driver.Context.TargetInfo, target);
}
}
foreach (var header in driver.Options.Headers)
{
var source = driver.Project.AddFile(header);
- source.Options = driver.BuildParseOptions(source);
+ source.Options = driver.BuildParserOptions(source);
if (header.Contains ("mini"))
continue;
- source.Options.addDefines ("HAVE_SGEN_GC");
- source.Options.addDefines ("HAVE_MOVING_COLLECTOR");
+ source.Options.AddDefines ("HAVE_SGEN_GC");
+ source.Options.AddDefines ("HAVE_MOVING_COLLECTOR");
}
}
static string GetAndroidNdkPath()
{
+ if (!String.IsNullOrEmpty (AndroidNdkPath))
+ return AndroidNdkPath;
+
// Find the Android NDK's path from Monodroid's config.
var configFile = Path.Combine(MonodroidDir, "env.config");
if (!File.Exists(configFile))
{ "abi=", "ABI triple to generate", v => Abis.Add(v) },
{ "o|out=", "output directory", v => OutputDir = v },
{ "maccore=", "include directory", v => MaccoreDir = v },
- { "monodroid=", "include directory", v => MonodroidDir = v },
+ { "monodroid=", "top monodroid directory", v => MonodroidDir = v },
+ { "android-ndk=", "Path to Android NDK", v => AndroidNdkPath = v },
+ { "targetdir=", "Path to the directory containing the mono build", v =>TargetDir = v },
{ "mono=", "include directory", v => MonoDir = v },
{ "h|help", "show this message and exit", v => showHelp = v != null },
};
if (showHelp)
{
// Print usage and exit.
- Console.WriteLine("{0} [--abi=triple] [--out=dir] "
- + "[--monodroid/maccore=dir] [--mono=dir]",
+ Console.WriteLine("{0} <options>",
AppDomain.CurrentDomain.FriendlyName);
+ options.WriteOptionDescriptions (Console.Out);
Environment.Exit(0);
}
}
{
var options = driver.Options;
options.DryRun = true;
- options.Verbose = false;
options.LibraryName = "Mono";
- options.MicrosoftMode = false;
- options.addArguments("-xc");
- options.addArguments("-std=gnu99");
- options.addDefines("CPPSHARP");
+
+ var parserOptions = driver.ParserOptions;
+ parserOptions.Verbose = false;
+ parserOptions.MicrosoftMode = false;
+ parserOptions.AddArguments("-xc");
+ parserOptions.AddArguments("-std=gnu99");
+ parserOptions.AddDefines("CPPSHARP");
foreach (var define in target.Defines)
- options.addDefines(define);
+ parserOptions.AddDefines(define);
SetupToolchainPaths(driver, target);
- SetupMono(options, target);
+ SetupMono(driver, target);
}
- static void SetupMono(DriverOptions options, Target target)
+ static void SetupMono(Driver driver, Target target)
{
- string targetPath;
+ string targetBuild;
switch (target.Platform) {
case TargetPlatform.Android:
- targetPath = Path.Combine (MonodroidDir, "builds");
+ if (TargetDir == "") {
+ Console.Error.WriteLine ("The --targetdir= option is required when targeting android.");
+ Environment.Exit (1);
+ }
+ if (MonoDir == "") {
+ Console.Error.WriteLine ("The --mono= option is required when targeting android.");
+ Environment.Exit (1);
+ }
+ if (Abis.Count != 1) {
+ Console.Error.WriteLine ("Exactly one --abi= argument is required when targeting android.");
+ Environment.Exit (1);
+ }
+ targetBuild = TargetDir;
break;
case TargetPlatform.WatchOS:
- case TargetPlatform.iOS:
- targetPath = Path.Combine (MaccoreDir, "builds");
+ case TargetPlatform.iOS: {
+ string targetPath = Path.Combine (MaccoreDir, "builds");
+ if (!Directory.Exists (MonoDir))
+ MonoDir = Path.GetFullPath (Path.Combine (targetPath, "../../mono"));
+ targetBuild = Path.Combine(targetPath, target.Build);
break;
+ }
default:
throw new ArgumentOutOfRangeException ();
}
- if (!Directory.Exists (MonoDir)) {
- MonoDir = Path.GetFullPath (Path.Combine (targetPath, "../../mono"));
- }
-
- var targetBuild = Path.Combine(targetPath, target.Build);
-
if (!Directory.Exists(targetBuild))
throw new Exception(string.Format("Could not find the target build directory: {0}", targetBuild));
};
foreach (var inc in includeDirs)
- options.addIncludeDirs(inc);
+ driver.ParserOptions.AddIncludeDirs(inc);
var filesToParse = new[]
{
};
foreach (var file in filesToParse)
- options.Headers.Add(file);
+ driver.Options.Headers.Add(file);
}
static void SetupMSVC(Driver driver, string triple)
{
- var options = driver.Options;
+ var parserOptions = driver.ParserOptions;
- options.Abi = Parser.AST.CppAbi.Microsoft;
- options.MicrosoftMode = true;
+ parserOptions.Abi = Parser.AST.CppAbi.Microsoft;
+ parserOptions.MicrosoftMode = true;
var systemIncludeDirs = new[]
{
};
foreach (var inc in systemIncludeDirs)
- options.addSystemIncludeDirs(inc);
+ parserOptions.AddSystemIncludeDirs(inc);
- options.addDefines("HOST_WIN32");
+ parserOptions.AddDefines("HOST_WIN32");
}
static void SetupToolchainPaths(Driver driver, Target target)
static void SetupXcode(Driver driver, Target target)
{
- var options = driver.Options;
+ var parserOptions = driver.ParserOptions;
var builtinsPath = GetXcodeBuiltinIncludesFolder();
string includePath;
throw new ArgumentOutOfRangeException ();
}
- options.addSystemIncludeDirs(builtinsPath);
- options.addSystemIncludeDirs(includePath);
+ parserOptions.AddSystemIncludeDirs(builtinsPath);
+ parserOptions.AddSystemIncludeDirs(includePath);
- options.NoBuiltinIncludes = true;
- options.NoStandardIncludes = true;
- options.TargetTriple = target.Triple;
+ parserOptions.NoBuiltinIncludes = true;
+ parserOptions.NoStandardIncludes = true;
+ parserOptions.TargetTriple = target.Triple;
}
static string GetAndroidHostToolchainPath()
static void SetupAndroidNDK(Driver driver, Target target)
{
var options = driver.Options;
+ var parserOptions = driver.ParserOptions;
var builtinsPath = GetAndroidBuiltinIncludesFolder();
- options.addSystemIncludeDirs(builtinsPath);
+ parserOptions.AddSystemIncludeDirs(builtinsPath);
var androidNdkRoot = GetAndroidNdkPath ();
const int androidNdkApiLevel = 21;
var toolchainPath = Path.Combine(androidNdkRoot, "platforms",
"android-" + androidNdkApiLevel, "arch-" + GetArchFromTriple(target.Triple),
"usr", "include");
- options.addSystemIncludeDirs(toolchainPath);
+ parserOptions.AddSystemIncludeDirs(toolchainPath);
- options.NoBuiltinIncludes = true;
- options.NoStandardIncludes = true;
- options.TargetTriple = target.Triple;
+ parserOptions.NoBuiltinIncludes = true;
+ parserOptions.NoStandardIncludes = true;
+ parserOptions.TargetTriple = target.Triple;
}
static uint GetTypeAlign(ParserTargetInfo target, ParserIntType type)
{
var targetFile = target.Triple;
- if (!string.IsNullOrEmpty (OutputDir))
- targetFile = Path.Combine (OutputDir, targetFile);
+ if (!string.IsNullOrEmpty (OutputDir))
+ targetFile = Path.Combine (OutputDir, targetFile);
targetFile += ".h";
var types = new List<string>
{
"MonoObject",
+ "MonoObjectHandlePayload",
"MonoClass",
"MonoVTable",
"MonoDelegate",
"SeqPointInfo",
"DynCallArgs",
"MonoLMFTramp",
- };
+ "InterpMethodArguments",
+ };
DumpClasses(writer, ctx, optionalTypes, optional: true);
static void DumpStruct(TextWriter writer, Class @class)
{
var name = @class.Name;
- if (name.StartsWith ("_", StringComparison.Ordinal))
- name = name.Substring (1);
+ if (name.StartsWith ("_", StringComparison.Ordinal))
+ name = name.Substring (1);
foreach (var field in @class.Fields)
{
if (name == "SgenThreadInfo" && field.Name == "regs")
continue;
+ var layout = @class.Layout.Fields.First(f => f.FieldPtr == field.OriginalPtr);
+
writer.WriteLine("DECL_OFFSET2({0},{1},{2})", name, field.Name,
- field.Offset / 8);
+ layout.Offset);
}
}
}