Skip to content

Commit 2510c35

Browse files
committed
Managed side of blob generation is done
1 parent 9a38522 commit 2510c35

File tree

8 files changed

+396
-37
lines changed

8 files changed

+396
-37
lines changed

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ public override bool RunTask ()
4343
Log.LogDebugMessage ("Assembly compression DISABLED");
4444
}
4545

46-
Generate ();
46+
GenerateBlob ();
4747
return !Log.HasLoggedErrors;
4848
}
4949

50-
void Generate ()
50+
void GenerateBlob ()
5151
{
5252
var assemblies = new Dictionary<AndroidTargetArch, List<BlobAssemblyInfo>> ();
5353
var abis = new HashSet<string> (StringComparer.Ordinal);
@@ -64,6 +64,11 @@ void Generate ()
6464
var info = new BlobAssemblyInfo (assembly);
6565
archAssemblies.Add (info);
6666

67+
string configFilePath = $"{assembly.ItemSpec}.config";
68+
if (File.Exists (configFilePath)) {
69+
info.Config = File.ReadAllText (configFilePath);
70+
}
71+
6772
string inputAssembly;
6873
if (!ShouldSkipCompression (assembly)) {
6974
// TODO: compress
@@ -81,14 +86,14 @@ void Generate ()
8186

8287
foreach (ITaskItem blobDSO in AssemblyBlobDSOs) {
8388
AndroidTargetArch arch = MonoAndroidHelper.AbiToTargetArch (GetRequiredMetadata (blobDSO, DSOMetadata.Abi));
84-
Generate (arch, blobDSO, assemblies[arch]);
89+
GenerateBlob (arch, blobDSO, assemblies[arch]);
8590
}
8691

8792
var generator = new AssemblyBlobDSOGenerator (assemblies);
8893
LLVMIR.LlvmIrModule module = generator.Construct ();
8994

9095
foreach (string abi in abis) {
91-
string outputAsmFilePath = Path.Combine (SourcesOutputDirectory, $"{PrepareAbiItems.AssemblyDSOBase}.{abi}.ll");
96+
string outputAsmFilePath = Path.Combine (SourcesOutputDirectory, MonoAndroidHelper.MakeNativeAssemblyFileName (PrepareAbiItems.AssemblyDSOBase, abi));
9297

9398
using var sw = MemoryStreamPool.Shared.CreateStreamWriter ();
9499
AndroidTargetArch targetArch = MonoAndroidHelper.AbiToTargetArch (abi);
@@ -112,7 +117,7 @@ ulong GetFileSize (string path)
112117
return (ulong)fi.Length;
113118
}
114119

115-
void Generate (AndroidTargetArch arch, ITaskItem blobDSO, List<BlobAssemblyInfo> assemblies)
120+
void GenerateBlob (AndroidTargetArch arch, ITaskItem blobDSO, List<BlobAssemblyInfo> assemblies)
116121
{
117122
string stubPath = GetRequiredMetadata (blobDSO, DSOMetadata.BlobStubPath);
118123
var stubInfo = new FileInfo (stubPath);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ void SetAssemblyAbiMetadata (string abi, string assetType, ITaskItem assembly, I
105105
return;
106106
}
107107

108-
assembly.SetMetadata ("Abi", abi);
108+
assembly.SetMetadata (DSOMetadata.Abi, abi);
109109
if (symbol != null) {
110-
symbol.SetMetadata ("Abi", abi);
110+
symbol.SetMetadata (DSOMetadata.Abi, abi);
111111
}
112112
}
113113

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,35 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
15
using Microsoft.Build.Framework;
6+
using Xamarin.Android.Tasks.LLVMIR;
7+
using Xamarin.Android.Tools;
28

39
namespace Xamarin.Android.Tasks;
410

511
partial class AssemblyBlobDSOGenerator
612
{
7-
public sealed class BlobAssemblyInfo
8-
{
9-
public bool IsCompressed { get; set; }
10-
public ulong OffsetInBlob { get; set; }
11-
public ulong SizeInBlob { get; set; }
12-
public ulong Size { get; set; }
13-
public ITaskItem Item { get; }
13+
// Native structures and constants
1414

15-
public BlobAssemblyInfo (ITaskItem item)
16-
{
17-
Item = item;
18-
}
19-
}
15+
// Must be identical to the like-named constants in src/monodroid/jni/xamarin-app.hh
16+
const uint AssemblyEntry_IsCompressed = 1 << 0;
17+
const uint AssemblyEntry_HasConfig = 1 << 1;
2018

2119
class AssemblyIndexEntryBase<T>
2220
{
21+
[NativeAssembler (Ignore = true)]
22+
public string Name;
23+
24+
[NativeAssembler (NumberFormat = LlvmIrVariableNumberFormat.Hexadecimal)]
2325
public T name_hash;
2426
public uint input_data_offset;
2527
public uint input_data_size;
2628
public uint output_data_offset;
2729
public uint output_data_size;
2830
public uint info_index;
29-
public bool is_compressed;
30-
};
31+
public uint flags;
32+
}
3133

3234
sealed class AssemblyIndexEntry32 : AssemblyIndexEntryBase<uint>
3335
{}
@@ -40,5 +42,52 @@ struct AssembliesConfig
4042
public uint assembly_blob_size;
4143
public uint assembly_name_length;
4244
public uint assembly_count;
43-
};
45+
}
46+
47+
// Generator support
48+
public sealed class BlobAssemblyInfo
49+
{
50+
public bool IsCompressed { get; set; }
51+
public ulong OffsetInBlob { get; set; }
52+
public ulong SizeInBlob { get; set; }
53+
public ulong Size { get; set; }
54+
public ulong Offset { get; set; }
55+
public string? Config { get; set; }
56+
public ITaskItem Item { get; }
57+
public string Name { get; }
58+
public byte[] NameBytes { get; }
59+
60+
public BlobAssemblyInfo (ITaskItem item)
61+
{
62+
Item = item;
63+
Name = Path.GetFileName (item.ItemSpec);
64+
NameBytes = LlvmIrComposer.StringToBytes (Name);
65+
}
66+
}
67+
68+
sealed class ArchState
69+
{
70+
public ulong BlobSize = 0;
71+
public ulong DataSize = 0;
72+
public ulong AssemblyNameLength = 0;
73+
public ulong AssemblyCount = 0;
74+
75+
public readonly bool Is64Bit;
76+
public readonly List<StructureInstance<AssemblyIndexEntry32>> Index32 = new List<StructureInstance<AssemblyIndexEntry32>> ();
77+
public readonly List<StructureInstance<AssemblyIndexEntry64>> Index64 = new List<StructureInstance<AssemblyIndexEntry64>> ();
78+
public readonly List<byte[]> AssemblyNames = new List<byte[]> ();
79+
public readonly List<BlobAssemblyInfo> Assemblies;
80+
81+
public ArchState (List<BlobAssemblyInfo> assemblies, AndroidTargetArch arch)
82+
{
83+
Assemblies = assemblies;
84+
Is64Bit = arch switch {
85+
AndroidTargetArch.Arm => false,
86+
AndroidTargetArch.X86 => false,
87+
AndroidTargetArch.Arm64 => true,
88+
AndroidTargetArch.X86_64 => true,
89+
_ => throw new NotSupportedException ($"Architecture '{arch}' is not supported")
90+
};
91+
}
92+
}
4493
}

0 commit comments

Comments
 (0)