listout created this revision. listout added reviewers: dlj, atanasyan, MaskRay, Bdragon28. Herald added subscribers: StephenFan, pengfei, fedor.sergeev, kristof.beyls. Herald added a project: All. listout requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
>From clang 13.0.0 has a new option -print-multiarch, matching gcc. On linux-musl systems this outputs x86_64-linux-gnu (or aarch64-linux-gnu, etc) instead of x86_64-linux-musl (or aarch64-linux-musl, etc). Amongst other things, this bug breaks compiling python with clang on musl hosts, as the python configure script does a sanity check and notices the output of -print-multiarch is inconsistent with the linux-musl platform triplet it (correctly) deduces for the host by other means. (The configure script errors out with "internal configure error for the platform triplet, please file a bug report" FWIW. This worked okay in clang 12.0.1 because python only checks the multiarch target for consistency if $CC -print-multiarch isn't an error.) The implementation in Linux::getMultiarchTriple() of clang/lib/Driver/ToolChains/Linux.cpp special-cases -linux-android targets, and assumes -linux-gnu for anything else. Credit for this patch goes to arachsys <Chris Webb> Please also reffer: https://bugs.llvm.org/show_bug.cgi?id=52127 and llvm/llvm-project#51469 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D131563 Files: clang/lib/Driver/ToolChains/Linux.cpp
Index: clang/lib/Driver/ToolChains/Linux.cpp =================================================================== --- clang/lib/Driver/ToolChains/Linux.cpp +++ clang/lib/Driver/ToolChains/Linux.cpp @@ -42,7 +42,9 @@ StringRef SysRoot) const { llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment(); - bool IsAndroid = TargetTriple.isAndroid(); + std::string EnvName = TargetTriple.isAndroid() ? "android" + : TargetTriple.isMusl() ? "musl" + : "gnu"; bool IsMipsR6 = TargetTriple.getSubArch() == llvm::Triple::MipsSubArch_r6; bool IsMipsN32Abi = TargetTriple.getEnvironment() == llvm::Triple::GNUABIN32; @@ -58,78 +60,66 @@ // regardless of what the actual target triple is. case llvm::Triple::arm: case llvm::Triple::thumb: - if (IsAndroid) - return "arm-linux-androideabi"; if (TargetEnvironment == llvm::Triple::GNUEABIHF) - return "arm-linux-gnueabihf"; - return "arm-linux-gnueabi"; + return "arm-linux-" + EnvName + "eabihf"; + return "arm-linux-" + EnvName + "eabi"; case llvm::Triple::armeb: case llvm::Triple::thumbeb: if (TargetEnvironment == llvm::Triple::GNUEABIHF) - return "armeb-linux-gnueabihf"; - return "armeb-linux-gnueabi"; + return "armeb-linux-" + EnvName + "eabihf"; + return "armeb-linux-" + EnvName + "eabi"; case llvm::Triple::x86: - if (IsAndroid) - return "i686-linux-android"; - return "i386-linux-gnu"; + return "i386-linux-" + EnvName; case llvm::Triple::x86_64: - if (IsAndroid) - return "x86_64-linux-android"; if (TargetEnvironment == llvm::Triple::GNUX32) - return "x86_64-linux-gnux32"; - return "x86_64-linux-gnu"; + return "x86_64-linux-" + EnvName + "x32"; + return "x86_64-linux-" + EnvName; case llvm::Triple::aarch64: - if (IsAndroid) - return "aarch64-linux-android"; - return "aarch64-linux-gnu"; + return "aarch64-linux-" + EnvName; case llvm::Triple::aarch64_be: - return "aarch64_be-linux-gnu"; + return "aarch64_be-linux-" + EnvName; case llvm::Triple::m68k: - return "m68k-linux-gnu"; + return "m68k-linux-" + EnvName; case llvm::Triple::mips: - return IsMipsR6 ? "mipsisa32r6-linux-gnu" : "mips-linux-gnu"; + return (IsMipsR6 ? "mipsisa32r6-linux-" : "mips-linux-") + EnvName; case llvm::Triple::mipsel: - if (IsAndroid) - return "mipsel-linux-android"; - return IsMipsR6 ? "mipsisa32r6el-linux-gnu" : "mipsel-linux-gnu"; + return (IsMipsR6 ? "mipsisa32r6el-linux-" : "mipsel-linux-") + EnvName; case llvm::Triple::mips64: { std::string MT = std::string(IsMipsR6 ? "mipsisa64r6" : "mips64") + - "-linux-" + (IsMipsN32Abi ? "gnuabin32" : "gnuabi64"); + "-linux-" + EnvName + (IsMipsN32Abi ? "abin32" : "abi64"); if (D.getVFS().exists(SysRoot + "/lib/" + MT)) return MT; - if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu")) - return "mips64-linux-gnu"; + if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-" + EnvName)) + return "mips64-linux-" + EnvName; break; } case llvm::Triple::mips64el: { - if (IsAndroid) - return "mips64el-linux-android"; std::string MT = std::string(IsMipsR6 ? "mipsisa64r6el" : "mips64el") + - "-linux-" + (IsMipsN32Abi ? "gnuabin32" : "gnuabi64"); + "-linux-" + EnvName + (IsMipsN32Abi ? "abin32" : "abi64"); if (D.getVFS().exists(SysRoot + "/lib/" + MT)) return MT; - if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu")) - return "mips64el-linux-gnu"; + if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-" + EnvName)) + return "mips64el-linux-" + EnvName; break; } case llvm::Triple::ppc: - if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe")) - return "powerpc-linux-gnuspe"; - return "powerpc-linux-gnu"; + if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-" + EnvName + "spe")) + return "powerpc-linux-" + EnvName + "spe"; + return "powerpc-linux-" + EnvName; case llvm::Triple::ppcle: - return "powerpcle-linux-gnu"; + return "powerpcle-linux-" + EnvName; case llvm::Triple::ppc64: - return "powerpc64-linux-gnu"; + return "powerpc64-linux-" + EnvName; case llvm::Triple::ppc64le: - return "powerpc64le-linux-gnu"; + return "powerpc64le-linux-" + EnvName; case llvm::Triple::sparc: - return "sparc-linux-gnu"; + return "sparc-linux-" + EnvName; case llvm::Triple::sparcv9: - return "sparc64-linux-gnu"; + return "sparc64-linux-" + EnvName; case llvm::Triple::systemz: - return "s390x-linux-gnu"; + return "s390x-linux-" + EnvName; } return TargetTriple.str(); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits