@@ -367,28 +367,54 @@ public virtual CodeMappingInfo GetCodeMappingInfo(MetadataFile module, EntityHan
367367 return new CodeMappingInfo ( module , declaringType ) ;
368368 }
369369
370+ static readonly IReadOnlyDictionary < Machine , string > osMachineLookup = new Dictionary < Machine , string >
371+ {
372+ { ( Machine ) 0x4644 , "MacOS" } ,
373+ { ( Machine ) 0x7b79 , "Linux" } ,
374+ { ( Machine ) 0xadc4 , "FreeBSD" } ,
375+ { ( Machine ) 0x1993 , "NetBSD" } ,
376+ { ( Machine ) 0x1992 , "Sun" } ,
377+ } ;
378+
370379 public static string GetPlatformDisplayName ( PEFile module )
371380 {
372381 var headers = module . Reader . PEHeaders ;
373382 var architecture = headers . CoffHeader . Machine ;
374383 var characteristics = headers . CoffHeader . Characteristics ;
375384 var corflags = headers . CorHeader . Flags ;
385+
386+ var modifier = string . Empty ;
387+
388+ if ( ! Enum . IsDefined ( architecture ) )
389+ {
390+ foreach ( ( var osEnum , var osText ) in osMachineLookup )
391+ {
392+ var candidate = architecture ^ osEnum ;
393+ if ( Enum . IsDefined ( candidate ) )
394+ {
395+ modifier = osText + " " ;
396+ architecture = candidate ;
397+ break ;
398+ }
399+ }
400+ }
401+
376402 switch ( architecture )
377403 {
378404 case Machine . I386 :
379405 if ( ( corflags & CorFlags . Prefers32Bit ) != 0 )
380- return "AnyCPU (32-bit preferred)" ;
406+ return modifier + "AnyCPU (32-bit preferred)" ;
381407 if ( ( corflags & CorFlags . Requires32Bit ) != 0 )
382- return "x86" ;
408+ return modifier + "x86" ;
383409 // According to ECMA-335, II.25.3.3.1 CorFlags.Requires32Bit and Characteristics.Bit32Machine must be in sync
384410 // for assemblies containing managed code. However, this is not true for C++/CLI assemblies.
385411 if ( ( corflags & CorFlags . ILOnly ) == 0 && ( characteristics & Characteristics . Bit32Machine ) != 0 )
386- return "x86" ;
387- return "AnyCPU (64-bit preferred)" ;
412+ return modifier + "x86" ;
413+ return modifier + "AnyCPU (64-bit preferred)" ;
388414 case Machine . Amd64 :
389- return "x64" ;
415+ return modifier + "x64" ;
390416 case Machine . IA64 :
391- return "Itanium" ;
417+ return modifier + "Itanium" ;
392418 default :
393419 return architecture . ToString ( ) ;
394420 }
0 commit comments