diff options
-rw-r--r-- | include/llvm/Module.h | 9 | ||||
-rw-r--r-- | lib/VMCore/Module.cpp | 31 |
2 files changed, 37 insertions, 3 deletions
diff --git a/include/llvm/Module.h b/include/llvm/Module.h index 09eba81b4e..af687c84c3 100644 --- a/include/llvm/Module.h +++ b/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/lib/VMCore/Module.cpp b/lib/VMCore/Module.cpp index b7bb49184b..d5b48c0a73 100644 --- a/lib/VMCore/Module.cpp +++ b/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. |