mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-25 14:02:52 +02:00
526cf61162
they're needed. Prior to this patch objects were loaded (via RuntimeDyld::loadObject) when they were added to the ObjectLinkingLayer, but were not relocated and finalized until a symbol address was requested. In the interim, another object could be loaded and finalized with the same memory manager, causing relocation/finalization of the first object to fail (as the first finalization call may have marked the allocated memory for the first object read-only). By deferring the loadObject call (and subsequent memory allocations) until an object file is needed we can avoid prematurely finalizing memory. llvm-svn: 258185
92 lines
2.6 KiB
C++
92 lines
2.6 KiB
C++
//===------ JITSymbolFlags.h - Flags for symbols in the JIT -----*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Symbol flags for symbols in the JIT (e.g. weak, exported).
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H
|
|
#define LLVM_EXECUTIONENGINE_JITSYMBOLFLAGS_H
|
|
|
|
#include "llvm/IR/GlobalValue.h"
|
|
#include "llvm/Object/SymbolicFile.h"
|
|
|
|
namespace llvm {
|
|
|
|
/// @brief Flags for symbols in the JIT.
|
|
enum class JITSymbolFlags : char {
|
|
None = 0,
|
|
Weak = 1U << 0,
|
|
Exported = 1U << 1
|
|
};
|
|
|
|
inline JITSymbolFlags operator|(JITSymbolFlags LHS, JITSymbolFlags RHS) {
|
|
typedef std::underlying_type<JITSymbolFlags>::type UT;
|
|
return static_cast<JITSymbolFlags>(
|
|
static_cast<UT>(LHS) | static_cast<UT>(RHS));
|
|
}
|
|
|
|
inline JITSymbolFlags& operator |=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {
|
|
LHS = LHS | RHS;
|
|
return LHS;
|
|
}
|
|
|
|
inline JITSymbolFlags operator&(JITSymbolFlags LHS, JITSymbolFlags RHS) {
|
|
typedef std::underlying_type<JITSymbolFlags>::type UT;
|
|
return static_cast<JITSymbolFlags>(
|
|
static_cast<UT>(LHS) & static_cast<UT>(RHS));
|
|
}
|
|
|
|
inline JITSymbolFlags& operator &=(JITSymbolFlags &LHS, JITSymbolFlags RHS) {
|
|
LHS = LHS & RHS;
|
|
return LHS;
|
|
}
|
|
|
|
/// @brief Base class for symbols in the JIT.
|
|
class JITSymbolBase {
|
|
public:
|
|
JITSymbolBase(JITSymbolFlags Flags) : Flags(Flags) {}
|
|
|
|
JITSymbolFlags getFlags() const { return Flags; }
|
|
|
|
bool isWeak() const {
|
|
return (Flags & JITSymbolFlags::Weak) == JITSymbolFlags::Weak;
|
|
}
|
|
|
|
bool isExported() const {
|
|
return (Flags & JITSymbolFlags::Exported) == JITSymbolFlags::Exported;
|
|
}
|
|
|
|
static JITSymbolFlags flagsFromGlobalValue(const GlobalValue &GV) {
|
|
JITSymbolFlags Flags = JITSymbolFlags::None;
|
|
if (GV.hasWeakLinkage())
|
|
Flags |= JITSymbolFlags::Weak;
|
|
if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())
|
|
Flags |= JITSymbolFlags::Exported;
|
|
return Flags;
|
|
}
|
|
|
|
static JITSymbolFlags
|
|
flagsFromObjectSymbol(const object::BasicSymbolRef &Symbol) {
|
|
JITSymbolFlags Flags = JITSymbolFlags::None;
|
|
if (Symbol.getFlags() & object::BasicSymbolRef::SF_Weak)
|
|
Flags |= JITSymbolFlags::Weak;
|
|
if (Symbol.getFlags() & object::BasicSymbolRef::SF_Exported)
|
|
Flags |= JITSymbolFlags::Exported;
|
|
return Flags;
|
|
}
|
|
|
|
private:
|
|
JITSymbolFlags Flags;
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|