@@ -109,56 +109,52 @@ static void reportOptRecordError(Error E, DiagnosticsEngine &Diags,
109
109
});
110
110
}
111
111
112
- BackendConsumer::BackendConsumer (BackendAction Action, DiagnosticsEngine &Diags,
113
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
114
- const HeaderSearchOptions &HeaderSearchOpts,
115
- const PreprocessorOptions &PPOpts,
116
- const CodeGenOptions &CodeGenOpts,
117
- const TargetOptions &TargetOpts,
118
- const LangOptions &LangOpts,
119
- const std::string &InFile,
120
- SmallVector<LinkModule, 4 > LinkModules,
121
- std::unique_ptr<raw_pwrite_stream> OS,
122
- LLVMContext &C,
123
- CoverageSourceInfo *CoverageInfo)
124
- : Diags(Diags), Action(Action), HeaderSearchOpts(HeaderSearchOpts),
125
- CodeGenOpts (CodeGenOpts), TargetOpts(TargetOpts), LangOpts(LangOpts),
126
- AsmOutStream(std::move(OS)), Context(nullptr ), FS(VFS),
127
- LLVMIRGeneration(" irgen" , " LLVM IR Generation Time" ),
128
- LLVMIRGenerationRefCount(0 ),
129
- Gen(CreateLLVMCodeGen(Diags, InFile, std::move(VFS), HeaderSearchOpts,
130
- PPOpts, CodeGenOpts, C, CoverageInfo)),
131
- LinkModules(std::move(LinkModules)) {
132
- TimerIsEnabled = CodeGenOpts.TimePasses ;
133
- llvm::TimePassesIsEnabled = CodeGenOpts.TimePasses ;
134
- llvm::TimePassesPerRun = CodeGenOpts.TimePassesPerRun ;
112
+ BackendConsumer::BackendConsumer (
113
+ BackendAction Action, DiagnosticsEngine &Diags,
114
+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
115
+ const HeaderSearchOptions &HeaderSearchOpts,
116
+ const PreprocessorOptions &PPOpts, const CodeGenOptions &CodeGenOpts,
117
+ const TargetOptions &TargetOpts, const LangOptions &LangOpts,
118
+ const FileManager &FileMgr, const std::string &InFile,
119
+ SmallVector<LinkModule, 4 > LinkModules,
120
+ std::unique_ptr<raw_pwrite_stream> OS, LLVMContext &C,
121
+ CoverageSourceInfo *CoverageInfo)
122
+ : Diags(Diags), Action(Action), HeaderSearchOpts(HeaderSearchOpts),
123
+ CodeGenOpts (CodeGenOpts), TargetOpts(TargetOpts), LangOpts(LangOpts),
124
+ FileMgr(FileMgr), AsmOutStream(std::move(OS)), Context(nullptr ), FS(VFS),
125
+ LLVMIRGeneration(" irgen" , " LLVM IR Generation Time" ),
126
+ LLVMIRGenerationRefCount(0 ),
127
+ Gen(CreateLLVMCodeGen(Diags, InFile, std::move(VFS), HeaderSearchOpts,
128
+ PPOpts, CodeGenOpts, C, CoverageInfo)),
129
+ LinkModules(std::move(LinkModules)) {
130
+ TimerIsEnabled = CodeGenOpts.TimePasses ;
131
+ llvm::TimePassesIsEnabled = CodeGenOpts.TimePasses ;
132
+ llvm::TimePassesPerRun = CodeGenOpts.TimePassesPerRun ;
135
133
}
136
134
137
135
// This constructor is used in installing an empty BackendConsumer
138
136
// to use the clang diagnostic handler for IR input files. It avoids
139
137
// initializing the OS field.
140
- BackendConsumer::BackendConsumer (BackendAction Action, DiagnosticsEngine &Diags,
141
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
142
- const HeaderSearchOptions &HeaderSearchOpts,
143
- const PreprocessorOptions &PPOpts,
144
- const CodeGenOptions &CodeGenOpts,
145
- const TargetOptions &TargetOpts,
146
- const LangOptions &LangOpts,
147
- llvm::Module *Module,
148
- SmallVector<LinkModule, 4 > LinkModules,
149
- LLVMContext &C,
150
- CoverageSourceInfo *CoverageInfo)
151
- : Diags(Diags), Action(Action), HeaderSearchOpts(HeaderSearchOpts),
152
- CodeGenOpts(CodeGenOpts), TargetOpts(TargetOpts), LangOpts(LangOpts),
153
- Context(nullptr ), FS(VFS),
154
- LLVMIRGeneration(" irgen" , " LLVM IR Generation Time" ),
155
- LLVMIRGenerationRefCount(0 ),
156
- Gen(CreateLLVMCodeGen(Diags, " " , std::move(VFS), HeaderSearchOpts,
157
- PPOpts, CodeGenOpts, C, CoverageInfo)),
158
- LinkModules(std::move(LinkModules)), CurLinkModule(Module) {
159
- TimerIsEnabled = CodeGenOpts.TimePasses ;
160
- llvm::TimePassesIsEnabled = CodeGenOpts.TimePasses ;
161
- llvm::TimePassesPerRun = CodeGenOpts.TimePassesPerRun ;
138
+ BackendConsumer::BackendConsumer (
139
+ BackendAction Action, DiagnosticsEngine &Diags,
140
+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
141
+ const HeaderSearchOptions &HeaderSearchOpts,
142
+ const PreprocessorOptions &PPOpts, const CodeGenOptions &CodeGenOpts,
143
+ const TargetOptions &TargetOpts, const LangOptions &LangOpts,
144
+ const FileManager &FileMgr, llvm::Module *Module,
145
+ SmallVector<LinkModule, 4 > LinkModules, LLVMContext &C,
146
+ CoverageSourceInfo *CoverageInfo)
147
+ : Diags(Diags), Action(Action), HeaderSearchOpts(HeaderSearchOpts),
148
+ CodeGenOpts(CodeGenOpts), TargetOpts(TargetOpts), LangOpts(LangOpts),
149
+ FileMgr(FileMgr), Context(nullptr ), FS(VFS),
150
+ LLVMIRGeneration(" irgen" , " LLVM IR Generation Time" ),
151
+ LLVMIRGenerationRefCount(0 ),
152
+ Gen(CreateLLVMCodeGen(Diags, " " , std::move(VFS), HeaderSearchOpts, PPOpts,
153
+ CodeGenOpts, C, CoverageInfo)),
154
+ LinkModules(std::move(LinkModules)), CurLinkModule(Module) {
155
+ TimerIsEnabled = CodeGenOpts.TimePasses ;
156
+ llvm::TimePassesIsEnabled = CodeGenOpts.TimePasses ;
157
+ llvm::TimePassesPerRun = CodeGenOpts.TimePassesPerRun ;
162
158
}
163
159
164
160
llvm::Module* BackendConsumer::getModule () const {
@@ -233,9 +229,37 @@ void BackendConsumer::HandleInterestingDecl(DeclGroupRef D) {
233
229
HandleTopLevelDecl (D);
234
230
}
235
231
232
+ bool BackendConsumer::ReloadModules (llvm::Module *M) {
233
+ for (const CodeGenOptions::BitcodeFileToLink &F :
234
+ CodeGenOpts.LinkBitcodeFiles ) {
235
+ auto BCBuf = FileMgr.getBufferForFile (F.Filename );
236
+ if (!BCBuf) {
237
+ Diags.Report (diag::err_cannot_open_file)
238
+ << F.Filename << BCBuf.getError ().message ();
239
+ LinkModules.clear ();
240
+ return true ;
241
+ }
242
+
243
+ LLVMContext &Ctx = getModule ()->getContext ();
244
+ Expected<std::unique_ptr<llvm::Module>> ModuleOrErr =
245
+ getOwningLazyBitcodeModule (std::move (*BCBuf), Ctx);
246
+
247
+ if (!ModuleOrErr) {
248
+ handleAllErrors (ModuleOrErr.takeError (), [&](ErrorInfoBase &EIB) {
249
+ Diags.Report (diag::err_cannot_open_file) << F.Filename << EIB.message ();
250
+ });
251
+ LinkModules.clear ();
252
+ return true ;
253
+ }
254
+ LinkModules.push_back ({std::move (ModuleOrErr.get ()), F.PropagateAttrs ,
255
+ F.Internalize , F.LinkFlags });
256
+ }
257
+
258
+ return false ; // success
259
+ }
260
+
236
261
// Links each entry in LinkModules into our module. Returns true on error.
237
262
bool BackendConsumer::LinkInModules (llvm::Module *M, bool ShouldLinkFiles) {
238
-
239
263
for (auto &LM : LinkModules) {
240
264
assert (LM.Module && " LinkModule does not actually have a module" );
241
265
@@ -257,37 +281,19 @@ bool BackendConsumer::LinkInModules(llvm::Module *M, bool ShouldLinkFiles) {
257
281
CurLinkModule = LM.Module .get ();
258
282
bool Err;
259
283
260
- auto DoLink = [&](auto &Mod) {
261
- if (LM.Internalize ) {
262
- Err = Linker::linkModules (
263
- *M, std::move (Mod), LM.LinkFlags ,
264
- [](llvm::Module &M, const llvm::StringSet<> &GVS) {
265
- internalizeModule (M, [&GVS](const llvm::GlobalValue &GV) {
266
- return !GV.hasName () || (GVS.count (GV.getName ()) == 0 );
267
- });
284
+ if (LM.Internalize ) {
285
+ Err = Linker::linkModules (
286
+ *M, std::move (LM.Module ), LM.LinkFlags ,
287
+ [](llvm::Module &M, const llvm::StringSet<> &GVS) {
288
+ internalizeModule (M, [&GVS](const llvm::GlobalValue &GV) {
289
+ return !GV.hasName () || (GVS.count (GV.getName ()) == 0 );
268
290
});
269
- } else
270
- Err = Linker::linkModules (*M, std::move (Mod), LM.LinkFlags );
271
- };
272
-
273
- // Create a Clone to move to the linker, which preserves the original
274
- // linking modules, allowing them to be linked again in the future
275
- if (ClRelinkBuiltinBitcodePostop) {
276
- // TODO: If CloneModule() is updated to support cloning of unmaterialized
277
- // modules, we can remove this
278
- if (Error E = CurLinkModule->materializeAll ())
279
- return false ;
280
-
281
- std::unique_ptr<llvm::Module> Clone = llvm::CloneModule (*LM.Module );
282
-
283
- DoLink (Clone);
284
- }
285
- // Otherwise we can link (and clean up) the original modules
286
- else {
287
- DoLink (LM.Module );
288
- }
291
+ });
292
+ } else
293
+ Err = Linker::linkModules (*M, std::move (LM.Module ), LM.LinkFlags );
289
294
}
290
295
296
+ LinkModules.clear ();
291
297
return false ; // success
292
298
}
293
299
@@ -1037,8 +1043,9 @@ CodeGenAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {
1037
1043
std::unique_ptr<BackendConsumer> Result (new BackendConsumer (
1038
1044
BA, CI.getDiagnostics (), &CI.getVirtualFileSystem (),
1039
1045
CI.getHeaderSearchOpts (), CI.getPreprocessorOpts (), CI.getCodeGenOpts (),
1040
- CI.getTargetOpts (), CI.getLangOpts (), std::string (InFile),
1041
- std::move (LinkModules), std::move (OS), *VMContext, CoverageInfo));
1046
+ CI.getTargetOpts (), CI.getLangOpts (), CI.getFileManager (),
1047
+ std::string (InFile), std::move (LinkModules), std::move (OS), *VMContext,
1048
+ CoverageInfo));
1042
1049
BEConsumer = Result.get ();
1043
1050
1044
1051
// Enable generating macro debug info only when debug info is not disabled and
@@ -1199,7 +1206,7 @@ void CodeGenAction::ExecuteAction() {
1199
1206
BackendConsumer Result (BA, CI.getDiagnostics (), &CI.getVirtualFileSystem (),
1200
1207
CI.getHeaderSearchOpts (), CI.getPreprocessorOpts (),
1201
1208
CI.getCodeGenOpts (), CI.getTargetOpts (),
1202
- CI.getLangOpts (), TheModule.get (),
1209
+ CI.getLangOpts (), CI. getFileManager (), TheModule.get (),
1203
1210
std::move (LinkModules), *VMContext, nullptr );
1204
1211
1205
1212
// Link in each pending link module.
0 commit comments