From ec5336f4a3f34319740414b04002aa65ec4cebd1 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Mon, 3 Aug 2020 11:55:57 -0700 Subject: [PATCH] [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. --- lib/ExecutionEngine/Orc/ExecutionUtils.cpp | 3 ++- tools/llvm-jitlink/llvm-jitlink.cpp | 21 +++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/ExecutionEngine/Orc/ExecutionUtils.cpp b/lib/ExecutionEngine/Orc/ExecutionUtils.cpp index 4d255cd66c1..278f492f0eb 100644 --- a/lib/ExecutionEngine/Orc/ExecutionUtils.cpp +++ b/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/tools/llvm-jitlink/llvm-jitlink.cpp b/tools/llvm-jitlink/llvm-jitlink.cpp index 798087d8cae..d5dc661cc69 100644 --- a/tools/llvm-jitlink/llvm-jitlink.cpp +++ b/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());