From: Andrey Turetskiy Date: Thu, 16 Jun 2016 10:36:09 +0000 (+0000) Subject: Compilation for Intel MCU (Part 2/3) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=93a6e160deab5adcd43705123512b5025975ed05;p=clang Compilation for Intel MCU (Part 2/3) This is the second patch required to support compilation for Intel MCU target (e.g. Intel(R) Quark(TM) micro controller D 2000). When IAMCU triple is used: * Recognize and use IAMCU GCC toolchain * Set up include paths * Forbid C++ Differential Revision: http://reviews.llvm.org/D19274 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@272883 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/ToolChain.h b/include/clang/Driver/ToolChain.h index 72009ef441..2a15d7ab06 100644 --- a/include/clang/Driver/ToolChain.h +++ b/include/clang/Driver/ToolChain.h @@ -418,6 +418,10 @@ public: virtual void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const; + /// \brief Add arguments to use MCU GCC toolchain includes. + virtual void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; + /// \brief Return sanitizers which are available in this toolchain. virtual SanitizerMask getSupportedSanitizers() const; diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 796fd64ee1..96971e91ae 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -2482,6 +2482,7 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, TC = new toolchains::Minix(*this, Target, Args); break; case llvm::Triple::Linux: + case llvm::Triple::ELFIAMCU: if (Target.getArch() == llvm::Triple::hexagon) TC = new toolchains::HexagonToolChain(*this, Target, Args); else if ((Target.getVendor() == llvm::Triple::MipsTechnologies) && diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp index 5855beff50..cba8924ec2 100644 --- a/lib/Driver/ToolChain.cpp +++ b/lib/Driver/ToolChain.cpp @@ -696,3 +696,6 @@ SanitizerMask ToolChain::getSupportedSanitizers() const { void ToolChain::AddCudaIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const {} + +void ToolChain::AddIAMCUIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const {} diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 5043e53f16..936fd8fe89 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -1618,9 +1618,13 @@ bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const { break; case llvm::Triple::x86: LibDirs.append(begin(X86LibDirs), end(X86LibDirs)); - TripleAliases.append(begin(X86Triples), end(X86Triples)); - BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs)); - BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples)); + // MCU toolchain is 32 bit only and its triple alias is TargetTriple + // itself, which will be appended below. + if (!TargetTriple.isOSIAMCU()) { + TripleAliases.append(begin(X86Triples), end(X86Triples)); + BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs)); + BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples)); + } break; case llvm::Triple::mips: LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs)); @@ -1770,14 +1774,14 @@ void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const { namespace { // Filter to remove Multilibs that don't exist as a suffix to Path class FilterNonExistent { - StringRef Base; + StringRef Base, File; vfs::FileSystem &VFS; public: - FilterNonExistent(StringRef Base, vfs::FileSystem &VFS) - : Base(Base), VFS(VFS) {} + FilterNonExistent(StringRef Base, StringRef File, vfs::FileSystem &VFS) + : Base(Base), File(File), VFS(VFS) {} bool operator()(const Multilib &M) { - return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o"); + return !VFS.exists(Base + M.gccSuffix() + File); } }; } // end anonymous namespace @@ -1867,7 +1871,7 @@ static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple, // /usr // /lib <= crt*.o files compiled with '-mips32' - FilterNonExistent NonExistent(Path, D.getVFS()); + FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS()); // Check for CodeScape MTI toolchain v1.2 and early. MultilibSet MtiMipsMultilibsV1; @@ -2322,7 +2326,7 @@ static void findAndroidArmMultilibs(const Driver &D, StringRef Path, const ArgList &Args, DetectedMultilibs &Result) { // Find multilibs with subdirectories like armv7-a, thumb, armv7-a/thumb. - FilterNonExistent NonExistent(Path, D.getVFS()); + FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS()); Multilib ArmV7Multilib = makeMultilib("/armv7-a") .flag("+armv7") .flag("-thumb"); @@ -2391,7 +2395,9 @@ static bool findBiarchMultilibs(const Driver &D, .flag("-m64") .flag("+mx32"); - FilterNonExistent NonExistent(Path, D.getVFS()); + // GCC toolchain for IAMCU doesn't have crtbegin.o, so look for libgcc.a. + FilterNonExistent NonExistent( + Path, TargetTriple.isOSIAMCU() ? "/libgcc.a" : "/crtbegin.o", D.getVFS()); // Determine default multilib from: 32, 64, x32 // Also handle cases such as 64 on 32, 32 on 64, etc. @@ -4526,6 +4532,16 @@ void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs, CC1Args.push_back("__clang_cuda_runtime_wrapper.h"); } +void Linux::AddIAMCUIncludeArgs(const ArgList &DriverArgs, + ArgStringList &CC1Args) const { + if (GCCInstallation.isValid()) { + CC1Args.push_back("-isystem"); + CC1Args.push_back(DriverArgs.MakeArgString( + GCCInstallation.getParentLibPath() + "/../" + + GCCInstallation.getTriple().str() + "/include")); + } +} + bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); } SanitizerMask Linux::getSupportedSanitizers() const { diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index 030943dabb..bf7fd4838a 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -820,6 +820,8 @@ public: llvm::opt::ArgStringList &CC1Args) const override; void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; bool isPIEDefault() const override; SanitizerMask getSupportedSanitizers() const override; void addProfileRTLibs(const llvm::opt::ArgList &Args, diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 4ee7714a1e..76307e28fb 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -295,6 +295,7 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, const InputInfoList &Inputs, const ToolChain *AuxToolChain) const { Arg *A; + const bool IsIAMCU = getToolChain().getTriple().isOSIAMCU(); CheckPreprocessingOptions(D, Args); @@ -562,10 +563,15 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs); } - // Add system include arguments. - getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs); - if (AuxToolChain) + // Add system include arguments for all targets but IAMCU. + if (!IsIAMCU) { + getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs); + if (AuxToolChain) AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs); + } else { + // For IAMCU add special include arguments. + getToolChain().AddIAMCUIncludeArgs(Args, CmdArgs); + } // Add CUDA include arguments, if needed. if (types::isCuda(Inputs[0].getType())) @@ -3742,6 +3748,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, getToolChain().getTriple().isWindowsCygwinEnvironment(); bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment(); bool IsPS4CPU = getToolChain().getTriple().isPS4CPU(); + bool IsIAMCU = getToolChain().getTriple().isOSIAMCU(); // Check number of inputs for sanity. We need at least one input. assert(Inputs.size() >= 1 && "Must have at least one input."); @@ -3752,6 +3759,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, bool IsCuda = types::isCuda(Input.getType()); assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs."); + // C++ is not supported for IAMCU. + if (IsIAMCU && types::isCXX(Input.getType())) + D.Diag(diag::err_drv_clang_unsupported) << "C++ for IAMCU"; + // Invoke ourselves in -cc1 mode. // // FIXME: Implement custom jobs for internal actions. diff --git a/test/Driver/miamcu-opt.c b/test/Driver/miamcu-opt.c index 763f0bb11f..fad8fbf903 100644 --- a/test/Driver/miamcu-opt.c +++ b/test/Driver/miamcu-opt.c @@ -16,3 +16,6 @@ // CHECK: "-static-define" // CHECK: "-mfloat-abi" "soft" // CHECK: "-mstack-alignment=4" + +// CHECK: bin/ld +// CHECK: "-static" diff --git a/test/Driver/miamcu-opt.cpp b/test/Driver/miamcu-opt.cpp new file mode 100644 index 0000000000..6c8d7552bc --- /dev/null +++ b/test/Driver/miamcu-opt.cpp @@ -0,0 +1,3 @@ +// RUN: %clang -miamcu %s -### -o %t.o 2>&1 | FileCheck %s + +// CHECK: error: the clang compiler does not support 'C++ for IAMCU'