22
22
#include " swift/AST/SimpleRequest.h"
23
23
#include " swift/Basic/PrimarySpecificPaths.h"
24
24
#include " llvm/ADT/StringSet.h"
25
+ #include " llvm/Target/TargetMachine.h"
25
26
26
27
namespace swift {
27
28
class SourceFile ;
28
29
class IRGenOptions ;
29
30
class SILModule ;
31
+ class SILOptions ;
30
32
struct TBDGenOptions ;
31
33
32
34
namespace irgen {
@@ -39,6 +41,7 @@ namespace llvm {
39
41
class GlobalVariable ;
40
42
class LLVMContext ;
41
43
class Module ;
44
+ class TargetMachine ;
42
45
43
46
namespace orc {
44
47
class ThreadSafeModule ;
@@ -58,8 +61,9 @@ class GeneratedModule final {
58
61
private:
59
62
std::unique_ptr<llvm::LLVMContext> Context;
60
63
std::unique_ptr<llvm::Module> Module;
64
+ std::unique_ptr<llvm::TargetMachine> Target;
61
65
62
- GeneratedModule () : Context(nullptr ), Module(nullptr ) {}
66
+ GeneratedModule () : Context(nullptr ), Module(nullptr ), Target( nullptr ) {}
63
67
64
68
GeneratedModule (GeneratedModule const &) = delete ;
65
69
GeneratedModule &operator =(GeneratedModule const &) = delete ;
@@ -70,10 +74,13 @@ class GeneratedModule final {
70
74
// / The given pointers must not be null. If a null \c GeneratedModule is
71
75
// / needed, use \c GeneratedModule::null() instead.
72
76
explicit GeneratedModule (std::unique_ptr<llvm::LLVMContext> &&Context,
73
- std::unique_ptr<llvm::Module> &&Module)
74
- : Context(std::move(Context)), Module(std::move(Module)) {
77
+ std::unique_ptr<llvm::Module> &&Module,
78
+ std::unique_ptr<llvm::TargetMachine> &&Target)
79
+ : Context(std::move(Context)), Module(std::move(Module)),
80
+ Target(std::move(Target)) {
75
81
assert (getModule () && " Use GeneratedModule::null() instead" );
76
82
assert (getContext () && " Use GeneratedModule::null() instead" );
83
+ assert (getTargetMachine () && " Use GeneratedModule::null() instead" );
77
84
}
78
85
79
86
GeneratedModule (GeneratedModule &&) = default ;
@@ -97,6 +104,9 @@ class GeneratedModule final {
97
104
const llvm::LLVMContext *getContext () const { return Context.get (); }
98
105
llvm::LLVMContext *getContext () { return Context.get (); }
99
106
107
+ const llvm::TargetMachine *getTargetMachine () const { return Target.get (); }
108
+ llvm::TargetMachine *getTargetMachine () { return Target.get (); }
109
+
100
110
public:
101
111
// / Release ownership of the context and module to the caller, consuming
102
112
// / this value in the process.
@@ -114,12 +124,15 @@ class GeneratedModule final {
114
124
};
115
125
116
126
struct IRGenDescriptor {
117
- llvm::PointerUnion<ModuleDecl *, SourceFile *> Ctx;
127
+ llvm::PointerUnion<FileUnit *, ModuleDecl *> Ctx;
118
128
119
129
const IRGenOptions &Opts;
120
130
const TBDGenOptions &TBDOpts;
131
+ const SILOptions &SILOpts;
121
132
133
+ Lowering::TypeConverter &Conv;
122
134
SILModule *SILMod;
135
+
123
136
StringRef ModuleName;
124
137
const PrimarySpecificPaths &PSPs;
125
138
StringRef PrivateDiscriminator;
@@ -142,14 +155,17 @@ struct IRGenDescriptor {
142
155
143
156
public:
144
157
static IRGenDescriptor
145
- forFile (SourceFile &SF, const IRGenOptions &Opts,
146
- const TBDGenOptions &TBDOpts, std::unique_ptr<SILModule> &&SILMod,
158
+ forFile (FileUnit *file, const IRGenOptions &Opts,
159
+ const TBDGenOptions &TBDOpts, const SILOptions &SILOpts,
160
+ Lowering::TypeConverter &Conv, std::unique_ptr<SILModule> &&SILMod,
147
161
StringRef ModuleName, const PrimarySpecificPaths &PSPs,
148
162
StringRef PrivateDiscriminator,
149
- llvm::GlobalVariable **outModuleHash) {
150
- return IRGenDescriptor{&SF ,
163
+ llvm::GlobalVariable **outModuleHash = nullptr ) {
164
+ return IRGenDescriptor{file ,
151
165
Opts,
152
166
TBDOpts,
167
+ SILOpts,
168
+ Conv,
153
169
SILMod.release (),
154
170
ModuleName,
155
171
PSPs,
@@ -160,14 +176,17 @@ struct IRGenDescriptor {
160
176
161
177
static IRGenDescriptor
162
178
forWholeModule (ModuleDecl *M, const IRGenOptions &Opts,
163
- const TBDGenOptions &TBDOpts,
179
+ const TBDGenOptions &TBDOpts, const SILOptions &SILOpts,
180
+ Lowering::TypeConverter &Conv,
164
181
std::unique_ptr<SILModule> &&SILMod, StringRef ModuleName,
165
182
const PrimarySpecificPaths &PSPs,
166
- ArrayRef<std::string> parallelOutputFilenames,
167
- llvm::GlobalVariable **outModuleHash) {
183
+ ArrayRef<std::string> parallelOutputFilenames = {} ,
184
+ llvm::GlobalVariable **outModuleHash = nullptr ) {
168
185
return IRGenDescriptor{M,
169
186
Opts,
170
187
TBDOpts,
188
+ SILOpts,
189
+ Conv,
171
190
SILMod.release (),
172
191
ModuleName,
173
192
PSPs,
@@ -217,6 +236,21 @@ void simple_display(llvm::raw_ostream &out, const IRGenDescriptor &d);
217
236
218
237
SourceLoc extractNearestSourceLoc (const IRGenDescriptor &desc);
219
238
239
+ // / Returns the optimized IR for a given file or module. Note this runs the
240
+ // / entire compiler pipeline and ignores the passed SILModule.
241
+ class OptimizedIRRequest
242
+ : public SimpleRequest<OptimizedIRRequest, GeneratedModule(IRGenDescriptor),
243
+ RequestFlags::Uncached> {
244
+ public:
245
+ using SimpleRequest::SimpleRequest;
246
+
247
+ private:
248
+ friend SimpleRequest;
249
+
250
+ // Evaluation.
251
+ GeneratedModule evaluate (Evaluator &evaluator, IRGenDescriptor desc) const ;
252
+ };
253
+
220
254
// / The zone number for IRGen.
221
255
#define SWIFT_TYPEID_ZONE IRGen
222
256
#define SWIFT_TYPEID_HEADER " swift/AST/IRGenTypeIDZone.def"
0 commit comments