@@ -16,6 +16,8 @@ class TypeMappingDebugNativeAssemblyGeneratorCLR : LlvmIrComposer
1616 const string TypeMapSymbol = "type_map" ;
1717 const string UniqueAssembliesSymbol = "type_map_unique_assemblies" ;
1818 const string AssemblyNamesBlobSymbol = "type_map_assembly_names" ;
19+ const string ManagedTypeNamesBlobSymbol = "type_map_managed_type_names" ;
20+ const string JavaTypeNamesBlobSymbol = "type_map_java_type_names" ;
1921
2022 sealed class TypeMapContextDataProvider : NativeAssemblerStructContextDataProvider
2123 {
@@ -53,11 +55,11 @@ public override string GetComment (object data, string fieldName)
5355 var entry = EnsureType < TypeMapEntry > ( data ) ;
5456
5557 if ( String . Compare ( "from" , fieldName , StringComparison . Ordinal ) == 0 ) {
56- return $ "from: { entry . from } ";
58+ return $ "from: { entry . From } ";
5759 }
5860
5961 if ( String . Compare ( "to" , fieldName , StringComparison . Ordinal ) == 0 ) {
60- return $ "to: { entry . to } ";
62+ return $ "to: { entry . To } ";
6163 }
6264
6365 return String . Empty ;
@@ -87,11 +89,23 @@ public override string GetComment (object data, string fieldName)
8789 [ NativeAssemblerStructContextDataProvider ( typeof ( TypeMapEntryContextDataProvider ) ) ]
8890 sealed class TypeMapEntry
8991 {
92+ [ NativeAssembler ( Ignore = true ) ]
93+ public string From ;
94+
95+ [ NativeAssembler ( Ignore = true ) ]
96+ public string To ;
97+
9098 [ NativeAssembler ( UsesDataProvider = true ) ]
91- public string from ;
99+ public uint from ;
100+
101+ [ NativeAssembler ( NumberFormat = LlvmIrVariableNumberFormat . Hexadecimal ) ]
102+ public ulong from_hash ;
92103
93104 [ NativeAssembler ( UsesDataProvider = true ) ]
94- public string to ;
105+ public uint to ;
106+
107+ [ NativeAssembler ( NumberFormat = LlvmIrVariableNumberFormat . Hexadecimal ) ]
108+ public ulong to_hash ;
95109 } ;
96110
97111 // Order of fields and their type must correspond *exactly* to that in
@@ -164,30 +178,45 @@ protected override void Construct (LlvmIrModule module)
164178
165179 MapStructures ( module ) ;
166180
167- if ( data . ManagedToJavaMap != null && data . ManagedToJavaMap . Count > 0 ) {
168- foreach ( TypeMapGenerator . TypeMapDebugEntry entry in data . ManagedToJavaMap ) {
169- var m2j = new TypeMapEntry {
170- from = entry . ManagedName ,
171- to = entry . JavaName ,
172- } ;
173- managedToJavaMap . Add ( new StructureInstance < TypeMapEntry > ( typeMapEntryStructureInfo , m2j ) ) ;
174- }
181+ var managedTypeNames = new LlvmIrStringBlob ( ) ;
182+ var javaTypeNames = new LlvmIrStringBlob ( ) ;
183+
184+ // CoreCLR supports only 64-bit targets, so we can make things simpler by hashing all the things here instead of
185+ // in a callback during code generation
186+ foreach ( TypeMapGenerator . TypeMapDebugEntry entry in data . ManagedToJavaMap ) {
187+ ( int managedTypeNameOffset , int _ ) = managedTypeNames . Add ( entry . ManagedName ) ;
188+ ( int javaTypeNameOffset , int _ ) = javaTypeNames . Add ( entry . JavaName ) ;
189+ var m2j = new TypeMapEntry {
190+ From = entry . ManagedName ,
191+ To = entry . JavaName ,
192+
193+ from = ( uint ) managedTypeNameOffset ,
194+ from_hash = MonoAndroidHelper . GetXxHash ( entry . ManagedName , is64Bit : true ) ,
195+ to = ( uint ) javaTypeNameOffset ,
196+ to_hash = MonoAndroidHelper . GetXxHash ( entry . JavaName , is64Bit : true ) ,
197+ } ;
198+ managedToJavaMap . Add ( new StructureInstance < TypeMapEntry > ( typeMapEntryStructureInfo , m2j ) ) ;
175199 }
200+ managedToJavaMap . Sort ( ( StructureInstance < TypeMapEntry > a , StructureInstance < TypeMapEntry > b ) => a . Instance . from_hash . CompareTo ( b . Instance . from_hash ) ) ;
176201
177- if ( data . JavaToManagedMap != null && data . JavaToManagedMap . Count > 0 ) {
178- foreach ( TypeMapGenerator . TypeMapDebugEntry entry in data . JavaToManagedMap ) {
179- TypeMapGenerator . TypeMapDebugEntry managedEntry = entry . DuplicateForJavaToManaged != null ? entry . DuplicateForJavaToManaged : entry ;
202+ foreach ( TypeMapGenerator . TypeMapDebugEntry entry in data . JavaToManagedMap ) {
203+ TypeMapGenerator . TypeMapDebugEntry managedEntry = entry . DuplicateForJavaToManaged != null ? entry . DuplicateForJavaToManaged : entry ;
204+ ( int managedTypeNameOffset , int _ ) = managedTypeNames . Add ( entry . ManagedName ) ;
205+ ( int javaTypeNameOffset , int _ ) = javaTypeNames . Add ( entry . JavaName ) ;
180206
181- var j2m = new TypeMapEntry {
182- from = entry . JavaName ,
183- to = managedEntry . SkipInJavaToManaged ? null : managedEntry . ManagedName ,
184- } ;
185- javaToManagedMap . Add ( new StructureInstance < TypeMapEntry > ( typeMapEntryStructureInfo , j2m ) ) ;
186- }
207+ var j2m = new TypeMapEntry {
208+ From = entry . JavaName ,
209+ To = managedEntry . SkipInJavaToManaged ? String . Empty : entry . ManagedName ,
210+
211+ from = ( uint ) javaTypeNameOffset ,
212+ from_hash = MonoAndroidHelper . GetXxHash ( entry . JavaName , is64Bit : true ) ,
213+ to = managedEntry . SkipInJavaToManaged ? uint . MaxValue : ( uint ) managedTypeNameOffset ,
214+ to_hash = managedEntry . SkipInJavaToManaged ? 0 : MonoAndroidHelper . GetXxHash ( entry . ManagedName , is64Bit : true ) ,
215+ } ;
216+ javaToManagedMap . Add ( new StructureInstance < TypeMapEntry > ( typeMapEntryStructureInfo , j2m ) ) ;
187217 }
218+ javaToManagedMap . Sort ( ( StructureInstance < TypeMapEntry > a , StructureInstance < TypeMapEntry > b ) => a . Instance . from_hash . CompareTo ( b . Instance . from_hash ) ) ;
188219
189- // CoreCLR supports only 64-bit targets, so we can make things simpler by hashing the MVIDs here instead of
190- // in a callback during code generation
191220 var assemblyNamesBlob = new LlvmIrStringBlob ( ) ;
192221 foreach ( TypeMapGenerator . TypeMapDebugAssembly asm in data . UniqueAssemblies ) {
193222 ( int assemblyNameOffset , int assemblyNameLength ) = assemblyNamesBlob . Add ( asm . Name ) ;
@@ -224,6 +253,8 @@ protected override void Construct (LlvmIrModule module)
224253
225254 module . AddGlobalVariable ( UniqueAssembliesSymbol , uniqueAssemblies , LlvmIrVariableOptions . GlobalConstant ) ;
226255 module . AddGlobalVariable ( AssemblyNamesBlobSymbol , assemblyNamesBlob , LlvmIrVariableOptions . GlobalConstant ) ;
256+ module . AddGlobalVariable ( ManagedTypeNamesBlobSymbol , managedTypeNames , LlvmIrVariableOptions . GlobalConstant ) ;
257+ module . AddGlobalVariable ( JavaTypeNamesBlobSymbol , javaTypeNames , LlvmIrVariableOptions . GlobalConstant ) ;
227258 }
228259
229260 void MapStructures ( LlvmIrModule module )
0 commit comments