mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
c349d0b828
GlobalAlias and GlobalIFunc ought to be treated the same by the IR linker, so we can generalize the code to be in terms of their common base class GlobalIndirectSymbol. Differential Revision: https://reviews.llvm.org/D55046 llvm-svn: 368357
76 lines
2.5 KiB
C++
76 lines
2.5 KiB
C++
//===-------- llvm/GlobalIFunc.h - GlobalIFunc class ------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \brief
|
|
/// This file contains the declaration of the GlobalIFunc class, which
|
|
/// represents a single indirect function in the IR. Indirect function uses
|
|
/// ELF symbol type extension to mark that the address of a declaration should
|
|
/// be resolved at runtime by calling a resolver function.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_IR_GLOBALIFUNC_H
|
|
#define LLVM_IR_GLOBALIFUNC_H
|
|
|
|
#include "llvm/ADT/ilist_node.h"
|
|
#include "llvm/IR/GlobalIndirectSymbol.h"
|
|
#include "llvm/IR/Value.h"
|
|
|
|
namespace llvm {
|
|
|
|
class Twine;
|
|
class Module;
|
|
|
|
// Traits class for using GlobalIFunc in symbol table in Module.
|
|
template <typename ValueSubClass> class SymbolTableListTraits;
|
|
|
|
class GlobalIFunc final : public GlobalIndirectSymbol,
|
|
public ilist_node<GlobalIFunc> {
|
|
friend class SymbolTableListTraits<GlobalIFunc>;
|
|
|
|
GlobalIFunc(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage,
|
|
const Twine &Name, Constant *Resolver, Module *Parent);
|
|
|
|
public:
|
|
GlobalIFunc(const GlobalIFunc &) = delete;
|
|
GlobalIFunc &operator=(const GlobalIFunc &) = delete;
|
|
|
|
/// If a parent module is specified, the ifunc is automatically inserted into
|
|
/// the end of the specified module's ifunc list.
|
|
static GlobalIFunc *create(Type *Ty, unsigned AddressSpace,
|
|
LinkageTypes Linkage, const Twine &Name,
|
|
Constant *Resolver, Module *Parent);
|
|
|
|
/// This method unlinks 'this' from the containing module, but does not
|
|
/// delete it.
|
|
void removeFromParent();
|
|
|
|
/// This method unlinks 'this' from the containing module and deletes it.
|
|
void eraseFromParent();
|
|
|
|
/// These methods retrieve and set ifunc resolver function.
|
|
void setResolver(Constant *Resolver) {
|
|
setIndirectSymbol(Resolver);
|
|
}
|
|
const Constant *getResolver() const {
|
|
return getIndirectSymbol();
|
|
}
|
|
Constant *getResolver() {
|
|
return getIndirectSymbol();
|
|
}
|
|
|
|
// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
static bool classof(const Value *V) {
|
|
return V->getValueID() == Value::GlobalIFuncVal;
|
|
}
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_IR_GLOBALIFUNC_H
|