//===-- ModuleUtils.h - Functions to manipulate Modules ---------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This family of functions perform manipulations on Modules. // //===----------------------------------------------------------------------===// #ifndef LLVM_TRANSFORMS_UTILS_MODULEUTILS_H #define LLVM_TRANSFORMS_UTILS_MODULEUTILS_H #include "llvm/ADT/StringRef.h" #include // for std::pair namespace llvm { template class ArrayRef; class Module; class Function; class GlobalValue; class GlobalVariable; class Constant; class StringRef; class Value; class Type; /// Append F to the list of global ctors of module M with the given Priority. /// This wraps the function in the appropriate structure and stores it along /// side other global constructors. For details see /// http://llvm.org/docs/LangRef.html#intg_global_ctors void appendToGlobalCtors(Module &M, Function *F, int Priority, Constant *Data = nullptr); /// Same as appendToGlobalCtors(), but for global dtors. void appendToGlobalDtors(Module &M, Function *F, int Priority, Constant *Data = nullptr); // Validate the result of Module::getOrInsertFunction called for an interface // function of given sanitizer. If the instrumented module defines a function // 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 createSanitizerCtorAndInitFunctions( Module &M, StringRef CtorName, StringRef InitName, ArrayRef InitArgTypes, ArrayRef InitArgs, StringRef VersionCheckName = StringRef()); /// Rename all the anon globals in the module using a hash computed from /// the list of public globals in the module. bool nameUnamedGlobals(Module &M); /// \brief Adds global values to the llvm.used list. void appendToUsed(Module &M, ArrayRef Values); /// \brief Adds global values to the llvm.compiler.used list. void appendToCompilerUsed(Module &M, ArrayRef Values); /// Filter out potentially dead comdat functions where other entries keep the /// entire comdat group alive. /// /// This is designed for cases where functions appear to become dead but remain /// alive due to other live entries in their comdat group. /// /// The \p DeadComdatFunctions container should only have pointers to /// `Function`s which are members of a comdat group and are believed to be /// dead. /// /// After this routine finishes, the only remaining `Function`s in \p /// DeadComdatFunctions are those where every member of the comdat is listed /// and thus removing them is safe (provided *all* are removed). void filterDeadComdatFunctions( Module &M, SmallVectorImpl &DeadComdatFunctions); } // End llvm namespace #endif // LLVM_TRANSFORMS_UTILS_MODULEUTILS_H