protected override void DoAdditionalProcessing() { if (_methods.Count > 0) { return; } ProcessingConditionals = true; while (_conditional_methods.Count > 0) { var conditional = _conditional_methods.Dequeue(); Tracer.Push(conditional); var scanner = _block_scanner_by_method [conditional]; if (scanner.DebugLevel > 0) { OptimizerContext.LogMessage(MessageImportance.Normal, $"CONDITIONAL METHOD: {conditional}"); OptimizerContext.Debug(); } scanner.RewriteConditionals(); base.MarkMethodBody(conditional.Body); Tracer.Pop(); } }
protected override TypeDefinition MarkType(TypeReference reference) { if (reference == null) { return(null); } reference = GetOriginalType(reference); if (reference is FunctionPointerType) { return(null); } if (reference is GenericParameter) { return(null); } var type = ResolveTypeDefinition(reference); if (type == null) { HandleUnresolvedType(reference); return(null); } if (Annotations.IsProcessed(type)) { return(null); } if (OptimizerContext.Options.EnableDebugging(OptimizerContext, type)) { OptimizerContext.LogMessage(MessageImportance.Normal, $"MARK TYPE: {type}"); OptimizerContext.Debug(); } OptimizerContext.Options.CheckFailList(OptimizerContext, type); if (ProcessingConditionals && OptimizerContext.IsConditionalTypeMarked(type)) { OptimizerContext.AttemptingToRedefineConditional(type); } return(base.MarkType(reference)); }
protected override void EnqueueMethod(MethodDefinition method) { if (OptimizerContext.Options.EnableDebugging(OptimizerContext, method)) { OptimizerContext.LogMessage(MessageImportance.Normal, $"ENQUEUE METHOD: {method}"); OptimizerContext.Debug(); } OptimizerContext.Options.CheckFailList(OptimizerContext, method); if (_conditional_methods.Contains(method)) { return; } base.EnqueueMethod(method); }
protected override void MarkMethodBody(MethodBody body) { if (!OptimizerContext.IsEnabled(body.Method)) { base.MarkMethodBody(body); return; } var debug = OptimizerContext.GetDebugLevel(body.Method); if (debug > 0) { OptimizerContext.LogMessage(MessageImportance.Normal, $"MARK BODY: {body.Method}"); OptimizerContext.Debug(); } var scanner = BasicBlockScanner.Scan(OptimizerContext, body.Method); if (scanner == null) { OptimizerContext.LogDebug($"BB SCAN FAILED: {body.Method}"); base.MarkMethodBody(body); return; } if (scanner == null || !scanner.FoundConditionals) { base.MarkMethodBody(body); return; } if (debug > 0) { OptimizerContext.LogDebug($"MARK BODY - CONDITIONAL: {body.Method}"); } scanner.RewriteConditionals(); base.MarkMethodBody(body); }