summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2020-08-03 11:55:57 -0700
committerLang Hames <lhames@gmail.com>2020-08-03 12:58:00 -0700
commit777824b49d5d9e1fbc93108107fa6d12a936a2e4 (patch)
tree8a776d29cbe4ea4cab6836aa3afbbfaa67e38914
parent3e89cbf38e76d0d0ac75fe77d318a5cfeac512f5 (diff)
downloadllvm-777824b49d5d9e1fbc93108107fa6d12a936a2e4.tar.gz
[llvm-jitlink] Add support for static archives and MachO universal archives.
Archives can now be specified as input files the same way that object files are. Archives will always be linked after all objects (regardless of the relative order of the inputs) but before any dynamic libraries or process symbols. This patch also relaxes matching for slice triples in StaticLibraryDefinitionGenerator in order to support this feature: Vendors need not match if the source vendor is unknown.
-rw-r--r--llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp3
-rw-r--r--llvm/tools/llvm-jitlink/llvm-jitlink.cpp21
2 files changed, 17 insertions, 7 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp b/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp
index 4d255cd66c1b..278f492f0ebe 100644
--- a/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp
@@ -322,7 +322,8 @@ StaticLibraryDefinitionGenerator::Load(ObjectLayer &L, const char *FileName,
auto ObjTT = Obj.getTriple();
if (ObjTT.getArch() == TT.getArch() &&
ObjTT.getSubArch() == TT.getSubArch() &&
- ObjTT.getVendor() == TT.getVendor()) {
+ (TT.getVendor() == Triple::UnknownVendor ||
+ ObjTT.getVendor() == TT.getVendor())) {
// We found a match. Create an instance from a buffer covering this
// slice.
auto SliceBuffer = MemoryBuffer::getFileSlice(FileName, Obj.getSize(),
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
index 798087d8cae7..d5dc661cc69f 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
@@ -14,6 +14,7 @@
#include "llvm-jitlink.h"
+#include "llvm/BinaryFormat/Magic.h"
#include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"
#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
#include "llvm/MC/MCAsmInfo.h"
@@ -887,13 +888,20 @@ Error loadObjects(Session &S) {
InputFileItr != InputFileEnd; ++InputFileItr) {
unsigned InputFileArgIdx =
InputFiles.getPosition(InputFileItr - InputFiles.begin());
- StringRef InputFile = *InputFileItr;
+ const std::string &InputFile = *InputFileItr;
auto &JD = *std::prev(IdxToJLD.lower_bound(InputFileArgIdx))->second;
LLVM_DEBUG(dbgs() << " " << InputFileArgIdx << ": \"" << InputFile
<< "\" to " << JD.getName() << "\n";);
auto ObjBuffer =
ExitOnErr(errorOrToExpected(MemoryBuffer::getFile(InputFile)));
- ExitOnErr(S.ObjLayer.add(JD, std::move(ObjBuffer)));
+
+ auto Magic = identify_magic(ObjBuffer->getBuffer());
+ if (Magic == file_magic::archive ||
+ Magic == file_magic::macho_universal_binary)
+ JD.addGenerator(ExitOnErr(StaticLibraryDefinitionGenerator::Load(
+ S.ObjLayer, InputFile.c_str(), S.TT)));
+ else
+ ExitOnErr(S.ObjLayer.add(JD, std::move(ObjBuffer)));
}
// Define absolute symbols.
@@ -1056,6 +1064,11 @@ int main(int argc, char *argv[]) {
ExitOnErr(sanitizeArguments(*S));
+ {
+ TimeRegion TR(Timers ? &Timers->LoadObjectsTimer : nullptr);
+ ExitOnErr(loadObjects(*S));
+ }
+
if (!NoProcessSymbols)
ExitOnErr(loadProcessSymbols(*S));
ExitOnErr(loadDylibs());
@@ -1063,10 +1076,6 @@ int main(int argc, char *argv[]) {
if (PhonyExternals)
addPhonyExternalsGenerator(*S);
- {
- TimeRegion TR(Timers ? &Timers->LoadObjectsTimer : nullptr);
- ExitOnErr(loadObjects(*S));
- }
if (ShowInitialExecutionSessionState)
S->ES.dump(outs());