diff --git a/build.sh b/build.sh index d71165f7c988ded447ce1f26f063d9f65a37ac57..b316bb022c094c13388b2210c69a304141e6a057 100755 --- a/build.sh +++ b/build.sh @@ -88,7 +88,7 @@ while getopts :b:ceEhiI:j:orstvfX: optchr; do ;; f) enable_classic_flang="1" - ;; + ;; e) embedded_toolchain="1" ;; @@ -181,6 +181,8 @@ fi if [ $embedded_toolchain == "1" ]; then echo "Build for embedded cross tool chain" enabled_projects="clang;lld;compiler-rt;" + CMAKE_OPTIONS="$CMAKE_OPTIONS \ + -DLLVM_BUILD_FOR_EMBEDDED=ON" fi # When set LLVM_INSTALL_TOOLCHAIN_ONLY to On it removes many of the LLVM development diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index 8c9d0c0a3e73b53122266e76c5bd4081d6189402..42050dced99cf0197efde45923071e601993ef16 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -2280,6 +2280,13 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( Prefixes.push_back("/opt/rh/devtoolset-2/root/usr"); } +#ifdef BUILD_FOR_EMBEDDED + // openEuler embedded nativesdk installs native packages under this path. + if (SysRoot.empty() && TargetTriple.getVendor() == llvm::Triple::OpenEmbedded && + D.getVFS().exists("/opt/buildtools/nativesdk/sysroots")) + Prefixes.push_back("/opt/buildtools/nativesdk/sysroots/" + TargetTriple.getTriple()); +#endif + // Fall back to /usr which is used by most non-Solaris systems. Prefixes.push_back(concat(SysRoot, "/usr")); } @@ -2325,7 +2332,11 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes( static const char *const CSKYTriples[] = { "csky-linux-gnuabiv2", "csky-linux-uclibcabiv2", "csky-elf-noneabiv2"}; +#ifdef BUILD_FOR_EMBEDDED + static const char *const X86_64LibDirs[] = {"/lib64", "/lib", "/usr/lib"}; +#else static const char *const X86_64LibDirs[] = {"/lib64", "/lib"}; +#endif static const char *const X86_64Triples[] = { "x86_64-linux-gnu", "x86_64-unknown-linux-gnu", "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E", diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 7f0714676a9dc2487bedb8ed8777acdb14cbc02f..6ac2efc2283cb0fbab443a1b153f965f8605cd9c 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -394,6 +394,26 @@ std::string Linux::computeSysRoot() const { return std::string(); } +#ifdef BUILD_FOR_EMBEDDED + // openEuler embedded building system needs to search + // more pre-defined paths. + if (GCCInstallation.isValid() && + getTriple().getVendor() == llvm::Triple::OpenEmbedded) { + const StringRef InstallDir = GCCInstallation.getInstallPath(); + const StringRef TripleStr = GCCInstallation.getTriple().str(); + + // openEuler embedded nativesdk's sysroot path could be + // "/opt/buildtools/nativesdk/sysroots/x86_64-openeulersdk-linux/usr/lib/x86_64-openeulersdk-linux/12.3.0/../../../../../x86_64-openeulersdk-linux" + // But (InstallDir + "/../../../../") already satisfies the path, + // we try to check additional "TripleStr" to narrow down the + // scenarios where this path takes effect. + std::string Path = (InstallDir + "/../../../../../" + TripleStr).str(); + + if (getVFS().exists(Path)) + return Path; + } +#endif + if (!GCCInstallation.isValid() || !getTriple().isMIPS()) return std::string(); @@ -590,6 +610,15 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const { LibDir = X32 ? "libx32" : "lib64"; Loader = X32 ? "ld-linux-x32.so.2" : "ld-linux-x86-64.so.2"; + +#ifdef BUILD_FOR_EMBEDDED + bool OE = (Triple.getVendor() == llvm::Triple::OpenEmbedded); + // We use dynamic linker provided by openEuler embedded nativesdk's + // sysroot for native compilation. + if (OE && getVFS().exists("/opt/buildtools/nativesdk/sysroots")) + return "/opt/buildtools/nativesdk/sysroots/" + Triple.str() + "/lib/" + Loader; +#endif + break; } case llvm::Triple::ve: diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index 492ea25b179bc1bf919c450f200796b799e3ee33..878eb885adb4a6c220098d208aed4a93011a5e5f 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -97,6 +97,14 @@ else() set(LLVM_ENABLE_CLASSIC_FLANG 0) endif() +option(LLVM_BUILD_FOR_EMBEDDED "Enable openEuler embedded features for LLVM toolchain" OFF) +if(LLVM_BUILD_FOR_EMBEDDED) + set(LLVM_BUILD_FOR_EMBEDDED 1) + add_definitions( -DBUILD_FOR_EMBEDDED ) +else() + set(LLVM_BUILD_FOR_EMBEDDED 0) +endif() + if(LLVM_ENABLE_EXPENSIVE_CHECKS) add_compile_definitions(EXPENSIVE_CHECKS) diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp index a3d6a06af97632e7c583d46c54dc82f5ad9d6894..d21b103aee3eab65bf379c46db7a926ddc699fb0 100644 --- a/llvm/lib/TargetParser/Triple.cpp +++ b/llvm/lib/TargetParser/Triple.cpp @@ -570,6 +570,9 @@ static Triple::VendorType parseVendor(StringRef VendorName) { .Case("mesa", Triple::Mesa) .Case("suse", Triple::SUSE) .Case("oe", Triple::OpenEmbedded) +#ifdef BUILD_FOR_EMBEDDED + .Case("openeulersdk", Triple::OpenEmbedded) +#endif .Default(Triple::UnknownVendor); }