From d96cb01d5d8be7d50947b1e86787548fce47aa0d Mon Sep 17 00:00:00 2001 From: Marco Rossignoli Date: Fri, 28 Jan 2022 12:20:22 +0100 Subject: [PATCH 1/8] recognize AnyCPU in case of fallback to PEReader --- .../CommandLine/AssemblyMetadataProvider.cs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs index 2424097983..b25e1838f3 100644 --- a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs +++ b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs @@ -103,7 +103,6 @@ private Architecture GetArchitectureFromAssemblyMetadata(string path) switch (peReader.PEHeaders.CoffHeader.Machine) { case Machine.Amd64: - return Architecture.X64; case Machine.IA64: return Architecture.X64; case Machine.Arm64: @@ -111,9 +110,21 @@ private Architecture GetArchitectureFromAssemblyMetadata(string path) case Machine.Arm: return Architecture.ARM; case Machine.I386: - return Architecture.X86; + // If requires 32bit or if R2R + var corflags = peReader.PEHeaders.CorHeader.Flags; + if ((corflags & CorFlags.Requires32Bit) != 0 || ((corflags & CorFlags.ILOnly) == 0)) + { + return Architecture.X86; + } + else + { + return Architecture.AnyCPU; + } default: - break; + { + EqtTrace.Error($"AssemblyMetadataProvider.GetArchitecture: Unhandled architecture '{peReader.PEHeaders.CoffHeader.Machine}'"); + break; + } } } From c84a7b0613d970c3416b7ff972b36c3150837117 Mon Sep 17 00:00:00 2001 From: Marco Rossignoli Date: Fri, 28 Jan 2022 12:32:00 +0100 Subject: [PATCH 2/8] fix style --- src/vstest.console/CommandLine/AssemblyMetadataProvider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs index ac6e3e0775..0f18644055 100644 --- a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs +++ b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs @@ -97,8 +97,8 @@ public Architecture GetArchitecture(string assemblyPath) private Architecture GetArchitectureFromAssemblyMetadata(string path) { Architecture arch = Architecture.AnyCPU; - using (Stream stream = this.fileHelper.GetStream(path, FileMode.Open, FileAccess.Read)) - using (PEReader peReader = new PEReader(stream)) + using (Stream stream = _fileHelper.GetStream(path, FileMode.Open, FileAccess.Read)) + using (PEReader peReader = new(stream)) { switch (peReader.PEHeaders.CoffHeader.Machine) { From 826bd6c957242f7c4ab25027034922e0a167af91 Mon Sep 17 00:00:00 2001 From: Marco Rossignoli Date: Fri, 28 Jan 2022 15:17:38 +0100 Subject: [PATCH 3/8] Update src/vstest.console/CommandLine/AssemblyMetadataProvider.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jakub Jareš --- src/vstest.console/CommandLine/AssemblyMetadataProvider.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs index 0f18644055..f96a41237d 100644 --- a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs +++ b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs @@ -110,7 +110,10 @@ private Architecture GetArchitectureFromAssemblyMetadata(string path) case Machine.Arm: return Architecture.ARM; case Machine.I386: - // If requires 32bit or if R2R + // We can distinguish AnyCPU only from the set of CorFlags.Requires32Bit, but in case of Ready + // to Run image that flag is not "updated" and ignored. So we check if the module is IL only or + // not. If it's IL only it means that is a R2R (Ready to Run) and we're already in the correct architecture x86. In all + // other cases the architecture will end inside the correct switch branch. var corflags = peReader.PEHeaders.CorHeader.Flags; if ((corflags & CorFlags.Requires32Bit) != 0 || ((corflags & CorFlags.ILOnly) == 0)) { From 16dca1f90b95fdd31ff5d39578a0016b1b08bec8 Mon Sep 17 00:00:00 2001 From: Marco Rossignoli Date: Fri, 28 Jan 2022 15:19:47 +0100 Subject: [PATCH 4/8] Update src/vstest.console/CommandLine/AssemblyMetadataProvider.cs --- src/vstest.console/CommandLine/AssemblyMetadataProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs index f96a41237d..4f586bd56f 100644 --- a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs +++ b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs @@ -112,7 +112,7 @@ private Architecture GetArchitectureFromAssemblyMetadata(string path) case Machine.I386: // We can distinguish AnyCPU only from the set of CorFlags.Requires32Bit, but in case of Ready // to Run image that flag is not "updated" and ignored. So we check if the module is IL only or - // not. If it's IL only it means that is a R2R (Ready to Run) and we're already in the correct architecture x86. In all + // not. If it's not IL only it means that is a R2R (Ready to Run) and we're already in the correct architecture x86. In all // other cases the architecture will end inside the correct switch branch. var corflags = peReader.PEHeaders.CorHeader.Flags; if ((corflags & CorFlags.Requires32Bit) != 0 || ((corflags & CorFlags.ILOnly) == 0)) From 4b52fd462d69776c06f4d93d8839f2d95379e473 Mon Sep 17 00:00:00 2001 From: Marco Rossignoli Date: Fri, 28 Jan 2022 15:55:51 +0100 Subject: [PATCH 5/8] Update src/vstest.console/CommandLine/AssemblyMetadataProvider.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Amaury Levé --- src/vstest.console/CommandLine/AssemblyMetadataProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs index 4f586bd56f..be5b0128c9 100644 --- a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs +++ b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs @@ -125,7 +125,7 @@ private Architecture GetArchitectureFromAssemblyMetadata(string path) } default: { - EqtTrace.Error($"AssemblyMetadataProvider.GetArchitecture: Unhandled architecture '{peReader.PEHeaders.CoffHeader.Machine}'"); + EqtTrace.Error($"AssemblyMetadataProvider.GetArchitecture: Unhandled architecture '{peReader.PEHeaders.CoffHeader.Machine}'."); break; } } From 48f01d23b125d542395191eb9e6bd760333d3bcc Mon Sep 17 00:00:00 2001 From: Marco Rossignoli Date: Fri, 28 Jan 2022 15:56:02 +0100 Subject: [PATCH 6/8] Update src/vstest.console/CommandLine/AssemblyMetadataProvider.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Amaury Levé --- src/vstest.console/CommandLine/AssemblyMetadataProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs index be5b0128c9..81c29fc6d4 100644 --- a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs +++ b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs @@ -115,7 +115,7 @@ private Architecture GetArchitectureFromAssemblyMetadata(string path) // not. If it's not IL only it means that is a R2R (Ready to Run) and we're already in the correct architecture x86. In all // other cases the architecture will end inside the correct switch branch. var corflags = peReader.PEHeaders.CorHeader.Flags; - if ((corflags & CorFlags.Requires32Bit) != 0 || ((corflags & CorFlags.ILOnly) == 0)) + if ((corflags & CorFlags.Requires32Bit) != 0 || (corflags & CorFlags.ILOnly) == 0) { return Architecture.X86; } From 382091610c0f8f51209ff4a71143d84ed5b448f4 Mon Sep 17 00:00:00 2001 From: Marco Rossignoli Date: Fri, 28 Jan 2022 15:58:41 +0100 Subject: [PATCH 7/8] cleanup --- src/vstest.console/CommandLine/AssemblyMetadataProvider.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs index 81c29fc6d4..b0bf31fb07 100644 --- a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs +++ b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs @@ -110,9 +110,9 @@ private Architecture GetArchitectureFromAssemblyMetadata(string path) case Machine.Arm: return Architecture.ARM; case Machine.I386: - // We can distinguish AnyCPU only from the set of CorFlags.Requires32Bit, but in case of Ready - // to Run image that flag is not "updated" and ignored. So we check if the module is IL only or - // not. If it's not IL only it means that is a R2R (Ready to Run) and we're already in the correct architecture x86. In all + // We can distinguish AnyCPU only from the set of CorFlags.Requires32Bit, but in case of Ready + // to Run image that flag is not "updated" and ignored. So we check if the module is IL only or + // not. If it's not IL only it means that is a R2R (Ready to Run) and we're already in the correct architecture x86. In all // other cases the architecture will end inside the correct switch branch. var corflags = peReader.PEHeaders.CorHeader.Flags; if ((corflags & CorFlags.Requires32Bit) != 0 || (corflags & CorFlags.ILOnly) == 0) From e9030ec05aeea2a6b823e685acb4ccb612fa30fe Mon Sep 17 00:00:00 2001 From: Marco Rossignoli Date: Fri, 28 Jan 2022 15:59:34 +0100 Subject: [PATCH 8/8] fix comment --- src/vstest.console/CommandLine/AssemblyMetadataProvider.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs index b0bf31fb07..d71cbfc0fd 100644 --- a/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs +++ b/src/vstest.console/CommandLine/AssemblyMetadataProvider.cs @@ -111,9 +111,9 @@ private Architecture GetArchitectureFromAssemblyMetadata(string path) return Architecture.ARM; case Machine.I386: // We can distinguish AnyCPU only from the set of CorFlags.Requires32Bit, but in case of Ready - // to Run image that flag is not "updated" and ignored. So we check if the module is IL only or - // not. If it's not IL only it means that is a R2R (Ready to Run) and we're already in the correct architecture x86. In all - // other cases the architecture will end inside the correct switch branch. + // to Run image that flag is not "updated" and ignored. So we check if the module is IL only or not. + // If it's not IL only it means that is a R2R (Ready to Run) and we're already in the correct architecture x86. + // In all other cases the architecture will end inside the correct switch branch. var corflags = peReader.PEHeaders.CorHeader.Flags; if ((corflags & CorFlags.Requires32Bit) != 0 || (corflags & CorFlags.ILOnly) == 0) {