diff options
author | Xiangling Liao <Xiangling.Liao@ibm.com> | 2021-04-08 13:40:27 -0400 |
---|---|---|
committer | Xiangling Liao <Xiangling.Liao@ibm.com> | 2021-04-08 15:40:09 -0400 |
commit | d5085617986e8ceabe7af02eb9c50f5350b3f980 (patch) | |
tree | 5833b481c625cebfecd51e2bf01500c3d8b10899 /clang/lib/CodeGen/CodeGenModule.h | |
parent | 3a4c0354b6eb5484b9b0cff6f6a7df982b49414e (diff) | |
download | llvm-d5085617986e8ceabe7af02eb9c50f5350b3f980.zip llvm-d5085617986e8ceabe7af02eb9c50f5350b3f980.tar.gz llvm-d5085617986e8ceabe7af02eb9c50f5350b3f980.tar.bz2 |
[AIX] Support init priority attribute
Differential Revision: https://reviews.llvm.org/D99291
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.h')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.h | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index ad43244..83230db 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -103,17 +103,17 @@ enum ForDefinition_t : bool { ForDefinition = true }; -struct OrderGlobalInits { +struct OrderGlobalInitsOrStermFinalizers { unsigned int priority; unsigned int lex_order; - OrderGlobalInits(unsigned int p, unsigned int l) + OrderGlobalInitsOrStermFinalizers(unsigned int p, unsigned int l) : priority(p), lex_order(l) {} - bool operator==(const OrderGlobalInits &RHS) const { + bool operator==(const OrderGlobalInitsOrStermFinalizers &RHS) const { return priority == RHS.priority && lex_order == RHS.lex_order; } - bool operator<(const OrderGlobalInits &RHS) const { + bool operator<(const OrderGlobalInitsOrStermFinalizers &RHS) const { return std::tie(priority, lex_order) < std::tie(RHS.priority, RHS.lex_order); } @@ -457,7 +457,8 @@ private: /// that we don't re-emit the initializer. llvm::DenseMap<const Decl*, unsigned> DelayedCXXInitPosition; - typedef std::pair<OrderGlobalInits, llvm::Function*> GlobalInitData; + typedef std::pair<OrderGlobalInitsOrStermFinalizers, llvm::Function *> + GlobalInitData; struct GlobalInitPriorityCmp { bool operator()(const GlobalInitData &LHS, @@ -473,10 +474,26 @@ private: /// Global destructor functions and arguments that need to run on termination. /// When UseSinitAndSterm is set, it instead contains sterm finalizer /// functions, which also run on unloading a shared library. - std::vector< - std::tuple<llvm::FunctionType *, llvm::WeakTrackingVH, llvm::Constant *>> + typedef std::tuple<llvm::FunctionType *, llvm::WeakTrackingVH, + llvm::Constant *> + CXXGlobalDtorsOrStermFinalizer_t; + SmallVector<CXXGlobalDtorsOrStermFinalizer_t, 8> CXXGlobalDtorsOrStermFinalizers; + typedef std::pair<OrderGlobalInitsOrStermFinalizers, llvm::Function *> + StermFinalizerData; + + struct StermFinalizerPriorityCmp { + bool operator()(const StermFinalizerData &LHS, + const StermFinalizerData &RHS) const { + return LHS.first.priority < RHS.first.priority; + } + }; + + /// Global variables with sterm finalizers whose order of initialization is + /// set by init_priority attribute. + SmallVector<StermFinalizerData, 8> PrioritizedCXXStermFinalizers; + /// The complete set of modules that has been imported. llvm::SetVector<clang::Module *> ImportedModules; @@ -1078,6 +1095,14 @@ public: AddGlobalDtor(StermFinalizer, Priority); } + void AddCXXPrioritizedStermFinalizerEntry(llvm::Function *StermFinalizer, + int Priority) { + OrderGlobalInitsOrStermFinalizers Key(Priority, + PrioritizedCXXStermFinalizers.size()); + PrioritizedCXXStermFinalizers.push_back( + std::make_pair(Key, StermFinalizer)); + } + /// Create or return a runtime function declaration with the specified type /// and name. If \p AssumeConvergent is true, the call will have the /// convergent attribute added. |