Beispiel #1
0
        public LinkContext(Pipeline pipeline, AssemblyResolver resolver, ReaderParameters readerParameters, UnintializedContextFactory factory)
        {
            _pipeline         = pipeline;
            _resolver         = resolver;
            _resolver.Context = this;
            _actions          = new Dictionary <string, AssemblyAction> ();
            _parameters       = new Dictionary <string, string> (StringComparer.Ordinal);
            _readerParameters = readerParameters;

            SymbolReaderProvider = new DefaultSymbolReaderProvider(false);

            if (factory == null)
            {
                throw new ArgumentNullException(nameof(factory));
            }

            _annotations              = factory.CreateAnnotationStore(this);
            MarkingHelpers            = factory.CreateMarkingHelpers(this);
            Tracer                    = factory.CreateTracer(this);
            ReflectionPatternRecorder = new LoggingReflectionPatternRecorder(this);
            MarkedKnownMembers        = new KnownMembers();
            StripResources            = true;
            PInvokes                  = new List <PInvokeInfo> ();

            // See https://github.com/mono/linker/issues/612
            const CodeOptimizations defaultOptimizations =
                CodeOptimizations.BeforeFieldInit |
                CodeOptimizations.OverrideRemoval |
                CodeOptimizations.UnusedInterfaces |
                CodeOptimizations.IPConstantPropagation;

            Optimizations = new CodeOptimizationsSettings(defaultOptimizations);
        }
Beispiel #2
0
        public static bool GetOptimizationName(string optimization, out CodeOptimizations codeOptimizations)
        {
            var method     = typeof(Driver).GetMethod("GetOptimizationName", BindingFlags.NonPublic | BindingFlags.Static);
            var parameters = new object [] { optimization, null };
            var ret        = (bool)(method.Invoke(null, parameters));

            codeOptimizations = (CodeOptimizations)(parameters [1]);
            return(ret);
        }
Beispiel #3
0
        public bool IsEnabled(CodeOptimizations optimizations, string assemblyName)
        {
            // Only one bit is set
            Debug.Assert(optimizations != 0 && (optimizations & (optimizations - 1)) == 0);

            if (perAssembly.Count > 0 &&
                perAssembly.TryGetValue(assemblyName, out CodeOptimizations assembly))
            {
                return((assembly & optimizations) != 0);
            }

            return((Global & optimizations) != 0);
        }
Beispiel #4
0
        public LinkContext(Pipeline pipeline, ILogger logger)
        {
            _pipeline = pipeline;
            _logger   = logger ?? throw new ArgumentNullException(nameof(logger));

            _resolver = new AssemblyResolver()
            {
                Context = this
            };
            _typeNameResolver = new TypeNameResolver(this);
            _actions          = new Dictionary <string, AssemblyAction> ();
            _parameters       = new Dictionary <string, string> (StringComparer.Ordinal);
            _readerParameters = new ReaderParameters {
                AssemblyResolver = _resolver
            };
            _customAttributes = new CustomAttributeSource(this);
            _cachedWarningMessageContainers = new List <MessageContainer> ();

            SymbolReaderProvider = new DefaultSymbolReaderProvider(false);

            var factory = new UnintializedContextFactory();

            _annotations              = factory.CreateAnnotationStore(this);
            MarkingHelpers            = factory.CreateMarkingHelpers(this);
            Tracer                    = factory.CreateTracer(this);
            ReflectionPatternRecorder = new LoggingReflectionPatternRecorder(this);
            MarkedKnownMembers        = new KnownMembers();
            PInvokes                  = new List <PInvokeInfo> ();
            Suppressions              = new UnconditionalSuppressMessageAttributeState(this);
            NoWarn                    = new HashSet <int> ();
            GeneralWarnAsError        = false;
            WarnAsError               = new Dictionary <int, bool> ();
            WarnVersion               = WarnVersion.Latest;

            const CodeOptimizations defaultOptimizations =
                CodeOptimizations.BeforeFieldInit |
                CodeOptimizations.OverrideRemoval |
                CodeOptimizations.UnusedInterfaces |
                CodeOptimizations.UnusedTypeChecks |
                CodeOptimizations.IPConstantPropagation |
                CodeOptimizations.UnreachableBodies |
                CodeOptimizations.RemoveDescriptors |
                CodeOptimizations.RemoveLinkAttributes |
                CodeOptimizations.RemoveSubstitutions |
                CodeOptimizations.RemoveDynamicDependencyAttribute;

            Optimizations = new CodeOptimizationsSettings(defaultOptimizations);
        }
Beispiel #5
0
        public void Disable(CodeOptimizations optimizations, string assemblyContext = null)
        {
            if (assemblyContext == null)
            {
                Global &= ~optimizations;
                return;
            }

            if (!perAssembly.ContainsKey(assemblyContext))
            {
                perAssembly.Add(assemblyContext, 0);
                return;
            }

            perAssembly [assemblyContext] &= ~optimizations;
        }
Beispiel #6
0
        public LinkContext(Pipeline pipeline, AssemblyResolver resolver, ReaderParameters readerParameters, UnintializedContextFactory factory)
        {
            _pipeline         = pipeline;
            _resolver         = resolver;
            _resolver.Context = this;
            _typeNameResolver = new TypeNameResolver(this);
            _actions          = new Dictionary <string, AssemblyAction> ();
            _parameters       = new Dictionary <string, string> (StringComparer.Ordinal);
            _readerParameters = readerParameters;
            _customAttributes = new CustomAttributeSource();
            _cachedWarningMessageContainers = new List <MessageContainer> ();

            SymbolReaderProvider = new DefaultSymbolReaderProvider(false);
            Logger = new ConsoleLogger();

            if (factory == null)
            {
                throw new ArgumentNullException(nameof(factory));
            }

            _annotations              = factory.CreateAnnotationStore(this);
            MarkingHelpers            = factory.CreateMarkingHelpers(this);
            Tracer                    = factory.CreateTracer(this);
            ReflectionPatternRecorder = new LoggingReflectionPatternRecorder(this);
            MarkedKnownMembers        = new KnownMembers();
            StripDescriptors          = true;
            StripSubstitutions        = true;
            StripLinkAttributes       = true;
            PInvokes                  = new List <PInvokeInfo> ();
            Suppressions              = new UnconditionalSuppressMessageAttributeState(this);
            NoWarn                    = new HashSet <int> ();
            GeneralWarnAsError        = false;
            WarnAsError               = new Dictionary <int, bool> ();
            WarnVersion               = WarnVersion.Latest;

            // See https://github.com/mono/linker/issues/612
            const CodeOptimizations defaultOptimizations =
                CodeOptimizations.BeforeFieldInit |
                CodeOptimizations.OverrideRemoval |
                CodeOptimizations.UnusedInterfaces |
                CodeOptimizations.UnusedTypeChecks |
                CodeOptimizations.IPConstantPropagation;

            Optimizations = new CodeOptimizationsSettings(defaultOptimizations);
        }
Beispiel #7
0
        static bool GetOptimizationName(string text, out CodeOptimizations optimization)
        {
            switch (text.ToLowerInvariant())
            {
            case "beforefieldinit":
                optimization = CodeOptimizations.BeforeFieldInit;
                return(true);

            case "overrideremoval":
                optimization = CodeOptimizations.OverrideRemoval;
                return(true);

            case "unreachablebodies":
                optimization = CodeOptimizations.UnreachableBodies;
                return(true);

            case "clearinitlocals":
                optimization = CodeOptimizations.ClearInitLocals;
                return(true);

            case "unusedinterfaces":
                optimization = CodeOptimizations.UnusedInterfaces;
                return(true);

            case "ipconstprop":
                optimization = CodeOptimizations.IPConstantPropagation;
                return(true);

            case "sealer":
                optimization = CodeOptimizations.Sealer;
                return(true);
            }

            Console.WriteLine($"Invalid optimization value '{text}'");
            optimization = 0;
            return(false);
        }
Beispiel #8
0
 public new bool GetOptimizationName(string optimization, out CodeOptimizations codeOptimizations)
 {
     return(base.GetOptimizationName(optimization, out codeOptimizations));
 }
Beispiel #9
0
 public bool IsOptimizationEnabled(CodeOptimizations optimization)
 {
     return((DisabledOptimizations & optimization) == 0);
 }
Beispiel #10
0
 internal bool IsEnabled(CodeOptimizations optimizations, AssemblyDefinition context)
 {
     return(IsEnabled(optimizations, context?.Name.Name));
 }
Beispiel #11
0
 public CodeOptimizationsSettings(CodeOptimizations globalOptimizations)
 {
     Global = globalOptimizations;
 }
Beispiel #12
0
 public bool IsOptimizationEnabled(CodeOptimizations optimization, AssemblyDefinition context)
 {
     return(Optimizations.IsEnabled(optimization, context));
 }
Beispiel #13
0
 public bool IsOptimizationEnabled(CodeOptimizations optimization, MemberReference context)
 {
     return(Optimizations.IsEnabled(optimization, context?.Module.Assembly));
 }
Beispiel #14
0
 public Pair(CodeOptimizations set, CodeOptimizations values)
 {
     this.Set    = set;
     this.Values = values;
 }
Beispiel #15
0
 public bool CanApplyOptimization(CodeOptimizations optimization, AssemblyDefinition context)
 {
     return(Annotations.GetAction(context) == AssemblyAction.Link &&
            IsOptimizationEnabled(optimization, context));
 }