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