aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h3
-rw-r--r--llvm/lib/ExecutionEngine/Orc/COFFPlatform.cpp2
-rw-r--r--llvm/lib/ExecutionEngine/Orc/ELFNixPlatform.cpp2
-rw-r--r--llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp6
-rw-r--r--llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp12
5 files changed, 14 insertions, 11 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
index 9844214..2831ebb 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h
@@ -393,10 +393,13 @@ const char *getLinkageName(Linkage L);
/// Defines the scope in which this symbol should be visible:
/// Default -- Visible in the public interface of the linkage unit.
/// Hidden -- Visible within the linkage unit, but not exported from it.
+/// SideEffectsOnly -- Like hidden, but symbol can only be looked up once
+/// to trigger materialization of the containing graph.
/// Local -- Visible only within the LinkGraph.
enum class Scope : uint8_t {
Default,
Hidden,
+ SideEffectsOnly,
Local
};
diff --git a/llvm/lib/ExecutionEngine/Orc/COFFPlatform.cpp b/llvm/lib/ExecutionEngine/Orc/COFFPlatform.cpp
index 007e18e..9d655c2 100644
--- a/llvm/lib/ExecutionEngine/Orc/COFFPlatform.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/COFFPlatform.cpp
@@ -76,7 +76,7 @@ public:
// Init symbol is __ImageBase symbol.
auto &ImageBaseSymbol = G->addDefinedSymbol(
HeaderBlock, 0, *R->getInitializerSymbol(), HeaderBlock.getSize(),
- jitlink::Linkage::Strong, jitlink::Scope::Default, false, true);
+ jitlink::Linkage::Strong, jitlink::Scope::SideEffectsOnly, false, true);
addImageBaseRelocationEdge(HeaderBlock, ImageBaseSymbol);
diff --git a/llvm/lib/ExecutionEngine/Orc/ELFNixPlatform.cpp b/llvm/lib/ExecutionEngine/Orc/ELFNixPlatform.cpp
index 431c649..44d282f 100644
--- a/llvm/lib/ExecutionEngine/Orc/ELFNixPlatform.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ELFNixPlatform.cpp
@@ -197,7 +197,7 @@ public:
8, 0);
auto &DSOHandleSymbol = G->addDefinedSymbol(
DSOHandleBlock, 0, *R->getInitializerSymbol(), DSOHandleBlock.getSize(),
- jitlink::Linkage::Strong, jitlink::Scope::Default, false, true);
+ jitlink::Linkage::Strong, jitlink::Scope::SideEffectsOnly, false, true);
DSOHandleBlock.addEdge(EdgeKind, 0, DSOHandleSymbol, 0);
ENP.getObjectLinkingLayer().emit(std::move(R), std::move(G));
diff --git a/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp b/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp
index 3e02beb..1b18a4d 100644
--- a/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp
@@ -1001,9 +1001,9 @@ Error MachOPlatform::MachOPlatformPlugin::preserveImportantSections(
// to the first block.
if (!InitSym) {
auto &B = **InitSection->blocks().begin();
- InitSym = &G.addDefinedSymbol(B, 0, *InitSymName, B.getSize(),
- jitlink::Linkage::Strong,
- jitlink::Scope::Default, false, true);
+ InitSym = &G.addDefinedSymbol(
+ B, 0, *InitSymName, B.getSize(), jitlink::Linkage::Strong,
+ jitlink::Scope::SideEffectsOnly, false, true);
}
// Add keep-alive edges to anonymous symbols in all other init blocks.
diff --git a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
index c1c5540..c5342c4 100644
--- a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
@@ -65,6 +65,8 @@ JITSymbolFlags getJITSymbolFlagsForSymbol(Symbol &Sym) {
if (Sym.getScope() == Scope::Default)
Flags |= JITSymbolFlags::Exported;
+ else if (Sym.getScope() == Scope::SideEffectsOnly)
+ Flags |= JITSymbolFlags::MaterializationSideEffectsOnly;
if (Sym.isCallable())
Flags |= JITSymbolFlags::Callable;
@@ -236,7 +238,7 @@ public:
SymbolMap InternedResult;
for (auto *Sym : G.defined_symbols())
- if (Sym->getScope() != Scope::Local) {
+ if (Sym->getScope() < Scope::SideEffectsOnly) {
auto InternedName = ES.intern(Sym->getName());
auto Ptr = getJITSymbolPtrForSymbol(*Sym, G.getTargetTriple());
auto Flags = getJITSymbolFlagsForSymbol(*Sym);
@@ -249,7 +251,7 @@ public:
}
for (auto *Sym : G.absolute_symbols())
- if (Sym->getScope() != Scope::Local) {
+ if (Sym->getScope() < Scope::SideEffectsOnly) {
auto InternedName = ES.intern(Sym->getName());
auto Ptr = getJITSymbolPtrForSymbol(*Sym, G.getTargetTriple());
auto Flags = getJITSymbolFlagsForSymbol(*Sym);
@@ -281,11 +283,9 @@ public:
// If this is a materialization-side-effects only symbol then bump
// the counter and remove in from the result, otherwise make sure that
// it's defined.
- if (Flags.hasMaterializationSideEffectsOnly()) {
+ if (Flags.hasMaterializationSideEffectsOnly())
++NumMaterializationSideEffectsOnlySymbols;
- InternedResult.erase(Sym);
- continue;
- } else if (I == InternedResult.end())
+ else if (I == InternedResult.end())
MissingSymbols.push_back(Sym);
else if (Layer.OverrideObjectFlags)
I->second.setFlags(Flags);