junaire updated this revision to Diff 434238.
junaire added a comment.
Fix the broken build
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D126781/new/
https://reviews.llvm.org/D126781
Files:
clang/lib/CodeGen/CodeGenModule.h
clang/lib/CodeGen/ModuleBuilder.cpp
clang/test/Interpreter/execute.cpp
Index: clang/test/Interpreter/execute.cpp
===================================================================
--- clang/test/Interpreter/execute.cpp
+++ clang/test/Interpreter/execute.cpp
@@ -13,4 +13,8 @@
auto r2 = printf("S[f=%f, m=0x%llx]\n", s.f, reinterpret_cast<unsigned long long>(s.m));
// CHECK-NEXT: S[f=1.000000, m=0x0]
+
+inline int foo() { return 42; }
+int r3 = foo();
+
quit
Index: clang/lib/CodeGen/ModuleBuilder.cpp
===================================================================
--- clang/lib/CodeGen/ModuleBuilder.cpp
+++ clang/lib/CodeGen/ModuleBuilder.cpp
@@ -133,8 +133,13 @@
llvm::Module *StartModule(llvm::StringRef ModuleName,
llvm::LLVMContext &C) {
assert(!M && "Replacing existing Module?");
- M.reset(new llvm::Module(ExpandModuleName(ModuleName, CodeGenOpts), C));
- Initialize(*Ctx);
+
+ {
+ CodeGenModule::KeepLazyEmiitedSymRAII RAIIKeeper(Builder);
+ M.reset(new llvm::Module(ExpandModuleName(ModuleName, CodeGenOpts), C));
+ Initialize(*Ctx);
+ }
+
return M.get();
}
Index: clang/lib/CodeGen/CodeGenModule.h
===================================================================
--- clang/lib/CodeGen/CodeGenModule.h
+++ clang/lib/CodeGen/CodeGenModule.h
@@ -1477,6 +1477,68 @@
void printPostfixForExternalizedDecl(llvm::raw_ostream &OS,
const Decl *D) const;
+ llvm::DenseMap<StringRef, GlobalDecl> &getDeferredDecls() {
+ return DeferredDecls;
+ }
+
+ std::vector<GlobalDecl> &getDeferredDeclsToEmit() {
+ return DeferredDeclsToEmit;
+ }
+
+ std::vector<const CXXRecordDecl *> &getDeferredVTables() {
+ return DeferredVTables;
+ }
+
+ llvm::MapVector<GlobalDecl, StringRef> &getMangledDeclNames() {
+ return MangledDeclNames;
+ }
+
+ llvm::StringMap<GlobalDecl, llvm::BumpPtrAllocator> &getManglings() {
+ return Manglings;
+ }
+
+ llvm::SmallPtrSetImpl<llvm::GlobalValue *> &getWeakRefReferences() {
+ return WeakRefReferences;
+ }
+
+ std::unique_ptr<CodeGenTBAA> &getTBAA() { return TBAA; }
+
+ struct KeepLazyEmiitedSymRAII {
+ std::unique_ptr<CodeGenModule> OldBuilder;
+ std::unique_ptr<CodeGenModule> &Self;
+
+ explicit KeepLazyEmiitedSymRAII(std::unique_ptr<CodeGenModule> &Builder)
+ : Self(Builder) {
+ OldBuilder.swap(Self);
+ }
+
+ ~KeepLazyEmiitedSymRAII() {
+ assert(OldBuilder->getDeferredDeclsToEmit().empty() &&
+ "Should have emitted all decls deferred to emit.");
+ assert(Self->getDeferredDecls().empty() &&
+ "Newly created module should not have deferred decls");
+
+ Self->getDeferredDecls().swap(OldBuilder->getDeferredDecls());
+
+ assert(Self->getDeferredVTables().empty() &&
+ "Newly created module should not have deferred vtables");
+
+ Self->getDeferredVTables().swap(OldBuilder->getDeferredVTables());
+
+ assert(Self->getMangledDeclNames().empty() &&
+ "Newly created module should not have mangled decl names");
+ assert(Self->getManglings().empty() &&
+ "Newly created module should not have manglings");
+
+ Self->getManglings() = std::move(OldBuilder->getManglings());
+
+ assert(OldBuilder->getWeakRefReferences().empty() &&
+ "Not all WeakRefRefs have been applied");
+
+ Self->getTBAA().swap(OldBuilder->getTBAA());
+ }
+ };
+
private:
llvm::Constant *GetOrCreateLLVMFunction(
StringRef MangledName, llvm::Type *Ty, GlobalDecl D, bool ForVTable,
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits