blob: 493883b5d9931b34ab671daceb70378908e18dba (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using ILCompiler.DependencyAnalysis;
using ILCompiler.DependencyAnalysisFramework;
namespace ILCompiler
{
public abstract class CompilationBuilder
{
protected readonly CompilerTypeSystemContext _context;
protected readonly CompilationModuleGroup _compilationGroup;
protected readonly NameMangler _nameMangler;
// These need to provide reasonable defaults so that the user can optionally skip
// calling the Use/Configure methods and still get something reasonable back.
protected Logger _logger = Logger.Null;
private DependencyTrackingLevel _dependencyTrackingLevel = DependencyTrackingLevel.None;
protected IEnumerable<ICompilationRootProvider> _compilationRoots = Array.Empty<ICompilationRootProvider>();
protected OptimizationMode _optimizationMode = OptimizationMode.None;
protected MetadataManager _metadataManager;
protected VTableSliceProvider _vtableSliceProvider = new LazyVTableSliceProvider();
protected DictionaryLayoutProvider _dictionaryLayoutProvider = new LazyDictionaryLayoutProvider();
protected DebugInformationProvider _debugInformationProvider = new DebugInformationProvider();
public CompilationBuilder(CompilerTypeSystemContext context, CompilationModuleGroup compilationGroup, NameMangler nameMangler)
{
_context = context;
_compilationGroup = compilationGroup;
_nameMangler = nameMangler;
_metadataManager = new EmptyMetadataManager(compilationGroup, context);
}
public CompilationBuilder UseLogger(Logger logger)
{
_logger = logger;
return this;
}
public CompilationBuilder UseDependencyTracking(DependencyTrackingLevel trackingLevel)
{
_dependencyTrackingLevel = trackingLevel;
return this;
}
public CompilationBuilder UseMetadataManager(MetadataManager metadataManager)
{
_metadataManager = metadataManager;
return this;
}
public CompilationBuilder UseCompilationRoots(IEnumerable<ICompilationRootProvider> compilationRoots)
{
_compilationRoots = compilationRoots;
return this;
}
public CompilationBuilder UseOptimizationMode(OptimizationMode mode)
{
_optimizationMode = mode;
return this;
}
public CompilationBuilder UseVTableSliceProvider(VTableSliceProvider provider)
{
_vtableSliceProvider = provider;
return this;
}
public CompilationBuilder UseGenericDictionaryLayoutProvider(DictionaryLayoutProvider provider)
{
_dictionaryLayoutProvider = provider;
return this;
}
public CompilationBuilder UseDebugInfoProvider(DebugInformationProvider provider)
{
_debugInformationProvider = provider;
return this;
}
public abstract CompilationBuilder UseBackendOptions(IEnumerable<string> options);
protected DependencyAnalyzerBase<NodeFactory> CreateDependencyGraph(NodeFactory factory)
{
// TODO: add graph sorter when we go multi-threaded
return _dependencyTrackingLevel.CreateDependencyGraph(factory);
}
public ILScannerBuilder GetILScannerBuilder(CompilationModuleGroup compilationGroup = null)
{
return new ILScannerBuilder(_context, compilationGroup ?? _compilationGroup, _nameMangler);
}
public abstract ICompilation ToCompilation();
}
/// <summary>
/// Represents the level of optimizations performed by the compiler.
/// </summary>
public enum OptimizationMode
{
/// <summary>
/// Do not optimize.
/// </summary>
None,
/// <summary>
/// Minimize code space.
/// </summary>
PreferSize,
/// <summary>
/// Generate blended code. (E.g. favor size for rarely executed code such as class constructors.)
/// </summary>
Blended,
/// <summary>
/// Maximize execution speed.
/// </summary>
PreferSpeed,
}
}
|