Add a mechanism to specify attributes in getOrInsertFunction.
authorNick Lewycky <nicholas@mxc.ca>
Sun, 4 Jan 2009 22:54:40 +0000 (22:54 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Sun, 4 Jan 2009 22:54:40 +0000 (22:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61645 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Module.h
lib/VMCore/Module.cpp

index 09eba81b4ebeefaf4db4a6bcad252d7a110f2f63..af687c84c30a56cbd28247e3f8c46037ef95cf57 100644 (file)
@@ -194,6 +194,9 @@ public:
   ///      the existing function.
   ///   4. Finally, the function exists but has the wrong prototype: return the
   ///      function with a constantexpr cast to the right prototype.
+  Constant *getOrInsertFunction(const std::string &Name, const FunctionType *T,
+                                AttrListPtr AttributeList);
+
   Constant *getOrInsertFunction(const std::string &Name, const FunctionType *T);
 
   /// getOrInsertFunction - Look up the specified function in the module symbol
@@ -203,7 +206,11 @@ public:
   /// named function has a different type.  This version of the method takes a
   /// null terminated list of function arguments, which makes it easier for
   /// clients to use.
-  Constant *getOrInsertFunction(const std::string &Name, const Type *RetTy,...)
+  Constant *getOrInsertFunction(const std::string &Name,
+                                AttrListPtr AttributeList,
+                                const Type *RetTy, ...)  END_WITH_NULL;
+
+  Constant *getOrInsertFunction(const std::string &Name, const Type *RetTy, ...)
     END_WITH_NULL;
 
   /// getFunction - Look up the specified function in the module symbol table.
index b7bb49184b0b04089e96c3a608751be59f478ffa..d5b48c0a73b3d29a83d89b97ef6d923b7823f5de 100644 (file)
@@ -137,7 +137,8 @@ Module::PointerSize Module::getPointerSize() const {
 // the symbol table directly for this common task.
 //
 Constant *Module::getOrInsertFunction(const std::string &Name,
-                                      const FunctionType *Ty) {
+                                      const FunctionType *Ty,
+                                      AttrListPtr AttributeList) {
   ValueSymbolTable &SymTab = getValueSymbolTable();
 
   // See if we have a definition for the specified function already.
@@ -145,6 +146,8 @@ Constant *Module::getOrInsertFunction(const std::string &Name,
   if (F == 0) {
     // Nope, add it
     Function *New = Function::Create(Ty, GlobalVariable::ExternalLinkage, Name);
+    if (!New->isIntrinsic())       // Intrinsics get attrs set on construction
+      New->setAttributes(AttributeList);
     FunctionList.push_back(New);
     return New;                    // Return the new prototype.
   }
@@ -168,12 +171,19 @@ Constant *Module::getOrInsertFunction(const std::string &Name,
   return F;  
 }
 
+Constant *Module::getOrInsertFunction(const std::string &Name,
+                                      const FunctionType *Ty) {
+  AttrListPtr AttributeList = AttrListPtr::get((AttributeWithIndex *)0, 0);
+  return getOrInsertFunction(Name, Ty, AttributeList);
+}
+
 // getOrInsertFunction - Look up the specified function in the module symbol
 // table.  If it does not exist, add a prototype for the function and return it.
 // This version of the method takes a null terminated list of function
 // arguments, which makes it easier for clients to use.
 //
 Constant *Module::getOrInsertFunction(const std::string &Name,
+                                      AttrListPtr AttributeList,
                                       const Type *RetTy, ...) {
   va_list Args;
   va_start(Args, RetTy);
@@ -186,9 +196,26 @@ Constant *Module::getOrInsertFunction(const std::string &Name,
   va_end(Args);
 
   // Build the function type and chain to the other getOrInsertFunction...
-  return getOrInsertFunction(Name, FunctionType::get(RetTy, ArgTys, false));
+  return getOrInsertFunction(Name, FunctionType::get(RetTy, ArgTys, false),
+                             AttributeList);
 }
 
+Constant *Module::getOrInsertFunction(const std::string &Name,
+                                      const Type *RetTy, ...) {
+  va_list Args;
+  va_start(Args, RetTy);
+
+  // Build the list of argument types...
+  std::vector<const Type*> ArgTys;
+  while (const Type *ArgTy = va_arg(Args, const Type*))
+    ArgTys.push_back(ArgTy);
+
+  va_end(Args);
+
+  // Build the function type and chain to the other getOrInsertFunction...
+  return getOrInsertFunction(Name, FunctionType::get(RetTy, ArgTys, false),
+                             AttrListPtr::get((AttributeWithIndex *)0, 0));
+}
 
 // getFunction - Look up the specified function in the module symbol table.
 // If it does not exist, return null.