From 680a9ac48db6f0cb4005ebd6596cbf18ee96edf9 Mon Sep 17 00:00:00 2001 From: tmat Date: Wed, 8 Feb 2023 17:34:59 -0800 Subject: [PATCH] Local state tracing instrumentation --- .../CSharp/Portable/Binder/Binder.cs | 2 +- .../Portable/Binder/Binder_Statements.cs | 1 + .../CSharp/Portable/BoundTree/BoundNode.cs | 17 + .../CSharp/Portable/BoundTree/BoundNodes.xml | 38 +- .../CSharp/Portable/BoundTree/Constructors.cs | 3 +- .../CSharp/Portable/CodeGen/CodeGenerator.cs | 6 +- .../CSharp/Portable/CodeGen/EmitExpression.cs | 47 + .../CSharp/Portable/CodeGen/EmitStatement.cs | 58 +- .../CSharp/Portable/CodeGen/Optimizer.cs | 5 + .../Portable/Compilation/CSharpCompilation.cs | 9 +- .../Portable/Compiler/MethodCompiler.cs | 126 +- .../EditAndContinue/PEDeltaAssemblyBuilder.cs | 8 + .../Portable/Emitter/Model/PEModuleBuilder.cs | 3 + .../Portable/FlowAnalysis/AbstractFlowPass.cs | 15 + .../FlowAnalysis/DefiniteAssignment.cs | 20 + .../Portable/FlowAnalysis/FlowAnalysisPass.cs | 6 +- .../FlowAnalysis/LocalDataFlowPass.cs | 9 + .../Generated/BoundNodes.xml.Generated.cs | 323 +- ...yncIteratorMethodToStateMachineRewriter.cs | 11 +- .../AsyncMethodToStateMachineRewriter.cs | 19 +- .../AsyncRewriter.AsyncIteratorRewriter.cs | 8 +- .../Lowering/AsyncRewriter/AsyncRewriter.cs | 36 +- .../ClosureConversion/ClosureConversion.cs | 24 +- .../LambdaCapturedVariable.cs | 6 +- .../CodeCoverageInstrumenter.cs | 8 +- .../Instrumentation/CompoundInstrumenter.cs | 53 +- .../Instrumentation/DebugInfoInjector.cs | 43 +- .../Lowering/Instrumentation/Instrumenter.cs | 48 +- .../LocalStateTracingInstrumenter.cs | 508 ++ .../IteratorMethodToStateMachineRewriter.cs | 50 +- .../IteratorRewriter/IteratorRewriter.cs | 18 +- .../Lowering/LocalRewriter/LocalRewriter.cs | 35 +- .../LocalRewriter_AssignmentOperator.cs | 8 +- .../LocalRewriter/LocalRewriter_Block.cs | 10 +- .../LocalRewriter/LocalRewriter_Call.cs | 11 +- ...LocalRewriter_FunctionPointerInvocation.cs | 16 +- .../LocalRewriter_LocalDeclaration.cs | 4 +- .../LocalRewriter_ObjectCreationExpression.cs | 5 + .../LocalRewriter_TryStatement.cs | 20 +- .../Lowering/MethodToClassRewriter.cs | 41 +- .../MethodToStateMachineRewriter.cs | 36 +- .../StateMachineRewriter.cs | 21 +- .../Lowering/SyntheticBoundNodeFactory.cs | 57 +- .../Symbols/Synthesized/GeneratedNameKind.cs | 1 + .../Symbols/Synthesized/GeneratedNames.cs | 6 + .../CSharp/Test/Emit/CodeGen/CodeGenTests.cs | 1 - .../DynamicInstrumentationTests.cs | 19 +- .../LocalStateTracingTests.cs | 5898 +++++++++++++++++ .../Test/Emit2/FlowAnalysis/FlowTestBase.cs | 2 +- .../Semantics/ImplicitlyTypeArraysTests.cs | 2 +- .../Test/Semantic/Semantics/OperatorTests.cs | 2 +- .../Semantics/OverloadResolutionTestBase.cs | 2 +- .../Symbol/Symbols/MissingSpecialMember.cs | 28 + .../CodeAnalysisTest/Emit/EmitOptionsTests.cs | 1 - .../Core/Portable/CodeAnalysisResources.resx | 3 + .../CodeGen/DynamicAnalysisMethodBodyData.cs | 20 - .../Core/Portable/CodeGen/ILBuilderEmit.cs | 14 +- .../Core/Portable/CodeGen/MethodBody.cs | 10 +- .../Portable/CommandLine/CommonCompiler.cs | 2 - .../Core/Portable/Compilation/Compilation.cs | 8 +- .../Emit/EditAndContinue/DefinitionMap.cs | 10 +- .../Emit/EditAndContinue/DeletedMethodBody.cs | 2 +- .../Core/Portable/Emit/EmitOptions.cs | 3 +- .../Core/Portable/Emit/InstrumentationKind.cs | 9 +- .../Portable/Emit/MethodInstrumentation.cs | 26 + .../Emit/NoPia/CommonEmbeddedMethod.cs | 2 +- .../Core/Portable/Emit/SemanticEdit.cs | 47 +- .../InternalUtilities/EnumerableExtensions.cs | 2 +- .../Core/Portable/PEWriter/Members.cs | 6 +- .../MetadataWriter.DynamicAnalysis.cs | 15 +- .../Core/Portable/PEWriter/MetadataWriter.cs | 73 +- .../PEWriter/RootModuleStaticConstructor.cs | 2 +- .../Core/Portable/PublicAPI.Unshipped.txt | 9 + .../Core/Portable/SynthesizedLocalKind.cs | 6 + .../Core/Portable/WellKnownMember.cs | 36 + .../Core/Portable/WellKnownMembers.cs | 275 + src/Compilers/Core/Portable/WellKnownTypes.cs | 2 + .../Portable/xlf/CodeAnalysisResources.cs.xlf | 5 + .../Portable/xlf/CodeAnalysisResources.de.xlf | 5 + .../Portable/xlf/CodeAnalysisResources.es.xlf | 5 + .../Portable/xlf/CodeAnalysisResources.fr.xlf | 5 + .../Portable/xlf/CodeAnalysisResources.it.xlf | 5 + .../Portable/xlf/CodeAnalysisResources.ja.xlf | 5 + .../Portable/xlf/CodeAnalysisResources.ko.xlf | 5 + .../Portable/xlf/CodeAnalysisResources.pl.xlf | 5 + .../xlf/CodeAnalysisResources.pt-BR.xlf | 5 + .../Portable/xlf/CodeAnalysisResources.ru.xlf | 5 + .../Portable/xlf/CodeAnalysisResources.tr.xlf | 5 + .../xlf/CodeAnalysisResources.zh-Hans.xlf | 5 + .../xlf/CodeAnalysisResources.zh-Hant.xlf | 5 + src/Compilers/Test/Core/CommonTestBase.cs | 4 +- .../Test/Core/CompilationVerifier.cs | 11 +- .../Test/Core/InstrumentationChecker.cs | 8 +- .../Test/Core/Metadata/ILBuilderVisualizer.cs | 20 +- .../Desktop/DesktopRuntimeEnvironment.cs | 2 +- .../Utilities/CSharp/CompilingTestBase.cs | 2 +- .../Portable/CodeGen/CodeGenerator.vb | 3 +- .../Portable/Compilation/MethodCompiler.vb | 83 +- .../Compilation/VisualBasicCompilation.vb | 19 +- .../EditAndContinue/PEDeltaAssemblyBuilder.vb | 4 + .../Portable/Emit/PEModuleBuilder.vb | 4 + .../VisualBasic/Portable/Lowering/Rewriter.vb | 16 +- .../Source/SourceMemberContainerTypeSymbol.vb | 2 +- .../WellKnownTypeValidationTests.vb | 56 + .../Rewriters/CapturedVariableRewriter.cs | 2 +- .../Symbols/EEMethodSymbol.cs | 19 +- 106 files changed, 8231 insertions(+), 425 deletions(-) create mode 100644 src/Compilers/CSharp/Portable/Lowering/Instrumentation/LocalStateTracingInstrumenter.cs create mode 100644 src/Compilers/CSharp/Test/Emit/Emit/LocalStateTracing/LocalStateTracingTests.cs delete mode 100644 src/Compilers/Core/Portable/CodeGen/DynamicAnalysisMethodBodyData.cs create mode 100644 src/Compilers/Core/Portable/Emit/MethodInstrumentation.cs diff --git a/src/Compilers/CSharp/Portable/Binder/Binder.cs b/src/Compilers/CSharp/Portable/Binder/Binder.cs index fd01285289f2b..ca2362131ea6c 100644 --- a/src/Compilers/CSharp/Portable/Binder/Binder.cs +++ b/src/Compilers/CSharp/Portable/Binder/Binder.cs @@ -882,7 +882,7 @@ internal BoundStatement WrapWithVariablesAndLocalFunctionsIfAny(CSharpSyntaxNode return statement; } - return new BoundBlock(statement.Syntax, locals, localFunctions, hasUnsafeModifier: false, + return new BoundBlock(statement.Syntax, locals, localFunctions, hasUnsafeModifier: false, instrumentation: null, ImmutableArray.Create(statement)) { WasCompilerGenerated = true }; } diff --git a/src/Compilers/CSharp/Portable/Binder/Binder_Statements.cs b/src/Compilers/CSharp/Portable/Binder/Binder_Statements.cs index eef9856fb8f9b..bb25cbb9c9960 100644 --- a/src/Compilers/CSharp/Portable/Binder/Binder_Statements.cs +++ b/src/Compilers/CSharp/Portable/Binder/Binder_Statements.cs @@ -1889,6 +1889,7 @@ private BoundBlock FinishBindBlockParts(CSharpSyntaxNode node, ImmutableArray + + + + + + + - @@ -708,6 +715,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -974,6 +1007,9 @@ + + +