CrossWindowsToolChain.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. //===--- CrossWindowsToolChain.cpp - Cross Windows Tool Chain -------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "ToolChains.h"
  10. #include "clang/Driver/Driver.h"
  11. #include "clang/Driver/Options.h"
  12. #include "llvm/Option/ArgList.h"
  13. using namespace clang::driver;
  14. using namespace clang::driver::toolchains;
  15. CrossWindowsToolChain::CrossWindowsToolChain(const Driver &D,
  16. const llvm::Triple &T,
  17. const llvm::opt::ArgList &Args)
  18. : Generic_GCC(D, T, Args) {
  19. if (GetCXXStdlibType(Args) == ToolChain::CST_Libstdcxx) {
  20. const std::string &SysRoot = D.SysRoot;
  21. // libstdc++ resides in /usr/lib, but depends on libgcc which is placed in
  22. // /usr/lib/gcc.
  23. getFilePaths().push_back(SysRoot + "/usr/lib");
  24. getFilePaths().push_back(SysRoot + "/usr/lib/gcc");
  25. }
  26. }
  27. bool CrossWindowsToolChain::IsUnwindTablesDefault() const {
  28. // FIXME: all non-x86 targets need unwind tables, however, LLVM currently does
  29. // not know how to emit them.
  30. return getArch() == llvm::Triple::x86_64;
  31. }
  32. bool CrossWindowsToolChain::isPICDefault() const {
  33. return getArch() == llvm::Triple::x86_64;
  34. }
  35. bool CrossWindowsToolChain::isPIEDefault() const {
  36. return getArch() == llvm::Triple::x86_64;
  37. }
  38. bool CrossWindowsToolChain::isPICDefaultForced() const {
  39. return getArch() == llvm::Triple::x86_64;
  40. }
  41. void CrossWindowsToolChain::
  42. AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
  43. llvm::opt::ArgStringList &CC1Args) const {
  44. const Driver &D = getDriver();
  45. const std::string &SysRoot = D.SysRoot;
  46. if (DriverArgs.hasArg(options::OPT_nostdlibinc))
  47. return;
  48. addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
  49. if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
  50. SmallString<128> ResourceDir(D.ResourceDir);
  51. llvm::sys::path::append(ResourceDir, "include");
  52. addSystemInclude(DriverArgs, CC1Args, ResourceDir);
  53. }
  54. addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
  55. }
  56. void CrossWindowsToolChain::
  57. AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
  58. llvm::opt::ArgStringList &CC1Args) const {
  59. const llvm::Triple &Triple = getTriple();
  60. const std::string &SysRoot = getDriver().SysRoot;
  61. if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
  62. DriverArgs.hasArg(options::OPT_nostdincxx))
  63. return;
  64. switch (GetCXXStdlibType(DriverArgs)) {
  65. case ToolChain::CST_Libcxx:
  66. addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include/c++/v1");
  67. break;
  68. case ToolChain::CST_Libstdcxx:
  69. addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include/c++");
  70. addSystemInclude(DriverArgs, CC1Args,
  71. SysRoot + "/usr/include/c++/" + Triple.str());
  72. addSystemInclude(DriverArgs, CC1Args,
  73. SysRoot + "/usr/include/c++/backwards");
  74. }
  75. }
  76. void CrossWindowsToolChain::
  77. AddCXXStdlibLibArgs(const llvm::opt::ArgList &DriverArgs,
  78. llvm::opt::ArgStringList &CC1Args) const {
  79. switch (GetCXXStdlibType(DriverArgs)) {
  80. case ToolChain::CST_Libcxx:
  81. CC1Args.push_back("-lc++");
  82. break;
  83. case ToolChain::CST_Libstdcxx:
  84. CC1Args.push_back("-lstdc++");
  85. CC1Args.push_back("-lmingw32");
  86. CC1Args.push_back("-lmingwex");
  87. CC1Args.push_back("-lgcc");
  88. CC1Args.push_back("-lmoldname");
  89. CC1Args.push_back("-lmingw32");
  90. break;
  91. }
  92. }
  93. Tool *CrossWindowsToolChain::buildLinker() const {
  94. return new tools::CrossWindows::Linker(*this);
  95. }
  96. Tool *CrossWindowsToolChain::buildAssembler() const {
  97. return new tools::CrossWindows::Assembler(*this);
  98. }