Index: include/lld/ReaderWriter/ELFLinkingContext.h =================================================================== --- include/lld/ReaderWriter/ELFLinkingContext.h +++ include/lld/ReaderWriter/ELFLinkingContext.h @@ -116,8 +116,6 @@ return true; } - static std::unique_ptr create(llvm::Triple); - /// \brief Use Elf_Rela format to output relocation tables. virtual bool isRelaOutputFormat() const { return true; } Index: include/lld/ReaderWriter/ELFTargets.h =================================================================== --- /dev/null +++ include/lld/ReaderWriter/ELFTargets.h @@ -0,0 +1,40 @@ +//===- lld/ReaderWriter/ELFTargets.h --------------------------------------===// +// +// The LLVM Linker +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLD_READER_WRITER_ELF_TARGETS_H +#define LLD_READER_WRITER_ELF_TARGETS_H + +#include "ELFLinkingContext.h" + +namespace lld { +namespace elf { + +#define LLVM_TARGET(TargetName) \ + class TargetName##LinkingContext final : public ELFLinkingContext { \ + public: \ + static std::unique_ptr create(llvm::Triple); \ + }; +#include "llvm/Config/Targets.def" + +// X86 => X86,X86_64 +class X86_64LinkingContext final : public ELFLinkingContext { +public: + static std::unique_ptr create(llvm::Triple); \ +}; + +// PowerPC => PPC +class PPCLinkingContext final : public ELFLinkingContext { +public: + static std::unique_ptr create(llvm::Triple); \ +}; + +} // end namespace elf +} // end namespace lld + +#endif Index: lib/Driver/CMakeLists.txt =================================================================== --- lib/Driver/CMakeLists.txt +++ lib/Driver/CMakeLists.txt @@ -24,6 +24,13 @@ lldMachO lldPECOFF lldELF + lldAArch64ELFTarget + lldARMELFTarget + lldHexagonELFTarget + lldMipsELFTarget + lldPPCELFTarget + lldX86ELFTarget + lldX86_64ELFTarget lldCore lldNative lldReaderWriter Index: lib/Driver/GnuLdDriver.cpp =================================================================== --- lib/Driver/GnuLdDriver.cpp +++ lib/Driver/GnuLdDriver.cpp @@ -15,6 +15,7 @@ #include "lld/Driver/Driver.h" #include "lld/ReaderWriter/ELFLinkingContext.h" +#include "lld/ReaderWriter/ELFTargets.h" #include "lld/ReaderWriter/LinkerScript.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/Optional.h" @@ -314,6 +315,19 @@ ctx.addSearchPath("=/usr/lib"); } +std::unique_ptr +createELFLinkingContext(llvm::Triple triple) { + std::unique_ptr p; + if ((p = elf::AArch64LinkingContext::create(triple))) return p; + else if ((p = elf::ARMLinkingContext::create(triple))) return p; + else if ((p = elf::HexagonLinkingContext::create(triple))) return p; + else if ((p = elf::MipsLinkingContext::create(triple))) return p; + else if ((p = elf::PPCLinkingContext::create(triple))) return p; + else if ((p = elf::X86LinkingContext::create(triple))) return p; + else if ((p = elf::X86_64LinkingContext::create(triple))) return p; + else return nullptr; +} + bool GnuLdDriver::parse(int argc, const char *argv[], std::unique_ptr &context, raw_ostream &diagnostics) { @@ -349,7 +363,7 @@ if (!applyEmulation(triple, *parsedArgs, diagnostics)) return false; - std::unique_ptr ctx(ELFLinkingContext::create(triple)); + std::unique_ptr ctx(createELFLinkingContext(triple)); if (!ctx) { diagnostics << "unknown target triple\n"; Index: lib/ReaderWriter/ELF/AArch64/AArch64DynamicLibraryWriter.h =================================================================== --- lib/ReaderWriter/ELF/AArch64/AArch64DynamicLibraryWriter.h +++ lib/ReaderWriter/ELF/AArch64/AArch64DynamicLibraryWriter.h @@ -10,6 +10,7 @@ #define AARCH64_DYNAMIC_LIBRARY_WRITER_H #include "AArch64LinkingContext.h" +#include "AArch64TargetHandler.h" #include "DynamicLibraryWriter.h" namespace lld { Index: lib/ReaderWriter/ELF/AArch64/AArch64LinkingContext.h =================================================================== --- lib/ReaderWriter/ELF/AArch64/AArch64LinkingContext.h +++ lib/ReaderWriter/ELF/AArch64/AArch64LinkingContext.h @@ -10,7 +10,6 @@ #ifndef LLD_READER_WRITER_ELF_AARCH64_AARCH64_LINKING_CONTEXT_H #define LLD_READER_WRITER_ELF_AARCH64_AARCH64_LINKING_CONTEXT_H -#include "AArch64TargetHandler.h" #include "lld/ReaderWriter/ELFLinkingContext.h" #include "llvm/Object/ELF.h" #include "llvm/Support/ELF.h" @@ -25,9 +24,8 @@ class AArch64LinkingContext final : public ELFLinkingContext { public: - AArch64LinkingContext(llvm::Triple triple) - : ELFLinkingContext(triple, std::unique_ptr( - new AArch64TargetHandler(*this))) {} + static std::unique_ptr create(llvm::Triple); + AArch64LinkingContext(llvm::Triple); void addPasses(PassManager &) override; Index: lib/ReaderWriter/ELF/AArch64/AArch64LinkingContext.cpp =================================================================== --- lib/ReaderWriter/ELF/AArch64/AArch64LinkingContext.cpp +++ lib/ReaderWriter/ELF/AArch64/AArch64LinkingContext.cpp @@ -9,9 +9,23 @@ #include "AArch64LinkingContext.h" #include "AArch64RelocationPass.h" +#include "AArch64TargetHandler.h" using namespace lld; +std::unique_ptr +elf::AArch64LinkingContext::create(llvm::Triple triple) { + if (triple.getArch() == llvm::Triple::aarch64) + return std::unique_ptr( + new elf::AArch64LinkingContext(triple)); + + return nullptr; +} + +elf::AArch64LinkingContext::AArch64LinkingContext(llvm::Triple triple) + : ELFLinkingContext(triple, std::unique_ptr( + new AArch64TargetHandler(*this))) {} + void elf::AArch64LinkingContext::addPasses(PassManager &pm) { auto pass = createAArch64RelocationPass(*this); if (pass) Index: lib/ReaderWriter/ELF/AArch64/AArch64Target.h =================================================================== --- lib/ReaderWriter/ELF/AArch64/AArch64Target.h +++ /dev/null @@ -1,10 +0,0 @@ -//===- lib/ReaderWriter/ELF/AArch64/AArch64Target.h -----------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "AArch64LinkingContext.h" Index: lib/ReaderWriter/ELF/AArch64/CMakeLists.txt =================================================================== --- lib/ReaderWriter/ELF/AArch64/CMakeLists.txt +++ lib/ReaderWriter/ELF/AArch64/CMakeLists.txt @@ -5,5 +5,7 @@ AArch64RelocationPass.cpp LINK_LIBS lldCore + lldELF + LLVMObject LLVMSupport ) Index: lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h =================================================================== --- lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h +++ lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h @@ -11,6 +11,7 @@ #include "ExecutableWriter.h" #include "ARMLinkingContext.h" +#include "ARMTargetHandler.h" namespace lld { namespace elf { Index: lib/ReaderWriter/ELF/ARM/ARMLinkingContext.h =================================================================== --- lib/ReaderWriter/ELF/ARM/ARMLinkingContext.h +++ lib/ReaderWriter/ELF/ARM/ARMLinkingContext.h @@ -10,10 +10,7 @@ #ifndef LLD_READER_WRITER_ELF_ARM_ARM_LINKING_CONTEXT_H #define LLD_READER_WRITER_ELF_ARM_ARM_LINKING_CONTEXT_H -#include "ARMTargetHandler.h" - #include "lld/ReaderWriter/ELFLinkingContext.h" - #include "llvm/Object/ELF.h" #include "llvm/Support/ELF.h" @@ -22,9 +19,8 @@ class ARMLinkingContext final : public ELFLinkingContext { public: - ARMLinkingContext(llvm::Triple triple) - : ELFLinkingContext(triple, std::unique_ptr( - new ARMTargetHandler(*this))) {} + static std::unique_ptr create(llvm::Triple); + ARMLinkingContext(llvm::Triple); void addPasses(PassManager &) override; Index: lib/ReaderWriter/ELF/ARM/ARMLinkingContext.cpp =================================================================== --- lib/ReaderWriter/ELF/ARM/ARMLinkingContext.cpp +++ lib/ReaderWriter/ELF/ARM/ARMLinkingContext.cpp @@ -9,10 +9,24 @@ #include "ARMLinkingContext.h" #include "ARMRelocationPass.h" +#include "ARMTargetHandler.h" using namespace lld; using namespace lld::elf; +std::unique_ptr +elf::ARMLinkingContext::create(llvm::Triple triple) { + if (triple.getArch() == llvm::Triple::arm) + return std::unique_ptr( + new elf::ARMLinkingContext(triple)); + + return nullptr; +} + +elf::ARMLinkingContext::ARMLinkingContext(llvm::Triple triple) + : ELFLinkingContext(triple, std::unique_ptr( + new ARMTargetHandler(*this))) {} + void elf::ARMLinkingContext::addPasses(PassManager &pm) { auto pass = createARMRelocationPass(*this); if (pass) Index: lib/ReaderWriter/ELF/ARM/ARMTarget.h =================================================================== --- lib/ReaderWriter/ELF/ARM/ARMTarget.h +++ /dev/null @@ -1,10 +0,0 @@ -//===--------- lib/ReaderWriter/ELF/ARM/ARMTarget.h -----------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "ARMLinkingContext.h" Index: lib/ReaderWriter/ELF/ARM/CMakeLists.txt =================================================================== --- lib/ReaderWriter/ELF/ARM/CMakeLists.txt +++ lib/ReaderWriter/ELF/ARM/CMakeLists.txt @@ -5,4 +5,7 @@ ARMRelocationPass.cpp LINK_LIBS lldCore + lldELF + LLVMObject + LLVMSupport ) Index: lib/ReaderWriter/ELF/CMakeLists.txt =================================================================== --- lib/ReaderWriter/ELF/CMakeLists.txt +++ lib/ReaderWriter/ELF/CMakeLists.txt @@ -4,15 +4,10 @@ Reader.cpp Writer.cpp LINK_LIBS - lldHexagonELFTarget - lldMipsELFTarget - lldPPCELFTarget + lldCore lldPasses - lldReaderWriter - lldX86ELFTarget - lldX86_64ELFTarget - lldAArch64ELFTarget - lldARMELFTarget + lldYAML + LLVMSupport ) include_directories(.) Index: lib/ReaderWriter/ELF/ELFLinkingContext.cpp =================================================================== --- lib/ReaderWriter/ELF/ELFLinkingContext.cpp +++ lib/ReaderWriter/ELF/ELFLinkingContext.cpp @@ -11,8 +11,8 @@ #include "ArrayOrderPass.h" #include "ELFFile.h" #include "TargetHandler.h" -#include "Targets.h" #include "lld/Core/Instrumentation.h" +#include "lld/Core/SharedLibraryFile.h" #include "lld/Passes/LayoutPass.h" #include "lld/Passes/RoundTripYAMLPass.h" #include "llvm/ADT/Triple.h" @@ -56,7 +56,7 @@ ELFLinkingContext::ELFLinkingContext( llvm::Triple triple, std::unique_ptr targetHandler) - : _outputELFType(elf::ET_EXEC), _triple(triple), + : _outputELFType(llvm::ELF::ET_EXEC), _triple(triple), _targetHandler(std::move(targetHandler)), _baseAddress(0), _isStaticExecutable(false), _noInhibitExec(false), _exportDynamic(false), _mergeCommonStrings(false), _runLayoutPass(true), @@ -93,7 +93,7 @@ } StringRef ELFLinkingContext::entrySymbolName() const { - if (_outputELFType == elf::ET_EXEC && _entrySymbolName.empty()) + if (_outputELFType == llvm::ELF::ET_EXEC && _entrySymbolName.empty()) return "_start"; return _entrySymbolName; } @@ -129,35 +129,6 @@ Writer &ELFLinkingContext::writer() const { return *_writer; } -std::unique_ptr -ELFLinkingContext::create(llvm::Triple triple) { - switch (triple.getArch()) { - case llvm::Triple::x86: - return std::unique_ptr( - new lld::elf::X86LinkingContext(triple)); - case llvm::Triple::x86_64: - return std::unique_ptr( - new lld::elf::X86_64LinkingContext(triple)); - case llvm::Triple::hexagon: - return std::unique_ptr( - new lld::elf::HexagonLinkingContext(triple)); - case llvm::Triple::mipsel: - return std::unique_ptr( - new lld::elf::MipsLinkingContext(triple)); - case llvm::Triple::ppc: - return std::unique_ptr( - new lld::elf::PPCLinkingContext(triple)); - case llvm::Triple::aarch64: - return std::unique_ptr( - new lld::elf::AArch64LinkingContext(triple)); - case llvm::Triple::arm: - return std::unique_ptr( - new lld::elf::ARMLinkingContext(triple)); - default: - return nullptr; - } -} - static void buildSearchPath(SmallString<128> &path, StringRef dir, StringRef sysRoot) { if (!dir.startswith("=/")) Index: lib/ReaderWriter/ELF/Hexagon/CMakeLists.txt =================================================================== --- lib/ReaderWriter/ELF/Hexagon/CMakeLists.txt +++ lib/ReaderWriter/ELF/Hexagon/CMakeLists.txt @@ -4,5 +4,7 @@ HexagonTargetHandler.cpp LINK_LIBS lldCore + lldELF + LLVMObject LLVMSupport ) Index: lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h =================================================================== --- lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h +++ lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.h @@ -21,6 +21,7 @@ class HexagonLinkingContext final : public ELFLinkingContext { public: + static std::unique_ptr create(llvm::Triple); HexagonLinkingContext(llvm::Triple triple); void addPasses(PassManager &) override; Index: lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.cpp =================================================================== --- lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.cpp +++ lib/ReaderWriter/ELF/Hexagon/HexagonLinkingContext.cpp @@ -12,6 +12,15 @@ using namespace lld::elf; +std::unique_ptr +HexagonLinkingContext::create(llvm::Triple triple) { + if (triple.getArch() == llvm::Triple::hexagon) + return std::unique_ptr( + new HexagonLinkingContext(triple)); + + return nullptr; +} + HexagonLinkingContext::HexagonLinkingContext(llvm::Triple triple) : ELFLinkingContext(triple, std::unique_ptr( new HexagonTargetHandler(*this))) {} Index: lib/ReaderWriter/ELF/Hexagon/HexagonTarget.h =================================================================== --- lib/ReaderWriter/ELF/Hexagon/HexagonTarget.h +++ /dev/null @@ -1,10 +0,0 @@ -//===- lib/ReaderWriter/ELF/Hexagon/HexagonTarget.h -----------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "HexagonLinkingContext.h" Index: lib/ReaderWriter/ELF/Makefile =================================================================== --- lib/ReaderWriter/ELF/Makefile +++ lib/ReaderWriter/ELF/Makefile @@ -9,10 +9,7 @@ LLD_LEVEL := ../../.. LIBRARYNAME := lldELF -USEDLIBS = lldHexagonELFTarget.a lldPPCELFTarget.a lldMipsELFTarget.a \ - lldX86ELFTarget.a lldX86_64ELFTarget.a lldAArch64ELFTarget.a \ - lldARMELFTarget.a \ - lldReaderWriter.a lldPasses.a +USEDLIBS = lldPasses.a CPP.Flags += -I$(PROJ_SRC_DIR)/$(LLD_LEVEL)/lib/ReaderWriter/ELF Index: lib/ReaderWriter/ELF/Mips/CMakeLists.txt =================================================================== --- lib/ReaderWriter/ELF/Mips/CMakeLists.txt +++ lib/ReaderWriter/ELF/Mips/CMakeLists.txt @@ -7,5 +7,7 @@ MipsTargetHandler.cpp LINK_LIBS lldCore + lldELF + LLVMObject LLVMSupport ) Index: lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h =================================================================== --- lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h +++ lib/ReaderWriter/ELF/Mips/MipsLinkingContext.h @@ -39,6 +39,7 @@ class MipsLinkingContext final : public ELFLinkingContext { public: + static std::unique_ptr create(llvm::Triple); MipsLinkingContext(llvm::Triple triple); uint32_t getMergedELFFlags() const; Index: lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp =================================================================== --- lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp +++ lib/ReaderWriter/ELF/Mips/MipsLinkingContext.cpp @@ -16,6 +16,15 @@ using namespace lld; using namespace lld::elf; +std::unique_ptr +MipsLinkingContext::create(llvm::Triple triple) { + if (triple.getArch() == llvm::Triple::mipsel) + return std::unique_ptr( + new MipsLinkingContext(triple)); + + return nullptr; +} + MipsLinkingContext::MipsLinkingContext(llvm::Triple triple) : ELFLinkingContext(triple, std::unique_ptr( new MipsTargetHandler(*this))) {} Index: lib/ReaderWriter/ELF/Mips/MipsTarget.h =================================================================== --- lib/ReaderWriter/ELF/Mips/MipsTarget.h +++ /dev/null @@ -1,10 +0,0 @@ -//===- lib/ReaderWriter/ELF/Mips/MipsTarget.h -----------------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "MipsLinkingContext.h" Index: lib/ReaderWriter/ELF/PPC/CMakeLists.txt =================================================================== --- lib/ReaderWriter/ELF/PPC/CMakeLists.txt +++ lib/ReaderWriter/ELF/PPC/CMakeLists.txt @@ -3,5 +3,7 @@ PPCTargetHandler.cpp LINK_LIBS lldCore + lldELF + LLVMObject LLVMSupport ) Index: lib/ReaderWriter/ELF/PPC/PPCLinkingContext.h =================================================================== --- lib/ReaderWriter/ELF/PPC/PPCLinkingContext.h +++ lib/ReaderWriter/ELF/PPC/PPCLinkingContext.h @@ -10,7 +10,6 @@ #ifndef LLD_READER_WRITER_ELF_PPC_PPC_LINKING_CONTEXT_H #define LLD_READER_WRITER_ELF_PPC_PPC_LINKING_CONTEXT_H -#include "PPCTargetHandler.h" #include "lld/ReaderWriter/ELFLinkingContext.h" #include "llvm/Object/ELF.h" #include "llvm/Support/ELF.h" @@ -20,9 +19,8 @@ class PPCLinkingContext final : public ELFLinkingContext { public: - PPCLinkingContext(llvm::Triple triple) - : ELFLinkingContext(triple, std::unique_ptr( - new PPCTargetHandler(*this))) {} + static std::unique_ptr create(llvm::Triple); + PPCLinkingContext(llvm::Triple triple); /// \brief PPC has no relative relocations defined bool isRelativeReloc(const Reference &) const override { return false; } Index: lib/ReaderWriter/ELF/PPC/PPCLinkingContext.cpp =================================================================== --- lib/ReaderWriter/ELF/PPC/PPCLinkingContext.cpp +++ lib/ReaderWriter/ELF/PPC/PPCLinkingContext.cpp @@ -8,9 +8,23 @@ //===----------------------------------------------------------------------===// #include "PPCLinkingContext.h" +#include "PPCTargetHandler.h" #include "lld/Core/LLVM.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/ErrorOr.h" using namespace lld; +std::unique_ptr +elf::PPCLinkingContext::create(llvm::Triple triple) { + if (triple.getArch() == llvm::Triple::ppc) + return std::unique_ptr( + new elf::PPCLinkingContext(triple)); + + return nullptr; +} + +elf::PPCLinkingContext::PPCLinkingContext(llvm::Triple triple) + : ELFLinkingContext(triple, std::unique_ptr( + new PPCTargetHandler(*this))) {} + Index: lib/ReaderWriter/ELF/PPC/PPCTarget.h =================================================================== --- lib/ReaderWriter/ELF/PPC/PPCTarget.h +++ /dev/null @@ -1,10 +0,0 @@ -//===- lib/ReaderWriter/ELF/PPC/PPCTarget.h -------------------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "PPCLinkingContext.h" Index: lib/ReaderWriter/ELF/Targets.h =================================================================== --- lib/ReaderWriter/ELF/Targets.h +++ /dev/null @@ -1,21 +0,0 @@ -//===- lib/ReaderWriter/ELF/Targets.h -------------------------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef LLD_READER_WRITER_ELF_TARGETS_H -#define LLD_READER_WRITER_ELF_TARGETS_H - -#include "AArch64/AArch64Target.h" -#include "ARM/ARMTarget.h" -#include "Hexagon/HexagonTarget.h" -#include "Mips/MipsTarget.h" -#include "PPC/PPCTarget.h" -#include "X86/X86Target.h" -#include "X86_64/X86_64Target.h" - -#endif Index: lib/ReaderWriter/ELF/X86/CMakeLists.txt =================================================================== --- lib/ReaderWriter/ELF/X86/CMakeLists.txt +++ lib/ReaderWriter/ELF/X86/CMakeLists.txt @@ -4,5 +4,7 @@ X86RelocationHandler.cpp LINK_LIBS lldCore + lldELF + LLVMObject LLVMSupport ) Index: lib/ReaderWriter/ELF/X86/X86LinkingContext.h =================================================================== --- lib/ReaderWriter/ELF/X86/X86LinkingContext.h +++ lib/ReaderWriter/ELF/X86/X86LinkingContext.h @@ -10,7 +10,6 @@ #ifndef LLD_READER_WRITER_ELF_X86_TARGETINFO_H #define LLD_READER_WRITER_ELF_X86_TARGETINFO_H -#include "X86TargetHandler.h" #include "lld/ReaderWriter/ELFLinkingContext.h" #include "llvm/Object/ELF.h" #include "llvm/Support/ELF.h" @@ -19,9 +18,8 @@ namespace elf { class X86LinkingContext final : public ELFLinkingContext { public: - X86LinkingContext(llvm::Triple triple) - : ELFLinkingContext(triple, std::unique_ptr( - new X86TargetHandler(*this))) {} + static std::unique_ptr create(llvm::Triple); + X86LinkingContext(llvm::Triple); /// \brief X86 has only two relative relocation /// a) for supporting IFUNC relocs - R_386_IRELATIVE Index: lib/ReaderWriter/ELF/X86/X86LinkingContext.cpp =================================================================== --- lib/ReaderWriter/ELF/X86/X86LinkingContext.cpp +++ lib/ReaderWriter/ELF/X86/X86LinkingContext.cpp @@ -8,9 +8,22 @@ //===----------------------------------------------------------------------===// #include "X86LinkingContext.h" +#include "X86TargetHandler.h" #include "lld/Core/LLVM.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/ErrorOr.h" using namespace lld; +std::unique_ptr +elf::X86LinkingContext::create(llvm::Triple triple) { + if (triple.getArch() == llvm::Triple::x86) + return std::unique_ptr( + new elf::X86LinkingContext(triple)); + + return nullptr; +} + +elf::X86LinkingContext::X86LinkingContext(llvm::Triple triple) + : ELFLinkingContext(triple, std::unique_ptr( + new X86TargetHandler(*this))) {} Index: lib/ReaderWriter/ELF/X86/X86Target.h =================================================================== --- lib/ReaderWriter/ELF/X86/X86Target.h +++ /dev/null @@ -1,10 +0,0 @@ -//===- lib/ReaderWriter/ELF/X86/X86Target.h -------------------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "X86LinkingContext.h" Index: lib/ReaderWriter/ELF/X86_64/CMakeLists.txt =================================================================== --- lib/ReaderWriter/ELF/X86_64/CMakeLists.txt +++ lib/ReaderWriter/ELF/X86_64/CMakeLists.txt @@ -5,5 +5,7 @@ X86_64RelocationPass.cpp LINK_LIBS lldCore + lldELF + LLVMObject LLVMSupport ) Index: lib/ReaderWriter/ELF/X86_64/X86_64DynamicLibraryWriter.h =================================================================== --- lib/ReaderWriter/ELF/X86_64/X86_64DynamicLibraryWriter.h +++ lib/ReaderWriter/ELF/X86_64/X86_64DynamicLibraryWriter.h @@ -11,6 +11,7 @@ #include "DynamicLibraryWriter.h" #include "X86_64LinkingContext.h" +#include "X86_64TargetHandler.h" namespace lld { namespace elf { Index: lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.h =================================================================== --- lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.h +++ lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.h @@ -10,7 +10,6 @@ #ifndef LLD_READER_WRITER_ELF_X86_64_X86_64_LINKING_CONTEXT_H #define LLD_READER_WRITER_ELF_X86_64_X86_64_LINKING_CONTEXT_H -#include "X86_64TargetHandler.h" #include "lld/ReaderWriter/ELFLinkingContext.h" #include "llvm/Object/ELF.h" #include "llvm/Support/ELF.h" @@ -27,9 +26,8 @@ class X86_64LinkingContext final : public ELFLinkingContext { public: - X86_64LinkingContext(llvm::Triple triple) - : ELFLinkingContext(triple, std::unique_ptr( - new X86_64TargetHandler(*this))) {} + static std::unique_ptr create(llvm::Triple); + X86_64LinkingContext(llvm::Triple); void addPasses(PassManager &) override; Index: lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp =================================================================== --- lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp +++ lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp @@ -8,10 +8,24 @@ //===----------------------------------------------------------------------===// #include "X86_64LinkingContext.h" +#include "X86_64TargetHandler.h" #include "X86_64RelocationPass.h" using namespace lld; +std::unique_ptr +elf::X86_64LinkingContext::create(llvm::Triple triple) { + if (triple.getArch() == llvm::Triple::x86_64) + return std::unique_ptr( + new elf::X86_64LinkingContext(triple)); + + return nullptr; +} + +elf::X86_64LinkingContext::X86_64LinkingContext(llvm::Triple triple) + : ELFLinkingContext(triple, std::unique_ptr( + new X86_64TargetHandler(*this))) {} + void elf::X86_64LinkingContext::addPasses(PassManager &pm) { auto pass = createX86_64RelocationPass(*this); if (pass) Index: lib/ReaderWriter/ELF/X86_64/X86_64Target.h =================================================================== --- lib/ReaderWriter/ELF/X86_64/X86_64Target.h +++ /dev/null @@ -1,10 +0,0 @@ -//===- lib/ReaderWriter/ELF/X86_64/X86_64Target.h -------------------------===// -// -// The LLVM Linker -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "X86_64LinkingContext.h" Index: lib/ReaderWriter/MachO/CMakeLists.txt =================================================================== --- lib/ReaderWriter/MachO/CMakeLists.txt +++ lib/ReaderWriter/MachO/CMakeLists.txt @@ -16,8 +16,10 @@ StubsPass.cpp WriterMachO.cpp LINK_LIBS - lldReaderWriter + lldCore lldPasses + lldYAML + LLVMObject LLVMSupport ) Index: lib/ReaderWriter/MachO/Makefile =================================================================== --- lib/ReaderWriter/MachO/Makefile +++ lib/ReaderWriter/MachO/Makefile @@ -9,6 +9,6 @@ LLD_LEVEL := ../../.. LIBRARYNAME := lldMachO -USEDLIBS = lldReaderWriter.a lldCore.a +USEDLIBS = lldCore.a include $(LLD_LEVEL)/Makefile Index: lib/ReaderWriter/PECOFF/CMakeLists.txt =================================================================== --- lib/ReaderWriter/PECOFF/CMakeLists.txt +++ lib/ReaderWriter/PECOFF/CMakeLists.txt @@ -10,7 +10,8 @@ WriterImportLibrary.cpp WriterPECOFF.cpp LINK_LIBS - lldReaderWriter + lldCore + lldPasses LLVMObject LLVMSupport ) Index: lib/ReaderWriter/PECOFF/Makefile =================================================================== --- lib/ReaderWriter/PECOFF/Makefile +++ lib/ReaderWriter/PECOFF/Makefile @@ -9,6 +9,6 @@ LLD_LEVEL := ../../.. LIBRARYNAME := lldPECOFF -USEDLIBS = lldReaderWriter.a lldCore.a +USEDLIBS = lldCore.a include $(LLD_LEVEL)/Makefile