mirror of
https://github.com/RPCSX/llvm.git
synced 2026-01-31 01:05:23 +01:00
Use a combination of !associated, comdat, @llvm.compiler.used and custom sections to allow dead stripping of globals and their asan metadata. Sometimes. Currently this works on LLD, which supports SHF_LINK_ORDER with sh_link pointing to the associated section. This also works on BFD, which seems to treat comdats as all-or-nothing with respect to linker GC. There is a weird quirk where the "first" global in each link is never GC-ed because of the section symbols. At this moment it does not work on Gold (as in the globals are never stripped). This is a second re-land of r298158. This time, this feature is limited to -fdata-sections builds. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301587 91177308-0d34-0410-b5e6-96231b3b80d8
101 lines
3.9 KiB
C++
101 lines
3.9 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);
|
|
|
|
Function *declareSanitizerInitFunction(Module &M, StringRef InitName,
|
|
ArrayRef<Type *> InitArgTypes);
|
|
|
|
/// \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);
|
|
|
|
/// \brief Produce a unique identifier for this module by taking the MD5 sum of
|
|
/// the names of the module's strong external symbols.
|
|
///
|
|
/// This identifier is normally guaranteed to be unique, or the program would
|
|
/// fail to link due to multiply defined symbols.
|
|
///
|
|
/// If the module has no strong external symbols (such a module may still have a
|
|
/// semantic effect if it performs global initialization), we cannot produce a
|
|
/// unique identifier for this module, so we return the empty string.
|
|
std::string getUniqueModuleId(Module *M);
|
|
|
|
} // End llvm namespace
|
|
|
|
#endif // LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
|