mirror of
https://github.com/RPCSX/llvm.git
synced 2026-01-31 01:05:23 +01:00
removing fully-dead comdats without removing dead entries in comdats with live members. This factors the core logic out of the current inliner's internals to a reusable utility and leverages that in both places. The factored out code should also be (minorly) more efficient in cases where we have very few dead functions or dead comdats to consider. I've added a test case to cover this behavior of the always inliner. This is the last significant bug in the new PM's always inliner I've found (so far). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@290557 91177308-0d34-0410-b5e6-96231b3b80d8
87 lines
3.3 KiB
C++
87 lines
3.3 KiB
C++
//===-- 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 <utility> // for std::pair
|
|
|
|
namespace llvm {
|
|
|
|
template <typename T> 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<Function *, Function *> createSanitizerCtorAndInitFunctions(
|
|
Module &M, StringRef CtorName, StringRef InitName,
|
|
ArrayRef<Type *> InitArgTypes, ArrayRef<Value *> 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<GlobalValue *> Values);
|
|
|
|
/// \brief Adds global values to the llvm.compiler.used list.
|
|
void appendToCompilerUsed(Module &M, ArrayRef<GlobalValue *> 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<Function *> &DeadComdatFunctions);
|
|
|
|
} // End llvm namespace
|
|
|
|
#endif // LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
|