1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-21 12:02:58 +02:00
llvm-mirror/include/llvm/ExecutionEngine/JITSymbolFlags.h
Lang Hames 526cf61162 [Orc] Refactor ObjectLinkingLayer::addObjectSet to defer loading objects until
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
2016-01-19 21:06:38 +00:00

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