Support constructor and destructor attributes in CodeGen

 - There is an miscompilation issue remaining due to a poor
   interaction between the delayed emission of static functions and
   the emission of constructors, but that already existed prior to
   this change.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54258 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h
index 3a39eb3..1fb2cf7 100644
--- a/lib/CodeGen/CodeGenModule.h
+++ b/lib/CodeGen/CodeGenModule.h
@@ -54,6 +54,8 @@
 /// CodeGenModule - This class organizes the cross-module state that is used
 /// while generating LLVM code.
 class CodeGenModule {
+  typedef std::vector< std::pair<llvm::Constant*, int> > CtorList;
+
   ASTContext &Context;
   const LangOptions &Features;
   llvm::Module &TheModule;
@@ -80,7 +82,16 @@
   /// which actually define something.
   std::vector<const ValueDecl*> StaticDecls;
   
-  std::vector<llvm::Constant*> GlobalCtors;
+  /// GlobalCtors - Store the list of global constructors and their
+  /// respective priorities to be emitted when the translation unit is
+  /// complete.
+  CtorList GlobalCtors;
+
+  /// GlobalDtors - Store the list of global destructors and their
+  /// respective priorities to be emitted when the translation unit is
+  /// complete.
+  CtorList GlobalDtors;
+
   std::vector<llvm::Constant*> Annotations;
     
   llvm::StringMap<llvm::Constant*> CFConstantStringMap;
@@ -173,9 +184,17 @@
   llvm::GlobalValue *EmitForwardFunctionDefinition(const FunctionDecl *D);
   void EmitGlobalFunctionDefinition(const FunctionDecl *D);
   void EmitGlobalVarDefinition(const VarDecl *D);
+  
+  // FIXME: Hardcoding priority here is gross.
+  void AddGlobalCtor(llvm::Function * Ctor, int Priority=65535);
+  void AddGlobalDtor(llvm::Function * Dtor, int Priority=65535);
 
-  void AddGlobalCtor(llvm::Function * Ctor);
-  void EmitGlobalCtors(void);
+  /// EmitCtorList - Generates a global array of functions and
+  /// priorities using the given list and name. This array will have
+  /// appending linkage and is suitable for use as a LLVM constructor
+  /// or destructor array.
+  void EmitCtorList(const CtorList &Fns, const char *GlobalName);
+
   void EmitAnnotations(void);
   void EmitStatics(void);