diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-06-21 18:45:05 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-06-21 18:45:05 +0000 |
commit | 9f2a4eed0d9d83c34321ce5a53c21d39e3201542 (patch) | |
tree | 18366f122b7fb66297b5238d3023dbad3cfc0d43 /clang/lib/CodeGen/CGDeclCXX.cpp | |
parent | 5dd34744c5c04fdbbf4d1fb3f00c2502ecc5162f (diff) | |
download | bcm5719-llvm-9f2a4eed0d9d83c34321ce5a53c21d39e3201542.tar.gz bcm5719-llvm-9f2a4eed0d9d83c34321ce5a53c21d39e3201542.zip |
IRGen for implementation of init-priority attribute.
Test case will be checked in llvm test suite.
(finishes off radar 8076356).
llvm-svn: 106441
Diffstat (limited to 'clang/lib/CodeGen/CGDeclCXX.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGDeclCXX.cpp | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp index a59ed0abe62..fafc85d628e 100644 --- a/clang/lib/CodeGen/CGDeclCXX.cpp +++ b/clang/lib/CodeGen/CGDeclCXX.cpp @@ -171,12 +171,17 @@ CodeGenModule::EmitCXXGlobalVarDeclInitFunc(const VarDecl *D) { CodeGenFunction(*this).GenerateCXXGlobalVarDeclInitFunc(Fn, D); - CXXGlobalInits.push_back(Fn); + if (D->hasAttr<InitPriorityAttr>()) { + unsigned int order = D->getAttr<InitPriorityAttr>()->getPriority(); + PrioritizedCXXGlobalInits.push_back(std::make_pair(order,Fn)); + } + else + CXXGlobalInits.push_back(Fn); } void CodeGenModule::EmitCXXGlobalInitFunc() { - if (CXXGlobalInits.empty()) + if (CXXGlobalInits.empty() && PrioritizedCXXGlobalInits.empty()) return; const llvm::FunctionType *FTy @@ -187,9 +192,24 @@ CodeGenModule::EmitCXXGlobalInitFunc() { llvm::Function *Fn = CreateGlobalInitOrDestructFunction(*this, FTy, "_GLOBAL__I_a"); - CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn, - &CXXGlobalInits[0], - CXXGlobalInits.size()); + if (!PrioritizedCXXGlobalInits.empty()) { + std::vector<llvm::Constant*> LocalCXXGlobalInits; + std::sort(PrioritizedCXXGlobalInits.begin(), + PrioritizedCXXGlobalInits.end()); + for (unsigned i = 0; i < PrioritizedCXXGlobalInits.size(); i++) { + llvm::Function *Fn = PrioritizedCXXGlobalInits[i].second; + LocalCXXGlobalInits.push_back(Fn); + } + for (unsigned i = 0; i < CXXGlobalInits.size(); i++) + LocalCXXGlobalInits.push_back(CXXGlobalInits[i]); + CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn, + &LocalCXXGlobalInits[0], + LocalCXXGlobalInits.size()); + } + else + CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn, + &CXXGlobalInits[0], + CXXGlobalInits.size()); AddGlobalCtor(Fn); } |