summaryrefslogtreecommitdiffstats
path: root/llvm/include/llvm/ExecutionEngine/Orc/Core.h
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-07-10 23:34:56 +0000
committerLang Hames <lhames@gmail.com>2018-07-10 23:34:56 +0000
commita3c473e650f538a93b66187ac02980dd6ab1ab45 (patch)
treec7e56411d9f475dfc8bb4594eaacee936fa3b4c7 /llvm/include/llvm/ExecutionEngine/Orc/Core.h
parentdb5c9aa3664ceb6b01d8ba2627c22d0b6bf3ee97 (diff)
downloadbcm5719-llvm-a3c473e650f538a93b66187ac02980dd6ab1ab45.tar.gz
bcm5719-llvm-a3c473e650f538a93b66187ac02980dd6ab1ab45.zip
[ORC] Generalize alias materialization to support re-exports (i.e. aliasing of
symbols in another VSO). Also fixes a bug where chained aliases within a single VSO would deadlock on materialization. llvm-svn: 336741
Diffstat (limited to 'llvm/include/llvm/ExecutionEngine/Orc/Core.h')
-rw-r--r--llvm/include/llvm/ExecutionEngine/Orc/Core.h37
1 files changed, 31 insertions, 6 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Core.h b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
index 5a37e5d94a7..7df59641f8e 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/Core.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
@@ -251,6 +251,10 @@ absoluteSymbols(SymbolMap Symbols) {
}
struct SymbolAliasMapEntry {
+ SymbolAliasMapEntry() = default;
+ SymbolAliasMapEntry(SymbolStringPtr Aliasee, JITSymbolFlags AliasFlags)
+ : Aliasee(std::move(Aliasee)), AliasFlags(AliasFlags) {}
+
SymbolStringPtr Aliasee;
JITSymbolFlags AliasFlags;
};
@@ -260,19 +264,27 @@ using SymbolAliasMap = std::map<SymbolStringPtr, SymbolAliasMapEntry>;
/// A materialization unit for symbol aliases. Allows existing symbols to be
/// aliased with alternate flags.
-class SymbolAliasesMaterializationUnit : public MaterializationUnit {
+class ReExportsMaterializationUnit : public MaterializationUnit {
public:
- SymbolAliasesMaterializationUnit(SymbolAliasMap Aliases);
+ /// SourceVSO is allowed to be nullptr, in which case the source VSO is
+ /// taken to be whatever VSO these definitions are materialized in. This
+ /// is useful for defining aliases within a VSO.
+ ///
+ /// Note: Care must be taken that no sets of aliases form a cycle, as such
+ /// a cycle will result in a deadlock when any symbol in the cycle is
+ /// resolved.
+ ReExportsMaterializationUnit(VSO *SourceVSO, SymbolAliasMap Aliases);
private:
void materialize(MaterializationResponsibility R) override;
void discard(const VSO &V, SymbolStringPtr Name) override;
static SymbolFlagsMap extractFlags(const SymbolAliasMap &Aliases);
+ VSO *SourceVSO = nullptr;
SymbolAliasMap Aliases;
};
-/// Create a SymbolAliasesMaterializationUnit with the given aliases.
+/// Create a ReExportsMaterializationUnit with the given aliases.
/// Useful for defining symbol aliases.: E.g., given a VSO V containing symbols
/// "foo" and "bar", we can define aliases "baz" (for "foo") and "qux" (for
/// "bar") with:
@@ -284,12 +296,25 @@ private:
/// {Qux, { Bar, JITSymbolFlags::Weak }}}))
/// return Err;
/// \endcode
-inline std::unique_ptr<SymbolAliasesMaterializationUnit>
+inline std::unique_ptr<ReExportsMaterializationUnit>
symbolAliases(SymbolAliasMap Aliases) {
- return llvm::make_unique<SymbolAliasesMaterializationUnit>(
- std::move(Aliases));
+ return llvm::make_unique<ReExportsMaterializationUnit>(nullptr,
+ std::move(Aliases));
}
+/// Create a materialization unit for re-exporting symbols from another VSO
+/// with alternative names/flags.
+inline std::unique_ptr<ReExportsMaterializationUnit>
+reexports(VSO &SourceV, SymbolAliasMap Aliases) {
+ return llvm::make_unique<ReExportsMaterializationUnit>(&SourceV,
+ std::move(Aliases));
+}
+
+/// Build a SymbolAliasMap for the common case where you want to re-export
+/// symbols from another VSO with the same linkage/flags.
+Expected<SymbolAliasMap>
+buildSimpleReexportsAliasMap(VSO &SourceV, const SymbolNameSet &Symbols);
+
/// Base utilities for ExecutionSession.
class ExecutionSessionBase {
public:
OpenPOWER on IntegriCloud