diff options
| author | Lang Hames <lhames@gmail.com> | 2018-07-10 23:34:56 +0000 |
|---|---|---|
| committer | Lang Hames <lhames@gmail.com> | 2018-07-10 23:34:56 +0000 |
| commit | a3c473e650f538a93b66187ac02980dd6ab1ab45 (patch) | |
| tree | c7e56411d9f475dfc8bb4594eaacee936fa3b4c7 /llvm/include/llvm/ExecutionEngine/Orc/Core.h | |
| parent | db5c9aa3664ceb6b01d8ba2627c22d0b6bf3ee97 (diff) | |
| download | bcm5719-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.h | 37 |
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: |

