Empty the CtorLists/DtorLists once emitted.

This is essential when clang is running in incremental processing mode because
we don't want to reemit the 'tors over and over again.

Patch by Axel Naumann!

Reviewed by Richard Smith and me. (https://reviews.llvm.org/D25605)

llvm-svn: 285277
This commit is contained in:
Vassil Vassilev 2016-10-27 09:12:20 +00:00
parent 9d61e14771
commit 188ad3ac02
2 changed files with 6 additions and 5 deletions

View File

@ -721,7 +721,7 @@ void CodeGenModule::AddGlobalDtor(llvm::Function *Dtor, int Priority) {
GlobalDtors.push_back(Structor(Priority, Dtor, nullptr)); GlobalDtors.push_back(Structor(Priority, Dtor, nullptr));
} }
void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) { void CodeGenModule::EmitCtorList(CtorList &Fns, const char *GlobalName) {
// Ctor function type is void()*. // Ctor function type is void()*.
llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false); llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false);
llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy); llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(CtorFTy);
@ -749,6 +749,7 @@ void CodeGenModule::EmitCtorList(const CtorList &Fns, const char *GlobalName) {
llvm::ConstantArray::get(AT, Ctors), llvm::ConstantArray::get(AT, Ctors),
GlobalName); GlobalName);
} }
Fns.clear();
} }
llvm::GlobalValue::LinkageTypes llvm::GlobalValue::LinkageTypes

View File

@ -1209,10 +1209,10 @@ private:
llvm::Constant *AssociatedData = nullptr); llvm::Constant *AssociatedData = nullptr);
void AddGlobalDtor(llvm::Function *Dtor, int Priority = 65535); void AddGlobalDtor(llvm::Function *Dtor, int Priority = 65535);
/// Generates a global array of functions and priorities using the given list /// EmitCtorList - Generates a global array of functions and priorities using
/// and name. This array will have appending linkage and is suitable for use /// the given list and name. This array will have appending linkage and is
/// as a LLVM constructor or destructor array. /// suitable for use as a LLVM constructor or destructor array. Clears Fns.
void EmitCtorList(const CtorList &Fns, const char *GlobalName); void EmitCtorList(CtorList &Fns, const char *GlobalName);
/// Emit any needed decls for which code generation was deferred. /// Emit any needed decls for which code generation was deferred.
void EmitDeferred(); void EmitDeferred();