diff options
| author | Nick Lewycky <nicholas@mxc.ca> | 2009-01-04 22:54:40 +0000 | 
|---|---|---|
| committer | Nick Lewycky <nicholas@mxc.ca> | 2009-01-04 22:54:40 +0000 | 
| commit | 3a0c106979837595473f8d34087d61c17bcee06c (patch) | |
| tree | a5496bcdc0fe1dda400a24aecd48f0b19210530e /llvm | |
| parent | 122db26b282c29c2057546bbdfe790ac74c4dd3f (diff) | |
| download | bcm5719-llvm-3a0c106979837595473f8d34087d61c17bcee06c.tar.gz bcm5719-llvm-3a0c106979837595473f8d34087d61c17bcee06c.zip  | |
Add a mechanism to specify attributes in getOrInsertFunction.
llvm-svn: 61645
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/Module.h | 9 | ||||
| -rw-r--r-- | llvm/lib/VMCore/Module.cpp | 31 | 
2 files changed, 37 insertions, 3 deletions
diff --git a/llvm/include/llvm/Module.h b/llvm/include/llvm/Module.h index 09eba81b4eb..af687c84c30 100644 --- a/llvm/include/llvm/Module.h +++ b/llvm/include/llvm/Module.h @@ -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. diff --git a/llvm/lib/VMCore/Module.cpp b/llvm/lib/VMCore/Module.cpp index b7bb49184b0..d5b48c0a73b 100644 --- a/llvm/lib/VMCore/Module.cpp +++ b/llvm/lib/VMCore/Module.cpp @@ -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.  | 

