LLVM 22.0.0git
|
#include "llvm/ExecutionEngine/JITLink/JITLink.h"
Classes | |
class | nested_collection_iterator |
Public Member Functions | |
LinkGraph (std::string Name, std::shared_ptr< orc::SymbolStringPool > SSP, Triple TT, SubtargetFeatures Features, GetEdgeKindNameFunction GetEdgeKindName) | |
LinkGraph (const LinkGraph &)=delete | |
LinkGraph & | operator= (const LinkGraph &)=delete |
LinkGraph (LinkGraph &&)=delete | |
LinkGraph & | operator= (LinkGraph &&)=delete |
LLVM_ABI | ~LinkGraph () |
const std::string & | getName () const |
Returns the name of this graph (usually the name of the original underlying MemoryBuffer). | |
const Triple & | getTargetTriple () const |
Returns the target triple for this Graph. | |
const SubtargetFeatures & | getFeatures () const |
Return the subtarget features for this Graph. | |
unsigned | getPointerSize () const |
Returns the pointer size for use in this graph. | |
llvm::endianness | getEndianness () const |
Returns the endianness of content in this graph. | |
const char * | getEdgeKindName (Edge::Kind K) const |
std::shared_ptr< orc::SymbolStringPool > | getSymbolStringPool () |
MutableArrayRef< char > | allocateBuffer (size_t Size) |
Allocate a mutable buffer of the given size using the LinkGraph's allocator. | |
MutableArrayRef< char > | allocateContent (ArrayRef< char > Source) |
Allocate a copy of the given string using the LinkGraph's allocator. | |
MutableArrayRef< char > | allocateContent (Twine Source) |
Allocate a copy of the given string using the LinkGraph's allocator. | |
StringRef | allocateName (Twine Source) |
Allocate a copy of the given string using the LinkGraph's allocator and return it as a StringRef. | |
MutableArrayRef< char > | allocateCString (StringRef Source) |
Allocate a copy of the given string using the LinkGraph's allocator. | |
MutableArrayRef< char > | allocateCString (Twine Source) |
Allocate a copy of the given string using the LinkGraph's allocator. | |
Section & | createSection (StringRef Name, orc::MemProt Prot) |
Create a section with the given name, protection flags. | |
Block & | createContentBlock (Section &Parent, ArrayRef< char > Content, orc::ExecutorAddr Address, uint64_t Alignment, uint64_t AlignmentOffset) |
Create a content block. | |
Block & | createMutableContentBlock (Section &Parent, MutableArrayRef< char > MutableContent, orc::ExecutorAddr Address, uint64_t Alignment, uint64_t AlignmentOffset) |
Create a content block with initially mutable data. | |
Block & | createMutableContentBlock (Section &Parent, size_t ContentSize, orc::ExecutorAddr Address, uint64_t Alignment, uint64_t AlignmentOffset, bool ZeroInitialize=true) |
Create a content block with initially mutable data of the given size. | |
Block & | createZeroFillBlock (Section &Parent, orc::ExecutorAddrDiff Size, orc::ExecutorAddr Address, uint64_t Alignment, uint64_t AlignmentOffset) |
Create a zero-fill block. | |
BinaryStreamReader | getBlockContentReader (Block &B) |
Returns a BinaryStreamReader for the given block. | |
BinaryStreamWriter | getBlockContentWriter (Block &B) |
Returns a BinaryStreamWriter for the given block. | |
template<typename SplitOffsetRange > | |
std::vector< Block * > | splitBlock (Block &B, SplitOffsetRange &&SplitOffsets, LinkGraph::SplitBlockCache *Cache=nullptr) |
Splits block B into a sequence of smaller blocks. | |
orc::SymbolStringPtr | intern (StringRef SymbolName) |
Intern the given string in the LinkGraph's SymbolStringPool. | |
Symbol & | addExternalSymbol (orc::SymbolStringPtr Name, orc::ExecutorAddrDiff Size, bool IsWeaklyReferenced) |
Add an external symbol. | |
Symbol & | addExternalSymbol (StringRef Name, orc::ExecutorAddrDiff Size, bool IsWeaklyReferenced) |
Symbol & | addAbsoluteSymbol (orc::SymbolStringPtr Name, orc::ExecutorAddr Address, orc::ExecutorAddrDiff Size, Linkage L, Scope S, bool IsLive) |
Add an absolute symbol. | |
Symbol & | addAbsoluteSymbol (StringRef Name, orc::ExecutorAddr Address, orc::ExecutorAddrDiff Size, Linkage L, Scope S, bool IsLive) |
Symbol & | addAnonymousSymbol (Block &Content, orc::ExecutorAddrDiff Offset, orc::ExecutorAddrDiff Size, bool IsCallable, bool IsLive) |
Add an anonymous symbol. | |
Symbol & | addDefinedSymbol (Block &Content, orc::ExecutorAddrDiff Offset, StringRef Name, orc::ExecutorAddrDiff Size, Linkage L, Scope S, bool IsCallable, bool IsLive) |
Add a named symbol. | |
Symbol & | addDefinedSymbol (Block &Content, orc::ExecutorAddrDiff Offset, orc::SymbolStringPtr Name, orc::ExecutorAddrDiff Size, Linkage L, Scope S, bool IsCallable, bool IsLive) |
iterator_range< section_iterator > | sections () |
iterator_range< const_section_iterator > | sections () const |
size_t | sections_size () const |
Section * | findSectionByName (StringRef Name) |
Returns the section with the given name if it exists, otherwise returns null. | |
iterator_range< block_iterator > | blocks () |
iterator_range< const_block_iterator > | blocks () const |
iterator_range< external_symbol_iterator > | external_symbols () |
Symbol * | findExternalSymbolByName (const orc::SymbolStringPtrBase &Name) |
Returns the external symbol with the given name if one exists, otherwise returns nullptr. | |
iterator_range< absolute_symbol_iterator > | absolute_symbols () |
Symbol * | findAbsoluteSymbolByName (const orc::SymbolStringPtrBase &Name) |
iterator_range< defined_symbol_iterator > | defined_symbols () |
iterator_range< const_defined_symbol_iterator > | defined_symbols () const |
Symbol * | findDefinedSymbolByName (const orc::SymbolStringPtrBase &Name) |
Returns the defined symbol with the given name if one exists, otherwise returns nullptr. | |
void | makeExternal (Symbol &Sym) |
Make the given symbol external (must not already be external). | |
void | makeAbsolute (Symbol &Sym, orc::ExecutorAddr Address) |
Make the given symbol an absolute with the given address (must not already be absolute). | |
void | makeDefined (Symbol &Sym, Block &Content, orc::ExecutorAddrDiff Offset, orc::ExecutorAddrDiff Size, Linkage L, Scope S, bool IsLive) |
Turn an absolute or external symbol into a defined one by attaching it to a block. | |
void | transferDefinedSymbol (Symbol &Sym, Block &DestBlock, orc::ExecutorAddrDiff NewOffset, std::optional< orc::ExecutorAddrDiff > ExplicitNewSize) |
Transfer a defined symbol from one block to another. | |
void | transferBlock (Block &B, Section &NewSection) |
Transfers the given Block and all Symbols pointing to it to the given Section. | |
void | mergeSections (Section &DstSection, Section &SrcSection, bool PreserveSrcSection=false) |
Move all blocks and symbols from the source section to the destination section. | |
void | removeExternalSymbol (Symbol &Sym) |
Removes an external symbol. Also removes the underlying Addressable. | |
void | removeAbsoluteSymbol (Symbol &Sym) |
Remove an absolute symbol. Also removes the underlying Addressable. | |
void | removeDefinedSymbol (Symbol &Sym) |
Removes defined symbols. Does not remove the underlying block. | |
void | removeBlock (Block &B) |
Remove a block. | |
void | removeSection (Section &Sec) |
Remove a section. | |
orc::shared::AllocActions & | allocActions () |
Accessor for the AllocActions object for this graph. | |
LLVM_ABI void | dump (raw_ostream &OS) |
Dump the graph. | |
using llvm::jitlink::LinkGraph::block_iterator = nested_collection_iterator<section_iterator, Section::block_iterator, Block *, getSectionBlocks> |
using llvm::jitlink::LinkGraph::const_block_iterator = nested_collection_iterator<const_section_iterator, Section::const_block_iterator, const Block *, getSectionConstBlocks> |
using llvm::jitlink::LinkGraph::const_defined_symbol_iterator = nested_collection_iterator<const_section_iterator, Section::const_symbol_iterator, const Symbol *, getSectionConstSymbols> |
using llvm::jitlink::LinkGraph::const_section_iterator = mapped_iterator<SectionMap::const_iterator, GetSectionMapEntryConstValue> |
using llvm::jitlink::LinkGraph::defined_symbol_iterator = nested_collection_iterator<section_iterator, Section::symbol_iterator, Symbol *, getSectionSymbols> |
using llvm::jitlink::LinkGraph::external_symbol_iterator = mapped_iterator<ExternalSymbolMap::iterator, GetExternalSymbolMapEntryValue> |
using llvm::jitlink::LinkGraph::GetEdgeKindNameFunction = const char *(*)(Edge::Kind) |
using llvm::jitlink::LinkGraph::section_iterator = mapped_iterator<SectionMap::iterator, GetSectionMapEntryValue> |
using llvm::jitlink::LinkGraph::SplitBlockCache = std::optional<SmallVector<Symbol *, 8> > |
|
inline |
Definition at line 1029 of file JITLink.h.
References assert(), llvm::Triple::getArch(), and llvm::Triple::getArchPointerBitWidth().
|
delete |
llvm::jitlink::LinkGraph::~LinkGraph | ( | ) |
Definition at line 171 of file JITLink.cpp.
References llvm::StringMap< ValueTy, AllocatorTy >::clear(), external_symbols(), and Sym.
|
inline |
Definition at line 1419 of file JITLink.h.
References llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::begin(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::end(), and llvm::make_range().
Referenced by findAbsoluteSymbolByName().
|
inline |
Add an absolute symbol.
Definition at line 1310 of file JITLink.h.
References llvm::Address, Allocator, assert(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::insert(), llvm::jitlink::Local, llvm::none_of(), Size, and Sym.
Referenced by addAbsoluteSymbol().
|
inline |
Definition at line 1325 of file JITLink.h.
References addAbsoluteSymbol(), llvm::Address, and Size.
|
inline |
|
inline |
Definition at line 1350 of file JITLink.h.
References Allocator, assert(), Content, defined_symbols(), llvm::jitlink::Local, llvm::none_of(), llvm::Offset, Size, and Sym.
|
inline |
Add a named symbol.
Definition at line 1343 of file JITLink.h.
References addDefinedSymbol(), Content, llvm::Offset, and Size.
Referenced by addDefinedSymbol().
|
inline |
Add an external symbol.
Some formats (e.g. ELF) allow Symbols to have sizes. For Symbols whose size is not known, you should substitute '0'. The IsWeaklyReferenced argument determines whether the symbol must be present during lookup: Externals that are strongly referenced must be found or an error will be emitted. Externals that are weakly referenced are permitted to be undefined, in which case they are assigned an address of 0.
Definition at line 1293 of file JITLink.h.
References Allocator, assert(), llvm::StringMap< ValueTy, AllocatorTy >::contains(), llvm::StringMap< ValueTy, AllocatorTy >::insert(), Size, llvm::jitlink::Strong, and Sym.
Referenced by addExternalSymbol().
|
inline |
Definition at line 1304 of file JITLink.h.
References addExternalSymbol(), and Size.
|
inline |
Accessor for the AllocActions object for this graph.
This can be used to register allocation action calls prior to finalization.
Accessing this object after finalization will result in undefined behavior.
Definition at line 1659 of file JITLink.h.
Referenced by llvm::orc::EPCGenericJITLinkMemoryManager::InFlightAlloc::finalize(), llvm::orc::MapperJITLinkMemoryManager::InFlightAlloc::finalize(), llvm::jitlink::InProcessMemoryManager::IPInFlightAlloc::finalize(), and llvm::jitlink::BasicLayout::graphAllocActions().
|
inline |
|
inline |
Allocate a copy of the given string using the LinkGraph's allocator.
This can be useful when renaming symbols or adding new content to the graph.
Definition at line 1076 of file JITLink.h.
References Allocator, and llvm::copy().
Referenced by allocateName().
|
inline |
Allocate a copy of the given string using the LinkGraph's allocator.
This can be useful when renaming symbols or adding new content to the graph.
Note: This Twine-based overload requires an extra string copy and an extra heap allocation for large strings. The ArrayRef<char> overload should be preferred where possible.
Definition at line 1089 of file JITLink.h.
References Allocator, and llvm::copy().
|
inline |
Allocate a copy of the given string using the LinkGraph's allocator.
The allocated string will be terminated with a null character, and the returned MutableArrayRef will include this null character in the last position.
Definition at line 1112 of file JITLink.h.
References Allocator, and llvm::copy().
|
inline |
Allocate a copy of the given string using the LinkGraph's allocator.
The allocated string will be terminated with a null character, and the returned MutableArrayRef will include this null character in the last position.
Note: This Twine-based overload requires an extra string copy and an extra heap allocation for large strings. The ArrayRef<char> overload should be preferred where possible.
Definition at line 1128 of file JITLink.h.
References Allocator, and llvm::copy().
Allocate a copy of the given string using the LinkGraph's allocator and return it as a StringRef.
This is a convenience wrapper around allocateContent(Twine) that is handy when creating new symbol names within the graph.
Definition at line 1102 of file JITLink.h.
References allocateContent().
|
inline |
Definition at line 1390 of file JITLink.h.
References llvm::make_range(), and sections().
Referenced by llvm::jitlink::PerGraphGOTAndPLTStubsBuilder< BuilderImplT >::run().
|
inline |
Definition at line 1396 of file JITLink.h.
References llvm::make_range(), and sections().
|
inline |
Create a content block.
Definition at line 1145 of file JITLink.h.
References llvm::Address, and Content.
Referenced by splitBlock().
|
inline |
Create a content block with initially mutable data.
Definition at line 1152 of file JITLink.h.
References llvm::Address.
|
inline |
Create a content block with initially mutable data of the given size.
Content will be allocated via the LinkGraph's allocateBuffer method. By default the memory will be zero-initialized. Passing false for ZeroInitialize will prevent this.
Definition at line 1165 of file JITLink.h.
References llvm::Address, allocateBuffer(), and Content.
|
inline |
|
inline |
Create a zero-fill block.
Definition at line 1176 of file JITLink.h.
References llvm::Address, and Size.
Referenced by splitBlock().
|
inline |
Definition at line 1430 of file JITLink.h.
References llvm::make_range(), and sections().
Referenced by addDefinedSymbol(), dump(), and findDefinedSymbolByName().
|
inline |
Definition at line 1436 of file JITLink.h.
References llvm::make_range(), and sections().
void llvm::jitlink::LinkGraph::dump | ( | raw_ostream & | OS | ) |
Dump the graph.
Definition at line 280 of file JITLink.cpp.
References defined_symbols(), LHS, RHS, llvm::sort(), and Sym.
|
inline |
Definition at line 1402 of file JITLink.h.
References llvm::StringMap< ValueTy, AllocatorTy >::begin(), llvm::StringMap< ValueTy, AllocatorTy >::end(), and llvm::make_range().
Referenced by findExternalSymbolByName(), removeAbsoluteSymbol(), removeExternalSymbol(), and ~LinkGraph().
|
inline |
Definition at line 1423 of file JITLink.h.
References absolute_symbols(), and Sym.
|
inline |
Returns the defined symbol with the given name if one exists, otherwise returns nullptr.
Definition at line 1444 of file JITLink.h.
References defined_symbols(), and Sym.
|
inline |
Returns the external symbol with the given name if one exists, otherwise returns nullptr.
Definition at line 1412 of file JITLink.h.
References external_symbols(), and Sym.
|
inline |
Returns a BinaryStreamReader for the given block.
Definition at line 1183 of file JITLink.h.
References B, llvm::CallingConv::C, and getEndianness().
|
inline |
Returns a BinaryStreamWriter for the given block.
This will call getMutableContent to obtain mutable content for the block.
Definition at line 1191 of file JITLink.h.
References B, llvm::CallingConv::C, and getEndianness().
Definition at line 1063 of file JITLink.h.
Referenced by llvm::jitlink::PerGraphGOTAndPLTStubsBuilder< BuilderImplT >::run().
|
inline |
Returns the endianness of content in this graph.
Definition at line 1059 of file JITLink.h.
References llvm::big, llvm::Triple::isLittleEndian(), and llvm::little.
Referenced by getBlockContentReader(), and getBlockContentWriter().
|
inline |
|
inline |
Returns the name of this graph (usually the name of the original underlying MemoryBuffer).
Definition at line 1047 of file JITLink.h.
Referenced by llvm::orc::GDBJITDebugInfoRegistrationPlugin::modifyPassConfig().
|
inline |
Returns the pointer size for use in this graph.
Definition at line 1056 of file JITLink.h.
References llvm::Triple::getArchPointerBitWidth().
|
inline |
Returns the target triple for this Graph.
Definition at line 1050 of file JITLink.h.
Referenced by llvm::orc::EHFrameRegistrationPlugin::modifyPassConfig(), and llvm::orc::GDBJITDebugInfoRegistrationPlugin::modifyPassConfig().
|
inline |
|
inline |
Make the given symbol an absolute with the given address (must not already be absolute).
The symbol's size, linkage, and callability, and liveness will be left unchanged, and its offset will be reset to 0.
If the symbol was external then its scope will be set to local, otherwise it will be left unchanged.
Definition at line 1482 of file JITLink.h.
References A, llvm::Address, assert(), llvm::StringMap< ValueTy, AllocatorTy >::contains(), llvm::StringMap< ValueTy, AllocatorTy >::erase(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::insert(), llvm::jitlink::Local, and Sym.
|
inline |
Turn an absolute or external symbol into a defined one by attaching it to a block.
Symbol must not already be defined.
Definition at line 1504 of file JITLink.h.
References assert(), llvm::StringMap< ValueTy, AllocatorTy >::contains(), Content, llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::count(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::erase(), llvm::StringMap< ValueTy, AllocatorTy >::erase(), llvm::Offset, Size, and Sym.
|
inline |
Make the given symbol external (must not already be external).
Symbol size, linkage and callability will be left unchanged. Symbol scope will be set to Default, and offset will be reset to 0.
Definition at line 1455 of file JITLink.h.
References A, assert(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::count(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::erase(), llvm::StringMap< ValueTy, AllocatorTy >::insert(), and Sym.
|
inline |
Move all blocks and symbols from the source section to the destination section.
If PreserveSrcSection is true (or SrcSection and DstSection are the same) then SrcSection is preserved, otherwise it is removed (the default).
Definition at line 1585 of file JITLink.h.
References B, llvm::jitlink::Section::blocks(), and removeSection().
|
inline |
Remove an absolute symbol. Also removes the underlying Addressable.
Definition at line 1612 of file JITLink.h.
References assert(), llvm::sampleprof::Base, llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::count(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::erase(), external_symbols(), llvm::none_of(), and Sym.
|
inline |
|
inline |
|
inline |
Removes an external symbol. Also removes the underlying Addressable.
Definition at line 1597 of file JITLink.h.
References assert(), llvm::sampleprof::Base, llvm::StringMap< ValueTy, AllocatorTy >::contains(), llvm::StringMap< ValueTy, AllocatorTy >::erase(), external_symbols(), llvm::none_of(), and Sym.
|
inline |
Remove a section.
The section reference is defunct after calling this function and should no longer be used.
Definition at line 1647 of file JITLink.h.
References assert(), and llvm::jitlink::Section::getName().
Referenced by mergeSections().
|
inline |
Definition at line 1366 of file JITLink.h.
References llvm::make_range().
Referenced by blocks(), defined_symbols(), and llvm::orc::DebugObjectManagerPlugin::modifyPassConfig().
|
inline |
Definition at line 1372 of file JITLink.h.
References llvm::make_range().
|
inline |
|
inline |
Splits block B into a sequence of smaller blocks.
SplitOffsets should be a sequence of ascending offsets in B. The starting offset should be greater than zero, and the final offset less than B.getSize() - 1.
The resulting seqeunce of blocks will start with the original block B (truncated to end at the first split offset) followed by newly introduced blocks starting at the subsequent split points.
The optional Cache parameter can be used to speed up repeated calls to splitBlock for blocks within a single Section. If the value is None then the cache will be treated as uninitialized and splitBlock will populate it. Otherwise it is assumed to contain the list of Symbols pointing at B, sorted in descending order of offset.
Notes:
Definition at line 1239 of file JITLink.h.
References assert(), B, Blocks, createContentBlock(), createZeroFillBlock(), and llvm::Offset.
Transfers the given Block and all Symbols pointing to it to the given Section.
No attempt is made to check compatibility of the source and destination sections. Blocks may be moved between sections with incompatible permissions (e.g. from data to text). The client is responsible for ensuring that this is safe.
Definition at line 1564 of file JITLink.h.
References B, llvm::jitlink::Symbol::getBlock(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
|
inline |
Transfer a defined symbol from one block to another.
The symbol's offset within DestBlock is set to NewOffset.
If ExplicitNewSize is given as None then the size of the symbol will be checked and auto-truncated to at most the size of the remainder (from the given offset) of the size of the new block.
All other symbol attributes are unchanged.
Definition at line 1538 of file JITLink.h.
References llvm::jitlink::Block::getSection(), llvm::jitlink::Block::getSize(), and Sym.