Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion interpreter/llvm/src/lib/Transforms/IPO/Inliner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,7 @@ bool Inliner::inlineCalls(CallGraphSCC &SCC) {

// If we inlined or deleted the last possible call site to the function,
// delete the function body now.
if (false && Callee && Callee->use_empty() && Callee->hasLocalLinkage() &&
if (Callee && Callee->use_empty() && Callee->hasLocalLinkage() &&
// TODO: Can remove if in SCC now.
!SCCFunctions.count(Callee) &&

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1970,8 +1970,7 @@ CodeGenModule::GetOrCreateLLVMFunction(StringRef MangledName,
// DeferredDeclsToEmit list, and remove it from DeferredDecls (since we
// don't need it anymore).
addDeferredDeclToEmit(F, DDI->second);
EmittedDeferredDecls[F] = std::make_pair(DDI->first, DDI->second);
DeferredDecls.erase(DDI);
//DeferredDecls.erase(DDI);

// Otherwise, there are cases we have to worry about where we're
// using a declaration for which we must emit a definition but where
Expand Down Expand Up @@ -2168,8 +2167,7 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName,
// Move the potentially referenced deferred decl to the DeferredDeclsToEmit
// list, and remove it from DeferredDecls (since we don't need it anymore).
addDeferredDeclToEmit(GV, DDI->second);
EmittedDeferredDecls[GV] = std::make_pair(DDI->first, DDI->second);
DeferredDecls.erase(DDI);
//DeferredDecls.erase(DDI);
}

// Handle things which are present even on external declarations.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -322,14 +322,6 @@ class CodeGenModule : public CodeGenTypeCache {
DeferredDeclsToEmit.emplace_back(GV, GD);
}

/// Enables unloading of emitted symbols that need to become deferred.
/// Key is the emitted definition, value is symbol name + Decl created
/// while marking this deferred, i.e. the content of DeferredDecls.
std::unordered_map<llvm::GlobalValue*,
std::pair<llvm::StringRef, GlobalDecl>>
EmittedDeferredDecls;


/// List of alias we have emitted. Used to make sure that what they point to
/// is defined once we get to the end of the of the translation unit.
std::vector<GlobalDecl> Aliases;
Expand Down
30 changes: 7 additions & 23 deletions interpreter/llvm/src/tools/clang/lib/CodeGen/ModuleBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,6 @@ namespace clang {
&& "Newly created module should not have weakRefRefs");
Builder->WeakRefReferences.swap(OldBuilder->WeakRefReferences);

Builder->EmittedDeferredDecls.swap(OldBuilder->EmittedDeferredDecls);

return M.get();
}

Expand Down Expand Up @@ -287,27 +285,13 @@ namespace clang {
}
}

if (GV->isWeakForLinker()) {
if (!GV->isDeclaration()) {
// This is a definition. If if was emitted as deferred, move it
// back into deferred state.
auto IEmittedDeferredDecl
= Builder->EmittedDeferredDecls.find(GV);
if (IEmittedDeferredDecl != Builder->EmittedDeferredDecls.end()) {
// Use the name of the original GV, not that of our definition
// that's soon to be erased.
Builder->DeferredDecls[IEmittedDeferredDecl->second.first]
= IEmittedDeferredDecl->second.second;
Builder->EmittedDeferredDecls.erase(IEmittedDeferredDecl);
}
} else {
// might be an entry in the deferred decls, if so: remove!
auto IDeferredDecl = Builder->DeferredDecls.find(GV->getName());
if (IDeferredDecl != Builder->DeferredDecls.end()) {
// yes, pointer comparison.
if (IDeferredDecl->first.data() == GV->getName().data())
Builder->DeferredDecls.erase(IDeferredDecl);
}
if (GV->isWeakForLinker() && GV->isDeclaration()) {
// might be an entry in the deferred decls, if so: remove!
auto IDeferredDecl = Builder->DeferredDecls.find(GV->getName());
if (IDeferredDecl != Builder->DeferredDecls.end()) {
// yes, pointer comparison.
if (IDeferredDecl->first.data() == GV->getName().data())
Builder->DeferredDecls.erase(IDeferredDecl);
}
}
}
Expand Down