123 lines
4.0 KiB
C++
123 lines
4.0 KiB
C++
//===--- CrossWindowsToolChain.cpp - Cross Windows Tool Chain -------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "ToolChains.h"
|
|
#include "clang/Driver/Driver.h"
|
|
#include "clang/Driver/Options.h"
|
|
#include "llvm/Option/ArgList.h"
|
|
|
|
using namespace clang::driver;
|
|
using namespace clang::driver::toolchains;
|
|
|
|
CrossWindowsToolChain::CrossWindowsToolChain(const Driver &D,
|
|
const llvm::Triple &T,
|
|
const llvm::opt::ArgList &Args)
|
|
: Generic_GCC(D, T, Args) {
|
|
if (GetCXXStdlibType(Args) == ToolChain::CST_Libstdcxx) {
|
|
const std::string &SysRoot = D.SysRoot;
|
|
|
|
// libstdc++ resides in /usr/lib, but depends on libgcc which is placed in
|
|
// /usr/lib/gcc.
|
|
getFilePaths().push_back(SysRoot + "/usr/lib");
|
|
getFilePaths().push_back(SysRoot + "/usr/lib/gcc");
|
|
}
|
|
}
|
|
|
|
bool CrossWindowsToolChain::IsUnwindTablesDefault() const {
|
|
// FIXME: all non-x86 targets need unwind tables, however, LLVM currently does
|
|
// not know how to emit them.
|
|
return getArch() == llvm::Triple::x86_64;
|
|
}
|
|
|
|
bool CrossWindowsToolChain::isPICDefault() const {
|
|
return getArch() == llvm::Triple::x86_64;
|
|
}
|
|
|
|
bool CrossWindowsToolChain::isPIEDefault() const {
|
|
return getArch() == llvm::Triple::x86_64;
|
|
}
|
|
|
|
bool CrossWindowsToolChain::isPICDefaultForced() const {
|
|
return getArch() == llvm::Triple::x86_64;
|
|
}
|
|
|
|
void CrossWindowsToolChain::
|
|
AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
|
|
llvm::opt::ArgStringList &CC1Args) const {
|
|
const Driver &D = getDriver();
|
|
const std::string &SysRoot = D.SysRoot;
|
|
|
|
if (DriverArgs.hasArg(options::OPT_nostdlibinc))
|
|
return;
|
|
|
|
addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
|
|
if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
|
|
SmallString<128> ResourceDir(D.ResourceDir);
|
|
llvm::sys::path::append(ResourceDir, "include");
|
|
addSystemInclude(DriverArgs, CC1Args, ResourceDir);
|
|
}
|
|
addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
|
|
}
|
|
|
|
void CrossWindowsToolChain::
|
|
AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
|
|
llvm::opt::ArgStringList &CC1Args) const {
|
|
const llvm::Triple &Triple = getTriple();
|
|
const std::string &SysRoot = getDriver().SysRoot;
|
|
|
|
if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
|
|
DriverArgs.hasArg(options::OPT_nostdincxx))
|
|
return;
|
|
|
|
switch (GetCXXStdlibType(DriverArgs)) {
|
|
case ToolChain::CST_Libcxx:
|
|
addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include/c++/v1");
|
|
break;
|
|
|
|
case ToolChain::CST_Libstdcxx:
|
|
addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include/c++");
|
|
addSystemInclude(DriverArgs, CC1Args,
|
|
SysRoot + "/usr/include/c++/" + Triple.str());
|
|
addSystemInclude(DriverArgs, CC1Args,
|
|
SysRoot + "/usr/include/c++/backwards");
|
|
}
|
|
}
|
|
|
|
void CrossWindowsToolChain::
|
|
AddCXXStdlibLibArgs(const llvm::opt::ArgList &DriverArgs,
|
|
llvm::opt::ArgStringList &CC1Args) const {
|
|
switch (GetCXXStdlibType(DriverArgs)) {
|
|
case ToolChain::CST_Libcxx:
|
|
CC1Args.push_back("-lc++");
|
|
break;
|
|
case ToolChain::CST_Libstdcxx:
|
|
CC1Args.push_back("-lstdc++");
|
|
CC1Args.push_back("-lmingw32");
|
|
CC1Args.push_back("-lmingwex");
|
|
CC1Args.push_back("-lgcc");
|
|
CC1Args.push_back("-lmoldname");
|
|
CC1Args.push_back("-lmingw32");
|
|
break;
|
|
}
|
|
}
|
|
|
|
clang::SanitizerMask CrossWindowsToolChain::getSupportedSanitizers() const {
|
|
SanitizerMask Res = ToolChain::getSupportedSanitizers();
|
|
Res |= SanitizerKind::Address;
|
|
return Res;
|
|
}
|
|
|
|
Tool *CrossWindowsToolChain::buildLinker() const {
|
|
return new tools::CrossWindows::Linker(*this);
|
|
}
|
|
|
|
Tool *CrossWindowsToolChain::buildAssembler() const {
|
|
return new tools::CrossWindows::Assembler(*this);
|
|
}
|