[PATCH] Implement `createSanitizerCtor`, common helper function for all sanitizers

Ismail Pazarbasi ismail.pazarbasi at gmail.com
Sat May 2 15:17:02 PDT 2015


Addressed comments:

- Renamed function, and say that it creates both ctor and init functions
- Returned a std::pair<Function *, Function *>
- Removed default arguments


http://reviews.llvm.org/D8777

Files:
  include/llvm/Transforms/Utils/ModuleUtils.h
  lib/Transforms/Utils/ModuleUtils.cpp

Index: include/llvm/Transforms/Utils/ModuleUtils.h
===================================================================
--- include/llvm/Transforms/Utils/ModuleUtils.h
+++ include/llvm/Transforms/Utils/ModuleUtils.h
@@ -14,13 +14,19 @@
 #ifndef LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
 #define LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
 
+#include "llvm/ADT/ArrayRef.h"
+#include <utility> // for std::pair
+
 namespace llvm {
 
 class Module;
 class Function;
 class GlobalValue;
 class GlobalVariable;
 class Constant;
+class StringRef;
+class Value;
+class Type;
 template <class PtrType> class SmallPtrSetImpl;
 
 /// Append F to the list of global ctors of module M with the given Priority.
@@ -43,6 +49,14 @@
 // with the same name, their prototypes must match, otherwise
 // getOrInsertFunction returns a bitcast.
 Function *checkSanitizerInterfaceFunction(Constant *FuncOrBitcast);
+
+/// \brief Creates sanitizer constructor function, and calls sanitizer's init
+/// function from it.
+/// \return Returns pair of pointers to constructor, and init functions
+/// respectively.
+std::pair<Function *, Function *> createSanitizerCtorAndInitFunctions(
+    Module &M, StringRef CtorName, StringRef InitName,
+    ArrayRef<Type *> InitType, ArrayRef<Value *> InitArgs);
 } // End llvm namespace
 
 #endif //  LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
Index: lib/Transforms/Utils/ModuleUtils.cpp
===================================================================
--- lib/Transforms/Utils/ModuleUtils.cpp
+++ lib/Transforms/Utils/ModuleUtils.cpp
@@ -104,3 +104,22 @@
   Stream << "Sanitizer interface function redefined: " << *FuncOrBitcast;
   report_fatal_error(Err);
 }
+
+std::pair<Function *, Function *> llvm::createSanitizerCtorAndInitFunctions(
+    Module &M, StringRef CtorName, StringRef InitName,
+    ArrayRef<Type *> InitType, ArrayRef<Value *> InitArgs) {
+  assert(!InitName.empty() && "Expected init function name");
+  Function *Ctor = Function::Create(
+      FunctionType::get(Type::getVoidTy(M.getContext()), false),
+      GlobalValue::InternalLinkage, CtorName, &M);
+  BasicBlock *CtorBB = BasicBlock::Create(M.getContext(), "", Ctor);
+  IRBuilder<> IRB(ReturnInst::Create(M.getContext(), CtorBB));
+  Function *InitFunction =
+      checkSanitizerInterfaceFunction(M.getOrInsertFunction(
+          InitName, FunctionType::get(IRB.getVoidTy(), InitType, false),
+          AttributeSet()));
+  InitFunction->setLinkage(Function::ExternalLinkage);
+  IRB.CreateCall(InitFunction, InitArgs);
+  return std::make_pair(Ctor, InitFunction);
+}
+

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D8777.24862.patch
Type: text/x-patch
Size: 2554 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150502/c42616cb/attachment.bin>


More information about the llvm-commits mailing list