ro created this revision. ro added a reviewer: MaskRay. ro added a project: clang. Herald added subscribers: fedor.sergeev, mgorny. ro requested review of this revision.
This patch is posted just for reference on top of D84029 <https://reviews.llvm.org/D84029> and D84412 <https://reviews.llvm.org/D84412>. It's a very first attempt to support GNU `ld` on Solaris, which is non-trivial given that both linkers have some options not supported by the other. Currently linker selection is done at `cmake` time; it probably needs to be made runtime-selectable. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D85309 Files: clang/CMakeLists.txt clang/include/clang/Config/config.h.cmake clang/lib/Driver/ToolChains/CommonArgs.cpp clang/lib/Driver/ToolChains/Solaris.cpp clang/lib/Driver/ToolChains/Solaris.h
Index: clang/lib/Driver/ToolChains/Solaris.h =================================================================== --- clang/lib/Driver/ToolChains/Solaris.h +++ clang/lib/Driver/ToolChains/Solaris.h @@ -65,10 +65,7 @@ SanitizerMask getSupportedSanitizers() const override; unsigned GetDefaultDwarfVersion() const override { return 2; } - const char *getDefaultLinker() const override { - // clang currently uses Solaris ld-only options. - return "/usr/bin/ld"; - } + const char *getDefaultLinker() const override; protected: Tool *buildAssembler() const override; Index: clang/lib/Driver/ToolChains/Solaris.cpp =================================================================== --- clang/lib/Driver/ToolChains/Solaris.cpp +++ clang/lib/Driver/ToolChains/Solaris.cpp @@ -53,7 +53,9 @@ ArgStringList CmdArgs; // Demangle C++ names in errors +#if !CLANG_ENABLE_GLD CmdArgs.push_back("-C"); +#endif if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) { CmdArgs.push_back("-e"); @@ -75,6 +77,36 @@ Args.ClaimAllArgs(options::OPT_pthreads); } +#if CLANG_ENABLE_GLD + // FIXME: Correct comment. + // Explicitly set the linker emulation for platforms that might not + // be the default emulation for the linker. + const toolchains::Solaris &ToolChain = + static_cast<const toolchains::Solaris &>(getToolChain()); + const llvm::Triple::ArchType Arch = ToolChain.getArch(); + + switch (Arch) { + case llvm::Triple::x86: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf_i386_sol2"); + break; + case llvm::Triple::x86_64: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf_x86_64_sol2"); + break; + case llvm::Triple::sparc: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf32_sparc_sol2"); + break; + case llvm::Triple::sparcv9: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf64_sparc_sol2"); + break; + default: + break; + } +#endif + if (Output.isFilename()) { CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); @@ -214,6 +246,17 @@ return Res; } +const char *Solaris::getDefaultLinker() const { +#if CLANG_ENABLE_GLD + // FIXME: Hack around /usr/gnu/bin/ld being configure with --with-sysroot. + return "/vol/gcc/bin/gld-2.35"; + //return "/usr/gnu/bin/ld"; +#else + // clang currently uses Solaris ld-only options. + return "/usr/bin/ld"; +#endif +} + Tool *Solaris::buildAssembler() const { return new tools::solaris::Assembler(*this); } Index: clang/lib/Driver/ToolChains/CommonArgs.cpp =================================================================== --- clang/lib/Driver/ToolChains/CommonArgs.cpp +++ clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -615,7 +615,7 @@ StringRef Sanitizer) { // Solaris ld defaults to --export-dynamic behaviour but doesn't support // the option, so don't try to pass it. - if (TC.getTriple().getOS() == llvm::Triple::Solaris) + if (TC.getTriple().getOS() == llvm::Triple::Solaris && !CLANG_ENABLE_GLD) return true; // Myriad is static linking only. Furthermore, some versions of its // linker have the bug where --export-dynamic overrides -static, so @@ -634,7 +634,9 @@ // While the Solaris 11.2 ld added --as-needed/--no-as-needed as aliases // for the native forms -z ignore/-z record, they are missing in Illumos, // so always use the native form. - if (TC.getTriple().isOSSolaris()) + // GNU ld doesn't support -z ignore/-z record, so don't use them even on + // Solaris. + if (TC.getTriple().isOSSolaris() && !CLANG_ENABLE_GLD) return as_needed ? "-zignore" : "-zrecord"; else return as_needed ? "--as-needed" : "--no-as-needed"; Index: clang/include/clang/Config/config.h.cmake =================================================================== --- clang/include/clang/Config/config.h.cmake +++ clang/include/clang/Config/config.h.cmake @@ -11,6 +11,9 @@ /* Default linker to use. */ #define CLANG_DEFAULT_LINKER "${CLANG_DEFAULT_LINKER}" +/* Default to GNU ld. */ +#cmakedefine01 CLANG_ENABLE_GLD + /* Default C/ObjC standard to use. */ #cmakedefine CLANG_DEFAULT_STD_C LangStandard::lang_${CLANG_DEFAULT_STD_C} Index: clang/CMakeLists.txt =================================================================== --- clang/CMakeLists.txt +++ clang/CMakeLists.txt @@ -278,6 +278,8 @@ set(CLANG_DEFAULT_LINKER "" CACHE STRING "Default linker to use (linker name or absolute path, empty for platform default)") +option(CLANG_ENABLE_GLD "Default to GNU ld." OFF) + set(CLANG_DEFAULT_CXX_STDLIB "" CACHE STRING "Default C++ stdlib to use (\"libstdc++\" or \"libc++\", empty for platform default") if (NOT(CLANG_DEFAULT_CXX_STDLIB STREQUAL "" OR
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits