VEToolchain.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. //===--- VE.cpp - VE ToolChain Implementations ------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "VEToolchain.h"
  9. #include "CommonArgs.h"
  10. #include "clang/Driver/Compilation.h"
  11. #include "clang/Driver/Driver.h"
  12. #include "clang/Driver/Options.h"
  13. #include "llvm/Option/ArgList.h"
  14. #include "llvm/Support/FileSystem.h"
  15. #include "llvm/Support/Path.h"
  16. #include <cstdlib> // ::getenv
  17. using namespace clang::driver;
  18. using namespace clang::driver::toolchains;
  19. using namespace clang;
  20. using namespace llvm::opt;
  21. /// VE tool chain
  22. VEToolChain::VEToolChain(const Driver &D, const llvm::Triple &Triple,
  23. const ArgList &Args)
  24. : Linux(D, Triple, Args) {
  25. getProgramPaths().push_back("/opt/nec/ve/bin");
  26. // ProgramPaths are found via 'PATH' environment variable.
  27. // Default library paths are following:
  28. // ${RESOURCEDIR}/lib/ve-unknown-linux-gnu,
  29. // These are OK.
  30. // Default file paths are following:
  31. // ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPath)
  32. // /lib/../lib64,
  33. // /usr/lib/../lib64,
  34. // ${BINPATH}/../lib,
  35. // /lib,
  36. // /usr/lib,
  37. // These are OK for host, but no go for VE.
  38. // Define file paths from scratch here.
  39. getFilePaths().clear();
  40. // Add library directories:
  41. // ${BINPATH}/../lib/ve-unknown-linux-gnu, (== getStdlibPath)
  42. // ${RESOURCEDIR}/lib/linux/ve, (== getArchSpecificLibPath)
  43. // ${SYSROOT}/opt/nec/ve/lib,
  44. for (auto &Path : getStdlibPaths())
  45. getFilePaths().push_back(std::move(Path));
  46. getFilePaths().push_back(getArchSpecificLibPath());
  47. getFilePaths().push_back(computeSysRoot() + "/opt/nec/ve/lib");
  48. }
  49. Tool *VEToolChain::buildAssembler() const {
  50. return new tools::gnutools::Assembler(*this);
  51. }
  52. Tool *VEToolChain::buildLinker() const {
  53. return new tools::gnutools::Linker(*this);
  54. }
  55. bool VEToolChain::isPICDefault() const { return false; }
  56. bool VEToolChain::isPIEDefault(const llvm::opt::ArgList &Args) const {
  57. return false;
  58. }
  59. bool VEToolChain::isPICDefaultForced() const { return false; }
  60. bool VEToolChain::SupportsProfiling() const { return false; }
  61. bool VEToolChain::hasBlocksRuntime() const { return false; }
  62. void VEToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
  63. ArgStringList &CC1Args) const {
  64. if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
  65. return;
  66. if (DriverArgs.hasArg(options::OPT_nobuiltininc) &&
  67. DriverArgs.hasArg(options::OPT_nostdlibinc))
  68. return;
  69. if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
  70. SmallString<128> P(getDriver().ResourceDir);
  71. llvm::sys::path::append(P, "include");
  72. addSystemInclude(DriverArgs, CC1Args, P);
  73. }
  74. if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
  75. if (const char *cl_include_dir = getenv("NCC_C_INCLUDE_PATH")) {
  76. SmallVector<StringRef, 4> Dirs;
  77. const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
  78. StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
  79. ArrayRef<StringRef> DirVec(Dirs);
  80. addSystemIncludes(DriverArgs, CC1Args, DirVec);
  81. } else {
  82. addSystemInclude(DriverArgs, CC1Args,
  83. getDriver().SysRoot + "/opt/nec/ve/include");
  84. }
  85. }
  86. }
  87. void VEToolChain::addClangTargetOptions(const ArgList &DriverArgs,
  88. ArgStringList &CC1Args,
  89. Action::OffloadKind) const {
  90. CC1Args.push_back("-nostdsysteminc");
  91. bool UseInitArrayDefault = true;
  92. if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
  93. options::OPT_fno_use_init_array, UseInitArrayDefault))
  94. CC1Args.push_back("-fno-use-init-array");
  95. }
  96. void VEToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
  97. ArgStringList &CC1Args) const {
  98. if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) ||
  99. DriverArgs.hasArg(options::OPT_nostdlibinc) ||
  100. DriverArgs.hasArg(options::OPT_nostdincxx))
  101. return;
  102. if (const char *cl_include_dir = getenv("NCC_CPLUS_INCLUDE_PATH")) {
  103. SmallVector<StringRef, 4> Dirs;
  104. const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
  105. StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
  106. ArrayRef<StringRef> DirVec(Dirs);
  107. addSystemIncludes(DriverArgs, CC1Args, DirVec);
  108. } else {
  109. // Add following paths for multiple target installation.
  110. // ${INSTALLDIR}/include/ve-unknown-linux-gnu/c++/v1,
  111. // ${INSTALLDIR}/include/c++/v1,
  112. addLibCxxIncludePaths(DriverArgs, CC1Args);
  113. }
  114. }
  115. void VEToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
  116. ArgStringList &CmdArgs) const {
  117. assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
  118. "Only -lc++ (aka libxx) is supported in this toolchain.");
  119. tools::addArchSpecificRPath(*this, Args, CmdArgs);
  120. CmdArgs.push_back("-lc++");
  121. if (Args.hasArg(options::OPT_fexperimental_library))
  122. CmdArgs.push_back("-lc++experimental");
  123. CmdArgs.push_back("-lc++abi");
  124. CmdArgs.push_back("-lunwind");
  125. // libc++ requires -lpthread under glibc environment
  126. CmdArgs.push_back("-lpthread");
  127. // libunwind requires -ldl under glibc environment
  128. CmdArgs.push_back("-ldl");
  129. }
  130. llvm::ExceptionHandling
  131. VEToolChain::GetExceptionModel(const ArgList &Args) const {
  132. // VE uses SjLj exceptions.
  133. return llvm::ExceptionHandling::SjLj;
  134. }