Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -131,10 +131,7 @@ sealed class TypeMapJava
public string JavaName;

[NativeAssembler (Ignore = true)]
public uint JavaNameHash32;

[NativeAssembler (Ignore = true)]
public ulong JavaNameHash64;
public ulong JavaNameHash;

public uint module_index;

Expand All @@ -155,19 +152,11 @@ public ModuleMapData (string symbolLabel, List<StructureInstance<TypeMapModuleEn
}
}

sealed class JavaNameHash32Comparer : IComparer<StructureInstance<TypeMapJava>>
sealed class JavaNameHashComparer : IComparer<StructureInstance<TypeMapJava>>
{
public int Compare (StructureInstance<TypeMapJava> a, StructureInstance<TypeMapJava> b)
{
return a.Instance.JavaNameHash32.CompareTo (b.Instance.JavaNameHash32);
}
}

sealed class JavaNameHash64Comparer : IComparer<StructureInstance<TypeMapJava>>
{
public int Compare (StructureInstance<TypeMapJava> a, StructureInstance<TypeMapJava> b)
{
return a.Instance.JavaNameHash64.CompareTo (b.Instance.JavaNameHash64);
return a.Instance.JavaNameHash.CompareTo (b.Instance.JavaNameHash);
}
}

Expand All @@ -184,17 +173,15 @@ sealed class ConstructionState
StructureInfo typeMapJavaStructureInfo;
StructureInfo typeMapModuleStructureInfo;
StructureInfo typeMapModuleEntryStructureInfo;
JavaNameHash32Comparer javaNameHash32Comparer;
JavaNameHash64Comparer javaNameHash64Comparer;
JavaNameHashComparer javaNameHashComparer;

ulong moduleCounter = 0;

public TypeMappingReleaseNativeAssemblyGenerator (TaskLoggingHelper log, NativeTypeMappingData mappingData)
: base (log)
{
this.mappingData = mappingData ?? throw new ArgumentNullException (nameof (mappingData));
javaNameHash32Comparer = new JavaNameHash32Comparer ();
javaNameHash64Comparer = new JavaNameHash64Comparer ();
javaNameHashComparer = new JavaNameHashComparer ();
}

protected override void Construct (LlvmIrModule module)
Expand All @@ -208,7 +195,6 @@ protected override void Construct (LlvmIrModule module)
cs.JavaNames = new List<string> ();
InitJavaMap (cs);
InitMapModules (cs);
HashJavaNames (cs);
PrepareModules (cs);

module.AddGlobalVariable ("map_module_count", mappingData.MapModuleCount);
Expand Down Expand Up @@ -249,7 +235,6 @@ void UpdateJavaIndexes (LlvmIrVariable variable, LlvmIrModuleTarget target, obje
{
ConstructionState cs = EnsureConstructionState (callerState);
LlvmIrGlobalVariable gv = EnsureGlobalVariable (variable);
IComparer<StructureInstance<TypeMapJava>> hashComparer = target.Is64Bit ? javaNameHash64Comparer : javaNameHash32Comparer;

var entries = (List<StructureInstance<TypeMapModuleEntry>>)variable.Value;
foreach (StructureInstance<TypeMapModuleEntry> entry in entries) {
Expand All @@ -259,7 +244,7 @@ void UpdateJavaIndexes (LlvmIrVariable variable, LlvmIrModuleTarget target, obje
uint GetJavaEntryIndex (TypeMapJava javaEntry)
{
var key = new StructureInstance<TypeMapJava> (typeMapJavaStructureInfo, javaEntry);
int idx = cs.JavaMap.BinarySearch (key, hashComparer);
int idx = cs.JavaMap.BinarySearch (key, javaNameHashComparer);
if (idx < 0) {
throw new InvalidOperationException ($"Could not map entry '{javaEntry.JavaName}' to array index");
}
Expand All @@ -282,24 +267,28 @@ void GenerateAndSortJavaHashes (LlvmIrVariable variable, LlvmIrModuleTarget targ
{
ConstructionState cs = EnsureConstructionState (callerState);
LlvmIrGlobalVariable gv = EnsureGlobalVariable (variable);

for (int i = 0; i < cs.JavaMap.Count; i++) {
TypeMapJava entry = cs.JavaMap[i].Instance;
entry.JavaNameHash = TypeMapHelper.HashJavaName (entry.JavaName, target.Is64Bit);
}

cs.JavaMap.Sort ((StructureInstance<TypeMapJava> a, StructureInstance<TypeMapJava> b) => a.Instance.JavaNameHash.CompareTo (b.Instance.JavaNameHash));

Type listType;
IList hashes;
if (target.Is64Bit) {
listType = typeof(List<ulong>);
cs.JavaMap.Sort ((StructureInstance<TypeMapJava> a, StructureInstance<TypeMapJava> b) => a.Instance.JavaNameHash64.CompareTo (b.Instance.JavaNameHash64));

var list = new List<ulong> ();
foreach (StructureInstance<TypeMapJava> si in cs.JavaMap) {
list.Add (si.Instance.JavaNameHash64);
list.Add (si.Instance.JavaNameHash);
}
hashes = list;
} else {
listType = typeof(List<uint>);
cs.JavaMap.Sort ((StructureInstance<TypeMapJava> a, StructureInstance<TypeMapJava> b) => a.Instance.JavaNameHash32.CompareTo (b.Instance.JavaNameHash32));

var list = new List<uint> ();
foreach (StructureInstance<TypeMapJava> si in cs.JavaMap) {
list.Add (si.Instance.JavaNameHash32);
list.Add ((uint)si.Instance.JavaNameHash);
}
hashes = list;
}
Expand Down Expand Up @@ -405,17 +394,5 @@ void PrepareModules (ConstructionState cs)
}
}

void HashJavaNames (ConstructionState cs)
{
// We generate both 32-bit and 64-bit hashes at the construction time. Which set will be used depends on the target.
// Java map list will also be sorted when the target is known
for (int i = 0; i < cs.JavaMap.Count; i++) {
TypeMapJava entry = cs.JavaMap[i].Instance;

// The cast is safe, xxHash will return a 32-bit value which (for convenience) was upcast to 64-bit
entry.JavaNameHash32 = (uint)TypeMapHelper.HashJavaName (entry.JavaName, is64Bit: false);
entry.JavaNameHash64 = TypeMapHelper.HashJavaName (entry.JavaName, is64Bit: true);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -145,10 +145,7 @@ sealed class TypeMapJava
public string ManagedTypeName;

[NativeAssembler (Ignore = true)]
public uint JavaNameHash32;

[NativeAssembler (Ignore = true)]
public ulong JavaNameHash64;
public ulong JavaNameHash;

public uint module_index;

Expand All @@ -174,19 +171,11 @@ public ModuleMapData (List<StructureInstance<TypeMapModuleEntry>> entries)
}
}

sealed class JavaNameHash32Comparer : IComparer<StructureInstance<TypeMapJava>>
{
public int Compare (StructureInstance<TypeMapJava> a, StructureInstance<TypeMapJava> b)
{
return a.Instance.JavaNameHash32.CompareTo (b.Instance.JavaNameHash32);
}
}

sealed class JavaNameHash64Comparer : IComparer<StructureInstance<TypeMapJava>>
sealed class JavaNameHashComparer : IComparer<StructureInstance<TypeMapJava>>
{
public int Compare (StructureInstance<TypeMapJava> a, StructureInstance<TypeMapJava> b)
{
return a.Instance.JavaNameHash64.CompareTo (b.Instance.JavaNameHash64);
return a.Instance.JavaNameHash.CompareTo (b.Instance.JavaNameHash);
}
}

Expand All @@ -207,8 +196,7 @@ sealed class ConstructionState
StructureInfo typeMapJavaStructureInfo;
StructureInfo typeMapModuleStructureInfo;
StructureInfo typeMapModuleEntryStructureInfo;
JavaNameHash32Comparer javaNameHash32Comparer;
JavaNameHash64Comparer javaNameHash64Comparer;
JavaNameHashComparer javaNameHashComparer;

#pragma warning disable CS0414 // Field is assigned but its value is never used - might be used for debugging or future functionality
ulong moduleCounter = 0;
Expand All @@ -218,8 +206,7 @@ public TypeMappingReleaseNativeAssemblyGeneratorCLR (TaskLoggingHelper log, Nati
: base (log)
{
this.mappingData = mappingData ?? throw new ArgumentNullException (nameof (mappingData));
javaNameHash32Comparer = new JavaNameHash32Comparer ();
javaNameHash64Comparer = new JavaNameHash64Comparer ();
javaNameHashComparer = new JavaNameHashComparer ();

// Unfortunate, but we have to fix this up before proceeding
foreach (TypeMapGenerator.ModuleReleaseData module in mappingData.Modules) {
Expand All @@ -245,7 +232,6 @@ protected override void Construct (LlvmIrModule module)
cs.JavaTypesByName = new Dictionary<string, TypeMapJava> (StringComparer.Ordinal);
InitJavaMap (cs);
InitMapModules (cs);
HashJavaNames (cs);
PrepareModules (cs);

module.AddGlobalVariable ("managed_to_java_map_module_count", mappingData.MapModuleCount);
Expand Down Expand Up @@ -301,7 +287,6 @@ void SortEntriesAndUpdateJavaIndexes (LlvmIrVariable variable, LlvmIrModuleTarge
{
ConstructionState cs = EnsureConstructionState (callerState);
LlvmIrGlobalVariable gv = EnsureGlobalVariable (variable);
IComparer<StructureInstance<TypeMapJava>> hashComparer = target.Is64Bit ? javaNameHash64Comparer : javaNameHash32Comparer;

var array = (LlvmIrSectionedArray<StructureInstance<TypeMapModuleEntry>>)variable.Value;
foreach (LlvmIrArraySection<StructureInstance<TypeMapModuleEntry>> section in array.Sections) {
Expand All @@ -323,7 +308,7 @@ void SortEntriesAndUpdateJavaIndexes (LlvmIrVariable variable, LlvmIrModuleTarge
uint GetJavaEntryIndex (TypeMapJava javaEntry)
{
var key = new StructureInstance<TypeMapJava> (typeMapJavaStructureInfo, javaEntry);
int idx = cs.JavaMap.BinarySearch (key, hashComparer);
int idx = cs.JavaMap.BinarySearch (key, javaNameHashComparer);
if (idx < 0) {
throw new InvalidOperationException ($"Could not map entry '{javaEntry.JavaName}' to array index");
}
Expand All @@ -346,24 +331,28 @@ void GenerateAndSortJavaHashes (LlvmIrVariable variable, LlvmIrModuleTarget targ
{
ConstructionState cs = EnsureConstructionState (callerState);
LlvmIrGlobalVariable gv = EnsureGlobalVariable (variable);

for (int i = 0; i < cs.JavaMap.Count; i++) {
TypeMapJava entry = cs.JavaMap[i].Instance;
entry.JavaNameHash = TypeMapHelper.HashJavaNameForCLR (entry.JavaName, target.Is64Bit);
}

cs.JavaMap.Sort ((StructureInstance<TypeMapJava> a, StructureInstance<TypeMapJava> b) => a.Instance.JavaNameHash.CompareTo (b.Instance.JavaNameHash));

Type listType;
IList hashes;
if (target.Is64Bit) {
listType = typeof(List<ulong>);
cs.JavaMap.Sort ((StructureInstance<TypeMapJava> a, StructureInstance<TypeMapJava> b) => a.Instance.JavaNameHash64.CompareTo (b.Instance.JavaNameHash64));

var list = new List<ulong> ();
foreach (StructureInstance<TypeMapJava> si in cs.JavaMap) {
list.Add (si.Instance.JavaNameHash64);
list.Add (si.Instance.JavaNameHash);
}
hashes = list;
} else {
listType = typeof(List<uint>);
cs.JavaMap.Sort ((StructureInstance<TypeMapJava> a, StructureInstance<TypeMapJava> b) => a.Instance.JavaNameHash32.CompareTo (b.Instance.JavaNameHash32));

var list = new List<uint> ();
foreach (StructureInstance<TypeMapJava> si in cs.JavaMap) {
list.Add (si.Instance.JavaNameHash32);
list.Add ((uint)si.Instance.JavaNameHash);
}
hashes = list;
}
Expand Down Expand Up @@ -508,24 +497,5 @@ void PrepareModules (ConstructionState cs)
}
}

void HashJavaNames (ConstructionState cs)
{
// We generate both 32-bit and 64-bit hashes at the construction time. Which set will be used depends on the target.
// Java map list will also be sorted when the target is known
var hashes32 = new HashSet<uint> ();
var hashes64 = new HashSet<ulong> ();

// Generate Java type name hashes...
for (int i = 0; i < cs.JavaMap.Count; i++) {
TypeMapJava entry = cs.JavaMap[i].Instance;

// The cast is safe, xxHash will return a 32-bit value which (for convenience) was upcast to 64-bit
entry.JavaNameHash32 = (uint)TypeMapHelper.HashJavaNameForCLR (entry.JavaName, is64Bit: false);
hashes32.Add (entry.JavaNameHash32);

entry.JavaNameHash64 = TypeMapHelper.HashJavaNameForCLR (entry.JavaName, is64Bit: true);
hashes64.Add (entry.JavaNameHash64);
}
}
}
}