|
30 | 30 | #include "llvm/ExecutionEngine/Orc/MachOPlatform.h"
|
31 | 31 | #include "llvm/ExecutionEngine/Orc/MapperJITLinkMemoryManager.h"
|
32 | 32 | #include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h"
|
| 33 | +#include "llvm/ExecutionEngine/Orc/SectCreate.h" |
33 | 34 | #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
|
34 | 35 | #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h"
|
35 | 36 | #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderPerf.h"
|
@@ -162,6 +163,12 @@ static cl::list<std::string>
|
162 | 163 | cl::desc("Inject symbol aliases (syntax: <alias-name>=<aliasee>)"),
|
163 | 164 | cl::cat(JITLinkCategory));
|
164 | 165 |
|
| 166 | +static cl::list<std::string> |
| 167 | + SectCreate("sectcreate", |
| 168 | + cl::desc("given <sectname>,<filename>[:<sym>=<offset>,...] " |
| 169 | + "add the content of <filename> to <sectname>"), |
| 170 | + cl::cat(JITLinkCategory)); |
| 171 | + |
165 | 172 | static cl::list<std::string> TestHarnesses("harness", cl::Positional,
|
166 | 173 | cl::desc("Test harness files"),
|
167 | 174 | cl::PositionalEatsArgs,
|
@@ -1666,6 +1673,57 @@ static Error addAliases(Session &S,
|
1666 | 1673 | return Error::success();
|
1667 | 1674 | }
|
1668 | 1675 |
|
| 1676 | +static Error addSectCreates(Session &S, |
| 1677 | + const std::map<unsigned, JITDylib *> &IdxToJD) { |
| 1678 | + for (auto SCItr = SectCreate.begin(), SCEnd = SectCreate.end(); |
| 1679 | + SCItr != SCEnd; ++SCItr) { |
| 1680 | + |
| 1681 | + unsigned SCArgIdx = SectCreate.getPosition(SCItr - SectCreate.begin()); |
| 1682 | + auto &JD = *std::prev(IdxToJD.lower_bound(SCArgIdx))->second; |
| 1683 | + |
| 1684 | + StringRef SCArg(*SCItr); |
| 1685 | + |
| 1686 | + auto [SectAndFileName, ExtraSymbolsString] = SCArg.split(':'); |
| 1687 | + auto [SectName, FileName] = SectAndFileName.rsplit(','); |
| 1688 | + if (SectName.empty()) |
| 1689 | + return make_error<StringError>("In -sectcreate=" + SCArg + |
| 1690 | + ", filename component cannot be empty", |
| 1691 | + inconvertibleErrorCode()); |
| 1692 | + if (FileName.empty()) |
| 1693 | + return make_error<StringError>("In -sectcreate=" + SCArg + |
| 1694 | + ", filename component cannot be empty", |
| 1695 | + inconvertibleErrorCode()); |
| 1696 | + |
| 1697 | + auto Content = MemoryBuffer::getFile(FileName); |
| 1698 | + if (!Content) |
| 1699 | + return createFileError(FileName, errorCodeToError(Content.getError())); |
| 1700 | + |
| 1701 | + SectCreateMaterializationUnit::ExtraSymbolsMap ExtraSymbols; |
| 1702 | + while (!ExtraSymbolsString.empty()) { |
| 1703 | + StringRef NextSymPair; |
| 1704 | + std::tie(NextSymPair, ExtraSymbolsString) = ExtraSymbolsString.split(','); |
| 1705 | + |
| 1706 | + auto [Sym, OffsetString] = NextSymPair.split('='); |
| 1707 | + size_t Offset; |
| 1708 | + |
| 1709 | + if (OffsetString.getAsInteger(0, Offset)) |
| 1710 | + return make_error<StringError>("In -sectcreate=" + SCArg + ", " + |
| 1711 | + OffsetString + |
| 1712 | + " is not a valid integer", |
| 1713 | + inconvertibleErrorCode()); |
| 1714 | + |
| 1715 | + ExtraSymbols[S.ES.intern(Sym)] = {JITSymbolFlags::Exported, Offset}; |
| 1716 | + } |
| 1717 | + |
| 1718 | + if (auto Err = JD.define(std::make_unique<SectCreateMaterializationUnit>( |
| 1719 | + S.ObjLayer, SectName.str(), MemProt::Read, 16, std::move(*Content), |
| 1720 | + std::move(ExtraSymbols)))) |
| 1721 | + return Err; |
| 1722 | + } |
| 1723 | + |
| 1724 | + return Error::success(); |
| 1725 | +} |
| 1726 | + |
1669 | 1727 | static Error addTestHarnesses(Session &S) {
|
1670 | 1728 | LLVM_DEBUG(dbgs() << "Adding test harness objects...\n");
|
1671 | 1729 | for (auto HarnessFile : TestHarnesses) {
|
@@ -2016,6 +2074,9 @@ static Error addSessionInputs(Session &S) {
|
2016 | 2074 | if (auto Err = addAliases(S, IdxToJD))
|
2017 | 2075 | return Err;
|
2018 | 2076 |
|
| 2077 | + if (auto Err = addSectCreates(S, IdxToJD)) |
| 2078 | + return Err; |
| 2079 | + |
2019 | 2080 | if (!TestHarnesses.empty())
|
2020 | 2081 | if (auto Err = addTestHarnesses(S))
|
2021 | 2082 | return Err;
|
|
0 commit comments