Skip to content

Commit b2d51b7

Browse files
committed
[WIP] Builds but doesn't work
1 parent d927d09 commit b2d51b7

12 files changed

+338
-70
lines changed

src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyStores.targets

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@
77
<ItemGroup>
88
<_EmbeddedAssemblyStoreObjectFile Include="$(_NativeAssemblySourceDir)embed_assembly_store.%(_BuildTargetAbis.Identity).o" />
99
</ItemGroup>
10+
11+
<ItemGroup>
12+
<_EmbeddedAssemblyStoreSourceFiles Include="@(_EmbeddedAssemblyStoreObjectFile->'$([System.IO.Path]::ChangeExtension('%(Identity)', '.s'))')" />
13+
</ItemGroup>
1014
</Target>
1115

1216
<Target Name="_CreateEmbeddedAssemblyStore"
1317
Condition=" '$(_AndroidEmbedAssemblyStoreInRuntime)' == 'True' "
1418
DependsOnTargets="_PrepareCreateEmbeddedAssemblyStoreOutputItems"
1519
Inputs="@(_ShrunkUserAssemblies);@(_AndroidResolvedSatellitePaths);@(_ShrunkFrameworkAssemblies)"
16-
Outputs="@(_EmbeddedAssemblyStoreObjectFile)">
20+
Outputs="@(_EmbeddedAssemblyStoreObjectFile);@(_EmbeddedAssemblyStoreSourceFiles)">
1721
<CreateEmbeddedAssemblyStore
1822
AndroidBinUtilsDirectory="$(AndroidBinUtilsDirectory)"
1923
AppSharedLibrariesDir="$(_AndroidApplicationSharedLibraryPath)"
@@ -30,7 +34,6 @@
3034
</CreateEmbeddedAssemblyStore>
3135

3236
<ItemGroup>
33-
<FileWrites Include="@(_NativeAssemblyTarget)" />
3437
<FileWrites Include="@(_EmbeddedAssemblyStoreSourceFiles)" />
3538
</ItemGroup>
3639
</Target>

src/Xamarin.Android.Build.Tasks/Tasks/CompileNativeAssembly.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,24 @@ void RunAssembler (Config config)
9999
}
100100
}
101101

102+
static readonly List<string> llcArguments = new () {
103+
"-O2",
104+
"--debugger-tune=lldb", // NDK uses lldb now
105+
"--debugify-level=location+variables",
106+
"--fatal-warnings",
107+
"--filetype=obj",
108+
"--relocation-model=pic",
109+
};
110+
111+
static readonly List<string> llvmMcArguments = new () {
112+
"--assemble",
113+
"--filetype=obj",
114+
"-g",
115+
};
116+
102117
IEnumerable<Config> GetAssemblerConfigs ()
103118
{
104-
const string assemblerOptions =
119+
const string llcOptions =
105120
"-O2 " +
106121
"--debugger-tune=lldb " + // NDK uses lldb now
107122
"--debugify-level=location+variables " +
@@ -113,14 +128,14 @@ IEnumerable<Config> GetAssemblerConfigs ()
113128
foreach (ITaskItem item in Sources) {
114129
// We don't need the directory since our WorkingDirectory is where all the sources are
115130
string sourceFile = Path.GetFileName (item.ItemSpec);
116-
string outputFile = QuoteFileName (sourceFile.Replace (".ll", ".o"));
131+
string outputFile = QuoteFileName (Path.ChangeExtension (sourceFile, ".o"));
117132
string executableDir = Path.GetDirectoryName (llcPath);
118133
string executableName = MonoAndroidHelper.GetExecutablePath (executableDir, Path.GetFileName (llcPath));
119134

120135
yield return new Config {
121136
InputSource = item.ItemSpec,
122137
AssemblerPath = Path.Combine (executableDir, executableName),
123-
AssemblerOptions = $"{assemblerOptions} -o={outputFile} {QuoteFileName (sourceFile)}",
138+
AssemblerOptions = $"{llcOptions} -o={outputFile} {QuoteFileName (sourceFile)}",
124139
};
125140
}
126141
}

src/Xamarin.Android.Build.Tasks/Tasks/GenerateCompressedAssembliesNativeSourceFiles.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ void GenerateCompressedAssemblySources ()
6666

6767
var assemblyKey = CompressedAssemblyInfo.GetDictionaryKey (assembly);
6868
if (assemblies.ContainsKey (assemblyKey)) {
69-
Log.LogDebugMessage ($"Skipping duplicate assembly: {assembly.ItemSpec} (arch {MonoAndroidHelper.GetAssemblyAbi(assembly)})");
69+
Log.LogDebugMessage ($"Skipping duplicate assembly: {assembly.ItemSpec} (arch {MonoAndroidHelper.GetItemAbi(assembly)})");
7070
continue;
7171
}
7272

src/Xamarin.Android.Build.Tasks/Tasks/GeneratePackageManagerJava.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ void AddEnvironment ()
248248
uniqueAssemblyNames.Add (assemblyName);
249249
}
250250

251-
string abi = MonoAndroidHelper.GetAssemblyAbi (assembly);
251+
string abi = MonoAndroidHelper.GetItemAbi (assembly);
252252
archAssemblyNames ??= new HashSet<string> (StringComparer.OrdinalIgnoreCase);
253253

254254
if (!archAssemblyNames.Contains (assemblyName)) {

src/Xamarin.Android.Build.Tasks/Tasks/PrepareAbiItems.cs

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
using System;
2-
using System.IO;
31
using System.Collections.Generic;
42

53
using Microsoft.Build.Framework;
@@ -10,13 +8,6 @@ namespace Xamarin.Android.Tasks
108
{
119
public class PrepareAbiItems : AndroidTask
1210
{
13-
const string ArmV7a = "armeabi-v7a";
14-
const string TypeMapBase = "typemaps";
15-
const string EnvBase = "environment";
16-
const string CompressedAssembliesBase = "compressed_assemblies";
17-
const string JniRemappingBase = "jni_remap";
18-
const string MarshalMethodsBase = "marshal_methods";
19-
2011
public override string TaskPrefix => "PAI";
2112

2213
[Required]
@@ -28,45 +19,23 @@ public class PrepareAbiItems : AndroidTask
2819
[Required]
2920
public string Mode { get; set; }
3021

31-
[Required]
32-
public bool Debug { get; set; }
33-
3422
[Output]
3523
public ITaskItem[] AssemblySources { get; set; }
3624

37-
[Output]
38-
public ITaskItem[] AssemblyIncludes { get; set; }
39-
4025
public override bool RunTask ()
4126
{
4227
var sources = new List<ITaskItem> ();
43-
var includes = new List<ITaskItem> ();
44-
string baseName;
45-
46-
if (String.Compare ("typemap", Mode, StringComparison.OrdinalIgnoreCase) == 0) {
47-
baseName = TypeMapBase;
48-
} else if (String.Compare ("environment", Mode, StringComparison.OrdinalIgnoreCase) == 0) {
49-
baseName = EnvBase;
50-
} else if (String.Compare ("compressed", Mode, StringComparison.OrdinalIgnoreCase) == 0) {
51-
baseName = CompressedAssembliesBase;
52-
} else if (String.Compare ("jniremap", Mode, StringComparison.OrdinalIgnoreCase) == 0) {
53-
baseName = JniRemappingBase;
54-
} else if (String.Compare ("marshal_methods", Mode, StringComparison.OrdinalIgnoreCase) == 0) {
55-
baseName = MarshalMethodsBase;
56-
} else {
57-
Log.LogError ($"Unknown mode: {Mode}");
58-
return false;
59-
}
6028

6129
TaskItem item;
30+
NativeAssemblerItemsHelper.KnownMode mode = NativeAssemblerItemsHelper.ToKnownMode (Mode);
6231
foreach (string abi in BuildTargetAbis) {
63-
item = new TaskItem (Path.Combine (NativeSourcesDir, $"{baseName}.{abi}.ll"));
32+
item = new TaskItem (NativeAssemblerItemsHelper.GetSourcePath (Log, mode, NativeSourcesDir, abi));
6433
item.SetMetadata ("abi", abi);
34+
item.SetMetadata ("RuntimeIdentifier", MonoAndroidHelper.AbiToRid (abi));
6535
sources.Add (item);
6636
}
6737

6838
AssemblySources = sources.ToArray ();
69-
AssemblyIncludes = includes.ToArray ();
7039
return !Log.HasLoggedErrors;
7140
}
7241
}

src/Xamarin.Android.Build.Tasks/Utilities/AssemblyCompression.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public static string Compress (
136136
AssemblyData compressedAssembly = new AssemblyData (assembly.ItemSpec, info.DescriptorIndex);
137137
string assemblyOutputDir;
138138
string subDirectory = assembly.GetMetadata ("DestinationSubDirectory");
139-
string abi = MonoAndroidHelper.GetAssemblyAbi (assembly);
139+
string abi = MonoAndroidHelper.GetItemAbi (assembly);
140140
if (!String.IsNullOrEmpty (subDirectory) && !(subDirectory.EndsWith ($"{abi}/", StringComparison.Ordinal) || subDirectory.EndsWith ($"{abi}\\", StringComparison.Ordinal))) {
141141
assemblyOutputDir = Path.Combine (compressedOutputDir, abi, subDirectory);
142142
} else {

src/Xamarin.Android.Build.Tasks/Utilities/ELFEmbeddingHelper.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,12 @@ static void DoEmbed (
215215
MonoAndroidHelper.QuoteFileNameArgument (asmInputFile),
216216
};
217217

218-
int ret = MonoAndroidHelper.RunProcess (llvmMcPath, String.Join (" ", args), log);
219-
if (ret != 0) {
220-
return;
221-
}
218+
// int ret = MonoAndroidHelper.RunProcess (llvmMcPath, String.Join (" ", args), log);
219+
// File.Copy (asmInputFile, $"/tmp/{Path.GetFileName (asmInputFile)}", true);
220+
// File.Copy (outputFile, $"/tmp/{Path.GetFileName (outputFile)}", true);
221+
// if (ret != 0) {
222+
// return;
223+
// }
222224
}
223225

224226
static string GetLlvmMcPath (string androidBinUtilsDirectory) => MonoAndroidHelper.GetLlvmMcPath (androidBinUtilsDirectory);

src/Xamarin.Android.Build.Tasks/Utilities/MonoAndroidHelper.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -588,17 +588,17 @@ public static int ConvertSupportedOSPlatformVersionToApiLevel (string version)
588588
}
589589

590590
#if MSBUILD
591-
public static string GetAssemblyAbi (ITaskItem asmItem)
591+
public static string GetItemAbi (ITaskItem asmItem)
592592
{
593593
string? abi = asmItem.GetMetadata ("Abi");
594594
if (String.IsNullOrEmpty (abi)) {
595-
throw new InvalidOperationException ($"Internal error: assembly '{asmItem}' lacks ABI metadata");
595+
throw new InvalidOperationException ($"Internal error: item '{asmItem}' lacks ABI metadata");
596596
}
597597

598598
return abi;
599599
}
600600

601-
public static AndroidTargetArch GetTargetArch (ITaskItem asmItem) => AbiToTargetArch (GetAssemblyAbi (asmItem));
601+
public static AndroidTargetArch GetTargetArch (ITaskItem asmItem) => AbiToTargetArch (GetItemAbi (asmItem));
602602
#endif // MSBUILD
603603

604604
static string GetToolsRootDirectoryRelativePath (string androidBinUtilsDirectory)
@@ -797,6 +797,7 @@ public static string QuoteFileNameArgument (string fileName)
797797

798798
public static string GetLlvmObjcopyPath (string androidBinUtilsDirectory) => GetBinUtilsToolPath (androidBinUtilsDirectory, "llvm-objcopy");
799799
public static string GetLlvmMcPath (string androidBinUtilsDirectory) => GetBinUtilsToolPath (androidBinUtilsDirectory, "llvm-mc");
800+
public static string GetLlvmLlcPath (string androidBinUtilsDirectory) => GetBinUtilsToolPath (androidBinUtilsDirectory, "llc");
800801

801802
static string GetBinUtilsToolPath (string androidBinUtilsDirectory, string toolName)
802803
{

0 commit comments

Comments
 (0)