187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===- unittests/Driver/ToolChainTest.cpp --- ToolChain tests -------------===//
287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// License. See LICENSE.TXT for details.
787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===----------------------------------------------------------------------===//
987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
1087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Unit tests for ToolChains.
1187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
1287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//===----------------------------------------------------------------------===//
1387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Driver/ToolChain.h"
1587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Basic/DiagnosticIDs.h"
1687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Basic/DiagnosticOptions.h"
1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Basic/LLVM.h"
1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Basic/VirtualFileSystem.h"
1987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Driver/Compilation.h"
2087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Driver/Driver.h"
2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "llvm/Support/raw_ostream.h"
2287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "gtest/gtest.h"
2387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarusing namespace clang;
2487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarusing namespace clang::driver;
2587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace {
2787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST(ToolChainTest, VFSGCCInstallation) {
2987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
3087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
3287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct TestDiagnosticConsumer : public DiagnosticConsumer {};
3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer);
3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  IntrusiveRefCntPtr<vfs::InMemoryFileSystem> InMemoryFileSystem(
3587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      new vfs::InMemoryFileSystem);
3687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Driver TheDriver("/bin/clang", "arm-linux-gnueabihf", Diags,
3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                   InMemoryFileSystem);
3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  const char *EmptyFiles[] = {
4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "foo.cpp",
4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/bin/clang",
4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/usr/lib/gcc/arm-linux-gnueabi/4.6.1/crtbegin.o",
4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/usr/lib/gcc/arm-linux-gnueabi/4.6.1/crtend.o",
4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/usr/lib/gcc/arm-linux-gnueabihf/4.6.3/crtbegin.o",
4587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/usr/lib/gcc/arm-linux-gnueabihf/4.6.3/crtend.o",
4687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/usr/lib/arm-linux-gnueabi/crt1.o",
4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/usr/lib/arm-linux-gnueabi/crti.o",
4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/usr/lib/arm-linux-gnueabi/crtn.o",
4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/usr/lib/arm-linux-gnueabihf/crt1.o",
5087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/usr/lib/arm-linux-gnueabihf/crti.o",
5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/usr/lib/arm-linux-gnueabihf/crtn.o",
5287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/usr/include/arm-linux-gnueabi/.keep",
5387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/usr/include/arm-linux-gnueabihf/.keep",
5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/lib/arm-linux-gnueabi/.keep",
5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/lib/arm-linux-gnueabihf/.keep"};
5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
5787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (const char *Path : EmptyFiles)
5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    InMemoryFileSystem->addFile(Path, 0,
5987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                llvm::MemoryBuffer::getMemBuffer("\n"));
6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  std::unique_ptr<Compilation> C(TheDriver.BuildCompilation(
6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      {"-fsyntax-only", "--gcc-toolchain=", "foo.cpp"}));
6387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  std::string S;
6587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  {
6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    llvm::raw_string_ostream OS(S);
6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    C->getDefaultToolChain().printVerboseInfo(OS);
6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#if LLVM_ON_WIN32
7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  std::replace(S.begin(), S.end(), '\\', '/');
7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif
7287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ(
7387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "Found candidate GCC installation: "
7487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/usr/lib/gcc/arm-linux-gnueabihf/4.6.3\n"
7587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "Selected GCC installation: /usr/lib/gcc/arm-linux-gnueabihf/4.6.3\n"
7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "Candidate multilib: .;@m32\n"
7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "Selected multilib: .;@m32\n",
7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      S);
7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarTEST(ToolChainTest, VFSGCCInstallationRelativeDir) {
8287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
8587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct TestDiagnosticConsumer : public DiagnosticConsumer {};
8687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  DiagnosticsEngine Diags(DiagID, &*DiagOpts, new TestDiagnosticConsumer);
8787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  IntrusiveRefCntPtr<vfs::InMemoryFileSystem> InMemoryFileSystem(
8887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      new vfs::InMemoryFileSystem);
8987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Driver TheDriver("/home/test/bin/clang", "arm-linux-gnueabi", Diags,
9087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                   InMemoryFileSystem);
9187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
9287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  const char *EmptyFiles[] = {
9387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "foo.cpp", "/home/test/lib/gcc/arm-linux-gnueabi/4.6.1/crtbegin.o",
9487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      "/home/test/include/arm-linux-gnueabi/.keep"};
9587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
9687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (const char *Path : EmptyFiles)
9787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    InMemoryFileSystem->addFile(Path, 0,
9887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                llvm::MemoryBuffer::getMemBuffer("\n"));
9987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
10087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  std::unique_ptr<Compilation> C(TheDriver.BuildCompilation(
10187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      {"-fsyntax-only", "--gcc-toolchain=", "foo.cpp"}));
10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
10387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  std::string S;
10487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  {
10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    llvm::raw_string_ostream OS(S);
10687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    C->getDefaultToolChain().printVerboseInfo(OS);
10787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
10887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#if LLVM_ON_WIN32
10987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  std::replace(S.begin(), S.end(), '\\', '/');
11087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#endif
11187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  EXPECT_EQ("Found candidate GCC installation: "
11287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "/home/test/lib/gcc/arm-linux-gnueabi/4.6.1\n"
11387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "Selected GCC installation: "
11487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "/home/test/bin/../lib/gcc/arm-linux-gnueabi/4.6.1\n"
11587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "Candidate multilib: .;@m32\n"
11687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            "Selected multilib: .;@m32\n",
11787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            S);
11887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
11987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
12087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} // end anonymous namespace
121