From 8517679a0aac8bc07793b6781d2249b71dc23daf Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Tue, 19 Jul 2016 17:53:38 +0800 Subject: sys-devel/llvm: musl & default runtime lib switches, #589352 - add support for building llvm against musl - enable clang to build binaries against musl - introduce USE flag "sanitize" to control the building of compiler-rt's sanitizers (they cause problem on musl) - be able to override default values of -stdlib and -rtlib for clang * USE="default-libcxx" implies -stdlib=libc++ (originally libstdc++) * USE="default-compiler-rt" implies -rtlib=compiler-rt (originally libgcc) --- profiles/package.mask | 6 + sys-devel/llvm/files/clang-3.8-default-libs.patch | 106 ++++ sys-devel/llvm/files/clang-3.8-musl-support.patch | 108 +++++ sys-devel/llvm/files/llvm-3.8-musl-fixes.patch | 33 ++ sys-devel/llvm/files/llvm-3.8-musl-support.patch | 164 +++++++ sys-devel/llvm/llvm-3.8.1-r1.ebuild | 560 ++++++++++++++++++++++ sys-devel/llvm/metadata.xml | 3 + 7 files changed, 980 insertions(+) create mode 100644 sys-devel/llvm/files/clang-3.8-default-libs.patch create mode 100644 sys-devel/llvm/files/clang-3.8-musl-support.patch create mode 100644 sys-devel/llvm/files/llvm-3.8-musl-fixes.patch create mode 100644 sys-devel/llvm/files/llvm-3.8-musl-support.patch create mode 100644 sys-devel/llvm/llvm-3.8.1-r1.ebuild diff --git a/profiles/package.mask b/profiles/package.mask index a66b5ae78db2..3fe3d3743f27 100644 --- a/profiles/package.mask +++ b/profiles/package.mask @@ -30,6 +30,12 @@ #--- END OF EXAMPLES --- +# Michał Górny (1 Aug 2016) +# Masked for testing, handling keywords and collecting more changes +# before unleashing the huge rebuild on all users. Has gotten musl +# support and switches to control the default rtlib and C++ library. +=sys-devel/llvm-3.8.1-r1 + # Johannes Huber (1 Aug 2016) # Masked for removal in 30 days. Dead by upstream. Last release # with 15.08. Exported to kde-sunset overlay. diff --git a/sys-devel/llvm/files/clang-3.8-default-libs.patch b/sys-devel/llvm/files/clang-3.8-default-libs.patch new file mode 100644 index 000000000000..8d172f746895 --- /dev/null +++ b/sys-devel/llvm/files/clang-3.8-default-libs.patch @@ -0,0 +1,106 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index ad2ac42..18dcfbe 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -196,6 +196,24 @@ set(GCC_INSTALL_PREFIX "" CACHE PATH "Directory where gcc is installed." ) + set(DEFAULT_SYSROOT "" CACHE PATH + "Default to all compiler invocations for --sysroot=." ) + ++set(CLANG_DEFAULT_CXX_STDLIB "" CACHE STRING ++ "Default C++ stdlib to use (libstdc++ or libc++)") ++if (NOT(CLANG_DEFAULT_CXX_STDLIB STREQUAL "" OR ++ CLANG_DEFAULT_CXX_STDLIB STREQUAL "libstdc++" OR ++ CLANG_DEFAULT_CXX_STDLIB STREQUAL "libc++")) ++ message(WARNING "Resetting default C++ stdlib to use platform default") ++ set(CLANG_DEFAULT_CXX_STDLIB "") ++endif() ++ ++set(CLANG_DEFAULT_RTLIB "" CACHE STRING ++ "Default runtime library to use (libgcc or compiler-rt)") ++if (NOT(CLANG_DEFAULT_RTLIB STREQUAL "" OR ++ CLANG_DEFAULT_RTLIB STREQUAL "libgcc" OR ++ CLANG_DEFAULT_RTLIB STREQUAL "compiler-rt")) ++ message(WARNING "Resetting default rtlib to use platform default") ++ set(CLANG_DEFAULT_RTLIB "") ++endif() ++ + set(CLANG_DEFAULT_OPENMP_RUNTIME "libomp" CACHE STRING + "Default OpenMP runtime used by -fopenmp.") + +diff --git a/include/clang/Config/config.h.cmake b/include/clang/Config/config.h.cmake +index b7486f3..eb8aa27 100644 +--- a/include/clang/Config/config.h.cmake ++++ b/include/clang/Config/config.h.cmake +@@ -8,6 +8,12 @@ + /* Bug report URL. */ + #define BUG_REPORT_URL "${BUG_REPORT_URL}" + ++/* Default C++ stdlib to use. */ ++#define CLANG_DEFAULT_CXX_STDLIB "${CLANG_DEFAULT_CXX_STDLIB}" ++ ++/* Default runtime library to use. */ ++#define CLANG_DEFAULT_RTLIB "${CLANG_DEFAULT_RTLIB}" ++ + /* Default OpenMP runtime used by -fopenmp. */ + #define CLANG_DEFAULT_OPENMP_RUNTIME "${CLANG_DEFAULT_OPENMP_RUNTIME}" + +diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp +index cbbd485..3af7f8a 100644 +--- a/lib/Driver/ToolChain.cpp ++++ b/lib/Driver/ToolChain.cpp +@@ -9,6 +9,7 @@ + + #include "Tools.h" + #include "clang/Basic/ObjCRuntime.h" ++#include "clang/Config/config.h" + #include "clang/Driver/Action.h" + #include "clang/Driver/Driver.h" + #include "clang/Driver/DriverDiagnostic.h" +@@ -520,29 +521,29 @@ void ToolChain::addProfileRTLibs(const llvm::opt::ArgList &Args, + + ToolChain::RuntimeLibType ToolChain::GetRuntimeLibType( + const ArgList &Args) const { +- if (Arg *A = Args.getLastArg(options::OPT_rtlib_EQ)) { +- StringRef Value = A->getValue(); +- if (Value == "compiler-rt") +- return ToolChain::RLT_CompilerRT; +- if (Value == "libgcc") +- return ToolChain::RLT_Libgcc; +- getDriver().Diag(diag::err_drv_invalid_rtlib_name) +- << A->getAsString(Args); +- } ++ const Arg* A = Args.getLastArg(options::OPT_rtlib_EQ); ++ StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_RTLIB; ++ ++ if (LibName == "compiler-rt") ++ return ToolChain::RLT_CompilerRT; ++ if (LibName == "libgcc") ++ return ToolChain::RLT_Libgcc; ++ if (A) ++ getDriver().Diag(diag::err_drv_invalid_rtlib_name) << A->getAsString(Args); + + return GetDefaultRuntimeLibType(); + } + + ToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{ +- if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) { +- StringRef Value = A->getValue(); +- if (Value == "libc++") +- return ToolChain::CST_Libcxx; +- if (Value == "libstdc++") +- return ToolChain::CST_Libstdcxx; +- getDriver().Diag(diag::err_drv_invalid_stdlib_name) +- << A->getAsString(Args); +- } ++ const Arg* A = Args.getLastArg(options::OPT_stdlib_EQ); ++ StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_CXX_STDLIB; ++ ++ if (LibName == "libc++") ++ return ToolChain::CST_Libcxx; ++ if (LibName == "libstdc++") ++ return ToolChain::CST_Libstdcxx; ++ if (A) ++ getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args); + + return ToolChain::CST_Libstdcxx; + } diff --git a/sys-devel/llvm/files/clang-3.8-musl-support.patch b/sys-devel/llvm/files/clang-3.8-musl-support.patch new file mode 100644 index 000000000000..8a234e6277ab --- /dev/null +++ b/sys-devel/llvm/files/clang-3.8-musl-support.patch @@ -0,0 +1,108 @@ +diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp +index 9c6eaff..92872ab 100644 +--- a/lib/Basic/Targets.cpp ++++ b/lib/Basic/Targets.cpp +@@ -4513,6 +4513,8 @@ public: + case llvm::Triple::Android: + case llvm::Triple::GNUEABI: + case llvm::Triple::GNUEABIHF: ++ case llvm::Triple::MuslEABI: ++ case llvm::Triple::MuslEABIHF: + setABI("aapcs-linux"); + break; + case llvm::Triple::EABIHF: +diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp +index 04edc0c..298b2cc 100644 +--- a/lib/CodeGen/TargetInfo.cpp ++++ b/lib/CodeGen/TargetInfo.cpp +@@ -4811,6 +4811,8 @@ public: + case llvm::Triple::EABIHF: + case llvm::Triple::GNUEABI: + case llvm::Triple::GNUEABIHF: ++ case llvm::Triple::MuslEABI: ++ case llvm::Triple::MuslEABIHF: + return true; + default: + return false; +@@ -4821,6 +4823,7 @@ public: + switch (getTarget().getTriple().getEnvironment()) { + case llvm::Triple::EABIHF: + case llvm::Triple::GNUEABIHF: ++ case llvm::Triple::MuslEABIHF: + return true; + default: + return false; +@@ -7548,7 +7551,8 @@ const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() { + Kind = ARMABIInfo::AAPCS16_VFP; + else if (CodeGenOpts.FloatABI == "hard" || + (CodeGenOpts.FloatABI != "soft" && +- Triple.getEnvironment() == llvm::Triple::GNUEABIHF)) ++ (Triple.getEnvironment() == llvm::Triple::GNUEABIHF || ++ Triple.getEnvironment() == llvm::Triple::MuslEABIHF))) + Kind = ARMABIInfo::AAPCS_VFP; + + return *(TheTargetCodeGenInfo = new ARMTargetCodeGenInfo(Types, Kind)); +diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp +index b7ac24f..2a529fb 100644 +--- a/lib/Driver/Tools.cpp ++++ b/lib/Driver/Tools.cpp +@@ -724,13 +724,19 @@ arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) { + default: + switch (Triple.getEnvironment()) { + case llvm::Triple::GNUEABIHF: ++ case llvm::Triple::MuslEABIHF: + case llvm::Triple::EABIHF: + ABI = FloatABI::Hard; + break; + case llvm::Triple::GNUEABI: ++ case llvm::Triple::MuslEABI: + case llvm::Triple::EABI: + // EABI is always AAPCS, and if it was not marked 'hard', it's softfp +- ABI = FloatABI::SoftFP; ++ // ++ // Also consider triples like armv7a-hardfloat-linux-eabi, where 'hard' ++ // is marked in the vender field. ++ ABI = (Triple.getVendorName() == "hardfloat") ? ++ FloatABI::Hard : FloatABI::SoftFP; + break; + case llvm::Triple::Android: + ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft; +@@ -968,6 +974,8 @@ void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args, + case llvm::Triple::Android: + case llvm::Triple::GNUEABI: + case llvm::Triple::GNUEABIHF: ++ case llvm::Triple::MuslEABI: ++ case llvm::Triple::MuslEABIHF: + ABIName = "aapcs-linux"; + break; + case llvm::Triple::EABIHF: +@@ -8632,6 +8640,29 @@ static std::string getLinuxDynamicLinker(const ArgList &Args, + return "/system/bin/linker64"; + else + return "/system/bin/linker"; ++ } else if (ToolChain.getTriple().isMusl()) { ++ std::string ArchName; ++ bool IsArm = false; ++ switch (Arch) { ++ case llvm::Triple::arm: ++ case llvm::Triple::thumb: ++ ArchName = "arm"; ++ IsArm = true; ++ break; ++ case llvm::Triple::armeb: ++ case llvm::Triple::thumbeb: ++ ArchName = "armeb"; ++ IsArm = true; ++ break; ++ default: ++ ArchName = ToolChain.getTriple().getArchName().str(); ++ } ++ if (IsArm && ++ (ToolChain.getTriple().getEnvironment() == llvm::Triple::MuslEABIHF || ++ arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)) ++ ArchName += "hf"; ++ ++ return "/lib/ld-musl-" + ArchName + ".so.1"; + } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc || + Arch == llvm::Triple::sparcel) + return "/lib/ld-linux.so.2"; diff --git a/sys-devel/llvm/files/llvm-3.8-musl-fixes.patch b/sys-devel/llvm/files/llvm-3.8-musl-fixes.patch new file mode 100644 index 000000000000..5c516534abc1 --- /dev/null +++ b/sys-devel/llvm/files/llvm-3.8-musl-fixes.patch @@ -0,0 +1,33 @@ +diff --git a/include/llvm/Analysis/TargetLibraryInfo.def b/include/llvm/Analysis/TargetLibraryInfo.def +index 7798e3c..ade2b96 100644 +--- a/include/llvm/Analysis/TargetLibraryInfo.def ++++ b/include/llvm/Analysis/TargetLibraryInfo.def +@@ -27,6 +27,15 @@ + #define TLI_DEFINE_STRING_INTERNAL(string_repr) string_repr, + #endif + ++// avoid name conflicts with musl-libc ++#undef fopen64 ++#undef fseeko64 ++#undef ftello64 ++#undef fstat64 ++#undef lstat64 ++#undef stat64 ++#undef tmpfile64 ++ + /// void *new(unsigned int); + TLI_DEFINE_ENUM_INTERNAL(msvc_new_int) + TLI_DEFINE_STRING_INTERNAL("??2@YAPAXI@Z") +diff --git a/lib/Support/DynamicLibrary.cpp b/lib/Support/DynamicLibrary.cpp +index 9a7aeb5..e98ad80 100644 +--- a/lib/Support/DynamicLibrary.cpp ++++ b/lib/Support/DynamicLibrary.cpp +@@ -143,7 +143,7 @@ void* DynamicLibrary::SearchForAddressOfSymbol(const char *symbolName) { + // On linux we have a weird situation. The stderr/out/in symbols are both + // macros and global variables because of standards requirements. So, we + // boldly use the EXPLICIT_SYMBOL macro without checking for a #define first. +-#if defined(__linux__) and !defined(__ANDROID__) ++#if defined(__linux__) && defined(__GLIBC__) + { + EXPLICIT_SYMBOL(stderr); + EXPLICIT_SYMBOL(stdout); diff --git a/sys-devel/llvm/files/llvm-3.8-musl-support.patch b/sys-devel/llvm/files/llvm-3.8-musl-support.patch new file mode 100644 index 000000000000..8de660d01cf8 --- /dev/null +++ b/sys-devel/llvm/files/llvm-3.8-musl-support.patch @@ -0,0 +1,164 @@ +diff --git a/include/llvm/ADT/Triple.h b/include/llvm/ADT/Triple.h +index e01db0a..bf9361a 100644 +--- a/include/llvm/ADT/Triple.h ++++ b/include/llvm/ADT/Triple.h +@@ -173,6 +173,9 @@ public: + EABI, + EABIHF, + Android, ++ Musl, ++ MuslEABI, ++ MuslEABIHF, + + MSVC, + Itanium, +@@ -544,6 +547,13 @@ public: + /// Tests whether the target is Android + bool isAndroid() const { return getEnvironment() == Triple::Android; } + ++ /// Tests whether the environment is musl-libc ++ bool isMusl() const { ++ return getEnvironment() == Triple::Musl || ++ getEnvironment() == Triple::MuslEABI || ++ getEnvironment() == Triple::MuslEABIHF; ++ } ++ + /// @} + /// @name Mutators + /// @{ +diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp +index 11afcf7..ad9cffd 100644 +--- a/lib/Support/Triple.cpp ++++ b/lib/Support/Triple.cpp +@@ -200,6 +200,9 @@ const char *Triple::getEnvironmentTypeName(EnvironmentType Kind) { + case EABI: return "eabi"; + case EABIHF: return "eabihf"; + case Android: return "android"; ++ case Musl: return "musl"; ++ case MuslEABI: return "musleabi"; ++ case MuslEABIHF: return "musleabihf"; + case MSVC: return "msvc"; + case Itanium: return "itanium"; + case Cygnus: return "cygnus"; +@@ -454,6 +457,9 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) { + .StartsWith("code16", Triple::CODE16) + .StartsWith("gnu", Triple::GNU) + .StartsWith("android", Triple::Android) ++ .StartsWith("musleabihf", Triple::MuslEABIHF) ++ .StartsWith("musleabi", Triple::MuslEABI) ++ .StartsWith("musl", Triple::Musl) + .StartsWith("msvc", Triple::MSVC) + .StartsWith("itanium", Triple::Itanium) + .StartsWith("cygnus", Triple::Cygnus) +@@ -1431,6 +1437,7 @@ StringRef Triple::getARMCPUForArch(StringRef MArch) const { + switch (getEnvironment()) { + case llvm::Triple::EABIHF: + case llvm::Triple::GNUEABIHF: ++ case llvm::Triple::MuslEABIHF: + return "arm1176jzf-s"; + default: + return "arm7tdmi"; +diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp +index f3813c8..45e8c4a 100644 +--- a/lib/Target/ARM/ARMAsmPrinter.cpp ++++ b/lib/Target/ARM/ARMAsmPrinter.cpp +@@ -541,7 +541,8 @@ void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) { + ARMTargetStreamer &ATS = static_cast(TS); + + if (OptimizationGoals > 0 && +- (Subtarget->isTargetAEABI() || Subtarget->isTargetGNUAEABI())) ++ (Subtarget->isTargetAEABI() || Subtarget->isTargetGNUAEABI() || ++ Subtarget->isTargetMuslAEABI())) + ATS.emitAttribute(ARMBuildAttrs::ABI_optimization_goals, OptimizationGoals); + OptimizationGoals = -1; + +diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp +index a2daa89..3b2c0bb 100644 +--- a/lib/Target/ARM/ARMISelLowering.cpp ++++ b/lib/Target/ARM/ARMISelLowering.cpp +@@ -254,7 +254,7 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM, + // RTLIB + if (Subtarget->isAAPCS_ABI() && + (Subtarget->isTargetAEABI() || Subtarget->isTargetGNUAEABI() || +- Subtarget->isTargetAndroid())) { ++ Subtarget->isTargetMuslAEABI() || Subtarget->isTargetAndroid())) { + static const struct { + const RTLIB::Libcall Op; + const char * const Name; +@@ -787,7 +787,8 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM, + setOperationAction(ISD::SREM, MVT::i32, Expand); + setOperationAction(ISD::UREM, MVT::i32, Expand); + // Register based DivRem for AEABI (RTABI 4.2) +- if (Subtarget->isTargetAEABI() || Subtarget->isTargetAndroid()) { ++ if (Subtarget->isTargetAEABI() || Subtarget->isTargetAndroid() || ++ Subtarget->isTargetMuslAEABI()) { + setOperationAction(ISD::SREM, MVT::i64, Custom); + setOperationAction(ISD::UREM, MVT::i64, Custom); + +@@ -11651,7 +11652,8 @@ static TargetLowering::ArgListTy getDivRemArgList( + } + + SDValue ARMTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const { +- assert((Subtarget->isTargetAEABI() || Subtarget->isTargetAndroid()) && ++ assert((Subtarget->isTargetAEABI() || Subtarget->isTargetAndroid() || ++ Subtarget->isTargetMuslAEABI()) && + "Register-based DivRem lowering only"); + unsigned Opcode = Op->getOpcode(); + assert((Opcode == ISD::SDIVREM || Opcode == ISD::UDIVREM) && +diff --git a/lib/Target/ARM/ARMSubtarget.h b/lib/Target/ARM/ARMSubtarget.h +index 4d54e57..fa1c516 100644 +--- a/lib/Target/ARM/ARMSubtarget.h ++++ b/lib/Target/ARM/ARMSubtarget.h +@@ -399,14 +399,21 @@ public: + TargetTriple.getEnvironment() == Triple::GNUEABIHF) && + !isTargetDarwin() && !isTargetWindows(); + } ++ bool isTargetMuslAEABI() const { ++ return (TargetTriple.getEnvironment() == Triple::MuslEABI || ++ TargetTriple.getEnvironment() == Triple::MuslEABIHF) && ++ !isTargetDarwin() && !isTargetWindows(); ++ } + + // ARM Targets that support EHABI exception handling standard + // Darwin uses SjLj. Other targets might need more checks. + bool isTargetEHABICompatible() const { + return (TargetTriple.getEnvironment() == Triple::EABI || + TargetTriple.getEnvironment() == Triple::GNUEABI || ++ TargetTriple.getEnvironment() == Triple::MuslEABI || + TargetTriple.getEnvironment() == Triple::EABIHF || + TargetTriple.getEnvironment() == Triple::GNUEABIHF || ++ TargetTriple.getEnvironment() == Triple::MuslEABIHF || + isTargetAndroid()) && + !isTargetDarwin() && !isTargetWindows(); + } +@@ -414,6 +421,7 @@ public: + bool isTargetHardFloat() const { + // FIXME: this is invalid for WindowsCE + return TargetTriple.getEnvironment() == Triple::GNUEABIHF || ++ TargetTriple.getEnvironment() == Triple::MuslEABIHF || + TargetTriple.getEnvironment() == Triple::EABIHF || + isTargetWindows() || isAAPCS16_ABI(); + } +diff --git a/lib/Target/ARM/ARMTargetMachine.cpp b/lib/Target/ARM/ARMTargetMachine.cpp +index fca1901..a96b1f9 100644 +--- a/lib/Target/ARM/ARMTargetMachine.cpp ++++ b/lib/Target/ARM/ARMTargetMachine.cpp +@@ -99,6 +99,8 @@ computeTargetABI(const Triple &TT, StringRef CPU, + case llvm::Triple::Android: + case llvm::Triple::GNUEABI: + case llvm::Triple::GNUEABIHF: ++ case llvm::Triple::MuslEABI: ++ case llvm::Triple::MuslEABIHF: + case llvm::Triple::EABIHF: + case llvm::Triple::EABI: + TargetABI = ARMBaseTargetMachine::ARM_ABI_AAPCS; +@@ -192,7 +194,8 @@ ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T, const Triple &TT, + // Default to triple-appropriate EABI + if (Options.EABIVersion == EABI::Default || + Options.EABIVersion == EABI::Unknown) { +- if (Subtarget.isTargetGNUAEABI()) ++ // musl is compatible with glibc with regard to EABI version ++ if (Subtarget.isTargetGNUAEABI() || Subtarget.isTargetMuslAEABI()) + this->Options.EABIVersion = EABI::GNU; + else + this->Options.EABIVersion = EABI::EABI5; diff --git a/sys-devel/llvm/llvm-3.8.1-r1.ebuild b/sys-devel/llvm/llvm-3.8.1-r1.ebuild new file mode 100644 index 000000000000..60e6d5e4495e --- /dev/null +++ b/sys-devel/llvm/llvm-3.8.1-r1.ebuild @@ -0,0 +1,560 @@ +# Copyright 1999-2016 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +EAPI=6 + +: ${CMAKE_MAKEFILE_GENERATOR:=ninja} +PYTHON_COMPAT=( python2_7 ) + +inherit check-reqs cmake-utils eutils flag-o-matic multilib \ + multilib-minimal python-single-r1 toolchain-funcs pax-utils prefix + +DESCRIPTION="Low Level Virtual Machine" +HOMEPAGE="http://llvm.org/" +SRC_URI="http://llvm.org/releases/${PV}/${P}.src.tar.xz + clang? ( http://llvm.org/releases/${PV}/compiler-rt-${PV}.src.tar.xz + http://llvm.org/releases/${PV}/cfe-${PV}.src.tar.xz + http://llvm.org/releases/${PV}/clang-tools-extra-${PV}.src.tar.xz ) + lldb? ( http://llvm.org/releases/${PV}/lldb-${PV}.src.tar.xz ) + !doc? ( http://dev.gentoo.org/~voyageur/distfiles/${PN}-3.8.0-manpages.tar.bz2 )" + +LICENSE="UoI-NCSA" +SLOT="0/3.8.0" +KEYWORDS="~amd64 ~arm ~arm64 ~ppc ~ppc64 ~sparc ~x86 ~amd64-fbsd ~x86-fbsd ~x64-freebsd ~amd64-linux ~arm-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos" +IUSE="clang debug default-compiler-rt default-libcxx doc gold libedit +libffi + lldb multitarget ncurses ocaml python +sanitize +static-analyzer test xml + video_cards_radeon elibc_musl kernel_Darwin kernel_FreeBSD" + +COMMON_DEPEND=" + sys-libs/zlib:0= + clang? ( + python? ( ${PYTHON_DEPS} ) + static-analyzer? ( + dev-lang/perl:* + ${PYTHON_DEPS} + ) + xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] ) + ) + gold? ( >=sys-devel/binutils-2.22:*[cxx] ) + libedit? ( dev-libs/libedit:0=[${MULTILIB_USEDEP}] ) + libffi? ( >=virtual/libffi-3.0.13-r1:0=[${MULTILIB_USEDEP}] ) + lldb? ( dev-python/six[${PYTHON_USEDEP}] ) + ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[${MULTILIB_USEDEP}] ) + ocaml? ( + >=dev-lang/ocaml-4.00.0:0= + dev-ml/findlib + dev-ml/ocaml-ctypes + !!<=sys-devel/llvm-3.7.0-r1[ocaml] )" +# configparser-3.2 breaks the build (3.3 or none at all are fine) +DEPEND="${COMMON_DEPEND} + dev-lang/perl + >=sys-devel/make-3.81 + >=sys-devel/flex-2.5.4 + >=sys-devel/bison-1.875d + || ( >=sys-devel/gcc-3.0 >=sys-devel/llvm-3.5 + ( >=sys-freebsd/freebsd-lib-9.1-r10 sys-libs/libcxx ) + ) + || ( >=sys-devel/binutils-2.18 >=sys-devel/binutils-apple-5.1 ) + kernel_Darwin? ( /dev/null || die + # be able to specify default values for -stdlib and -rtlib at build time + eapply "${FILESDIR}"/clang-3.8-default-libs.patch + + # enable clang to recognize musl-libc + eapply "${FILESDIR}"/clang-3.8-musl-support.patch + popd >/dev/null || die + + sed -i -e "s^@EPREFIX@^${EPREFIX}^" \ + tools/clang/tools/scan-build/bin/scan-build || die + + # Install clang runtime into /usr/lib/clang + # https://llvm.org/bugs/show_bug.cgi?id=23792 + eapply "${FILESDIR}"/cmake/clang-0001-Install-clang-runtime-into-usr-lib-without-suffix-3.8.patch + eapply "${FILESDIR}"/cmake/compiler-rt-0001-cmake-Install-compiler-rt-into-usr-lib-without-suffi.patch + + # Do not force -march flags on arm platforms + # https://bugs.gentoo.org/show_bug.cgi?id=562706 + eapply "${FILESDIR}"/cmake/${PN}-3.8.0-compiler_rt_arm_march_flags.patch + + # Make it possible to override CLANG_LIBDIR_SUFFIX + # (that is used only to find LLVMgold.so) + # https://llvm.org/bugs/show_bug.cgi?id=23793 + eapply "${FILESDIR}"/cmake/clang-0002-cmake-Make-CLANG_LIBDIR_SUFFIX-overridable.patch + + # Fix git-clang-format shebang, bug #562688 + python_fix_shebang tools/clang/tools/clang-format/git-clang-format + + # Fix 'stdarg.h' file not found on Gentoo/FreeBSD, bug #578064 + # https://llvm.org/bugs/show_bug.cgi?id=26651 + eapply "${FILESDIR}"/clang-3.8-compiler-rt-fbsd.patch + + pushd projects/compiler-rt >/dev/null || die + + # Fix WX sections, bug #421527 + find lib/builtins -type f -name '*.S' -exec sed \ + -e '$a\\n#if defined(__linux__) && defined(__ELF__)\n.section .note.GNU-stack,"",%progbits\n#endif' \ + -i {} + || die + + popd >/dev/null || die + fi + + if use lldb; then + # Do not install dummy readline.so module from + # https://llvm.org/bugs/show_bug.cgi?id=18841 + sed -e 's/add_subdirectory(readline)/#&/' \ + -i tools/lldb/scripts/Python/modules/CMakeLists.txt || die + # Do not install bundled six module + eapply "${FILESDIR}"/${PN}-3.8-lldb_six.patch + fi + + # User patches + eapply_user + + # Native libdir is used to hold LLVMgold.so + NATIVE_LIBDIR=$(get_libdir) +} + +multilib_src_configure() { + local targets + if use multitarget; then + targets=all + else + targets='host;BPF;CppBackend' + use video_cards_radeon && targets+=';AMDGPU' + fi + + local ffi_cflags ffi_ldflags + if use libffi; then + ffi_cflags=$(pkg-config --cflags-only-I libffi) + ffi_ldflags=$(pkg-config --libs-only-L libffi) + fi + + local libdir=$(get_libdir) + local mycmakeargs=( + -DLLVM_LIBDIR_SUFFIX=${libdir#lib} + + -DBUILD_SHARED_LIBS=ON + -DLLVM_ENABLE_TIMESTAMPS=OFF + -DLLVM_TARGETS_TO_BUILD="${targets}" + -DLLVM_BUILD_TESTS=$(usex test) + + -DLLVM_ENABLE_FFI=$(usex libffi) + -DLLVM_ENABLE_TERMINFO=$(usex ncurses) + -DLLVM_ENABLE_ASSERTIONS=$(usex debug) + -DLLVM_ENABLE_EH=ON + -DLLVM_ENABLE_RTTI=ON + + -DWITH_POLLY=OFF # TODO + + -DLLVM_HOST_TRIPLE="${CHOST}" + + -DFFI_INCLUDE_DIR="${ffi_cflags#-I}" + -DFFI_LIBRARY_DIR="${ffi_ldflags#-L}" + + -DHAVE_HISTEDIT_H=$(usex libedit) + ) + + if use clang; then + mycmakeargs+=( + -DCMAKE_DISABLE_FIND_PACKAGE_LibXml2=$(usex !xml) + # libgomp support fails to find headers without explicit -I + # furthermore, it provides only syntax checking + -DCLANG_DEFAULT_OPENMP_RUNTIME=libomp + + # override default stdlib and rtlib + -DCLANG_DEFAULT_CXX_STDLIB=$(usex default-libcxx libc++ "") + -DCLANG_DEFAULT_RTLIB=$(usex default-compiler-rt compiler-rt "") + + # compiler-rt's test cases depend on sanitizer + -DCOMPILER_RT_BUILD_SANITIZERS=$(usex sanitize) + -DCOMPILER_RT_INCLUDE_TESTS=$(usex sanitize) + ) + fi + + if use lldb; then + mycmakeargs+=( + -DLLDB_DISABLE_LIBEDIT=$(usex !libedit) + -DLLDB_DISABLE_CURSES=$(usex !ncurses) + -DLLDB_ENABLE_TERMINFO=$(usex ncurses) + ) + fi + + if ! multilib_is_native_abi || ! use ocaml; then + mycmakeargs+=( + -DOCAMLFIND=NO + ) + fi +# Note: go bindings have no CMake rules at the moment +# but let's kill the check in case they are introduced +# if ! multilib_is_native_abi || ! use go; then + mycmakeargs+=( + -DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND + ) +# fi + + if multilib_is_native_abi; then + mycmakeargs+=( + -DLLVM_BUILD_DOCS=$(usex doc) + -DLLVM_ENABLE_SPHINX=$(usex doc) + -DLLVM_ENABLE_DOXYGEN=OFF + -DLLVM_INSTALL_HTML="${EPREFIX}/usr/share/doc/${PF}/html" + -DSPHINX_WARNINGS_AS_ERRORS=OFF + -DLLVM_INSTALL_UTILS=ON + ) + + if use clang; then + mycmakeargs+=( + -DCLANG_INSTALL_HTML="${EPREFIX}/usr/share/doc/${PF}/clang" + ) + fi + + if use gold; then + mycmakeargs+=( + -DLLVM_BINUTILS_INCDIR="${EPREFIX}"/usr/include + ) + fi + + if use lldb; then + mycmakeargs+=( + -DLLDB_DISABLE_PYTHON=$(usex !python) + ) + fi + + else + if use clang; then + mycmakeargs+=( + # disable compiler-rt on non-native ABI because: + # 1. it fails to configure because of -m32 + # 2. it is shared between ABIs so no point building + # it multiple times + -DLLVM_EXTERNAL_COMPILER_RT_BUILD=OFF + -DLLVM_EXTERNAL_CLANG_TOOLS_EXTRA_BUILD=OFF + ) + fi + if use lldb; then + mycmakeargs+=( + # only run swig on native abi + -DLLDB_DISABLE_PYTHON=ON + ) + fi + fi + + if use clang; then + mycmakeargs+=( + -DCLANG_ENABLE_ARCMT=$(usex static-analyzer) + -DCLANG_ENABLE_STATIC_ANALYZER=$(usex static-analyzer) + -DCLANG_LIBDIR_SUFFIX="${NATIVE_LIBDIR#lib}" + ) + + # -- not needed when compiler-rt is built with host compiler -- + # cmake passes host C*FLAGS to compiler-rt build + # which is performed using clang, so we need to filter out + # some flags clang does not support + # (if you know some more flags that don't work, let us know) + #filter-flags -msahf -frecord-gcc-switches + fi + + if tc-is-cross-compiler; then + [[ -x "/usr/bin/llvm-tblgen" ]] \ + || die "/usr/bin/llvm-tblgen not found or usable" + mycmakeargs+=( + -DCMAKE_CROSSCOMPILING=ON + -DLLVM_TABLEGEN=/usr/bin/llvm-tblgen + ) + + if use clang; then + [[ -x "/usr/bin/clang-tblgen" ]] \ + || die "/usr/bin/clang-tblgen not found or usable" + mycmakeargs+=( + -DCLANG_TABLEGEN=/usr/bin/clang-tblgen + ) + fi + fi + + cmake-utils_src_configure +} + +multilib_src_compile() { + cmake-utils_src_compile + # TODO: not sure why this target is not correctly called + multilib_is_native_abi && use doc && use ocaml && cmake-utils_src_make docs/ocaml_doc + + pax-mark m "${BUILD_DIR}"/bin/llvm-rtdyld + pax-mark m "${BUILD_DIR}"/bin/lli + pax-mark m "${BUILD_DIR}"/bin/lli-child-target + + if use test; then + pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/Orc/OrcJITTests + pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/MCJIT/MCJITTests + pax-mark m "${BUILD_DIR}"/unittests/Support/SupportTests + fi +} + +multilib_src_test() { + # respect TMPDIR! + local -x LIT_PRESERVES_TMP=1 + local test_targets=( check ) + # clang tests won't work on non-native ABI because we skip compiler-rt + multilib_is_native_abi && use clang && test_targets+=( check-clang ) + cmake-utils_src_make "${test_targets[@]}" +} + +src_install() { + local MULTILIB_CHOST_TOOLS=( + /usr/bin/llvm-config + ) + + local MULTILIB_WRAPPED_HEADERS=( + /usr/include/llvm/Config/config.h + /usr/include/llvm/Config/llvm-config.h + ) + + if use clang; then + # note: magic applied in multilib_src_install()! + CLANG_VERSION=${PV%.*} + + MULTILIB_CHOST_TOOLS+=( + /usr/bin/clang + /usr/bin/clang++ + /usr/bin/clang-cl + /usr/bin/clang-${CLANG_VERSION} + /usr/bin/clang++-${CLANG_VERSION} + /usr/bin/clang-cl-${CLANG_VERSION} + ) + + MULTILIB_WRAPPED_HEADERS+=( + /usr/include/clang/Config/config.h + ) + fi + + multilib-minimal_src_install + + # Remove unnecessary headers on FreeBSD, bug #417171 + if use kernel_FreeBSD && use clang; then + rm "${ED}"usr/lib/clang/${PV}/include/{std,float,iso,limits,tgmath,varargs}*.h || die + fi +} + +multilib_src_install() { + cmake-utils_src_install + + if multilib_is_native_abi; then + # Install man pages. + use doc || doman "${WORKDIR}"/${PN}-3.8.0-manpages/*.1 + + # Symlink the gold plugin. + if use gold; then + dodir "/usr/${CHOST}/binutils-bin/lib/bfd-plugins" + dosym "../../../../$(get_libdir)/LLVMgold.so" \ + "/usr/${CHOST}/binutils-bin/lib/bfd-plugins/LLVMgold.so" + fi + fi + + # apply CHOST and CLANG_VERSION to clang executables + # they're statically linked so we don't have to worry about the lib + if use clang; then + local clang_tools=( clang clang++ clang-cl ) + local i + + # cmake gives us: + # - clang-X.Y + # - clang -> clang-X.Y + # - clang++, clang-cl -> clang + # we want to have: + # - clang-X.Y + # - clang++-X.Y, clang-cl-X.Y -> clang-X.Y + # - clang, clang++, clang-cl -> clang*-X.Y + # so we need to fix the two tools + for i in "${clang_tools[@]:1}"; do + rm "${ED%/}/usr/bin/${i}" || die + dosym "clang-${CLANG_VERSION}" "/usr/bin/${i}-${CLANG_VERSION}" + dosym "${i}-${CLANG_VERSION}" "/usr/bin/${i}" + done + + # now prepend ${CHOST} and let the multilib-build.eclass symlink it + if ! multilib_is_native_abi; then + # non-native? let's replace it with a simple wrapper + for i in "${clang_tools[@]}"; do + rm "${ED%/}/usr/bin/${i}-${CLANG_VERSION}" || die + cat > "${T}"/wrapper.tmp <<-_EOF_ + #!${EPREFIX}/bin/sh + exec "${i}-${CLANG_VERSION}" $(get_abi_CFLAGS) "\${@}" + _EOF_ + newbin "${T}"/wrapper.tmp "${i}-${CLANG_VERSION}" + done + fi + fi +} + +multilib_src_install_all() { + insinto /usr/share/vim/vimfiles + doins -r utils/vim/*/. + # some users may find it useful + dodoc utils/vim/vimrc + + if use clang; then + pushd tools/clang >/dev/null || die + + if use python ; then + pushd bindings/python/clang >/dev/null || die + + python_moduleinto clang + python_domodule *.py + + popd >/dev/null || die + fi + + # AddressSanitizer symbolizer (currently separate) + dobin "${S}"/projects/compiler-rt/lib/asan/scripts/asan_symbolize.py + + popd >/dev/null || die + + python_fix_shebang "${ED}" + if use static-analyzer; then + python_optimize "${ED}"usr/share/scan-view + fi + fi +} + +pkg_postinst() { + if use clang && ! has_version 'sys-libs/libomp'; then + elog "To enable OpenMP support in clang, install sys-libs/libomp." + fi +} diff --git a/sys-devel/llvm/metadata.xml b/sys-devel/llvm/metadata.xml index 7371a1fe6d06..09156e246672 100644 --- a/sys-devel/llvm/metadata.xml +++ b/sys-devel/llvm/metadata.xml @@ -20,11 +20,14 @@ 4. LLVM does not imply things that you would expect from a high-level virtual machine. It does not require garbage collection or run-time code generation (In fact, LLVM makes a great static compiler!). Note that optional LLVM components can be used to build high-level virtual machines and other systems that need these services. Build the clang C/C++ compiler + Use compiler-rt instead of libgcc as the default rtlib for clang + Use libc++ instead of libstdc++ as the default stdlib for clang Build and install the HTML documentation and regenerate the man pages Build the gold linker plugin Build the lldb debugger Build all host targets (default: host only) Support querying terminal properties using ncurses' terminfo + Build compiler-rt's sanitizers Install the Clang static analyzer (requires USE=clang) -- cgit v1.2.3-65-gdbad