aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Module.h9
-rw-r--r--lib/VMCore/Module.cpp31
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.