1*67e74705SXin Li //===- unittests/CodeGen/BufferSourceTest.cpp - MemoryBuffer source tests -===//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li
10*67e74705SXin Li #include "clang/AST/ASTConsumer.h"
11*67e74705SXin Li #include "clang/AST/ASTContext.h"
12*67e74705SXin Li #include "clang/AST/RecursiveASTVisitor.h"
13*67e74705SXin Li #include "clang/Basic/TargetInfo.h"
14*67e74705SXin Li #include "clang/CodeGen/ModuleBuilder.h"
15*67e74705SXin Li #include "clang/Frontend/CompilerInstance.h"
16*67e74705SXin Li #include "clang/Lex/Preprocessor.h"
17*67e74705SXin Li #include "clang/Parse/ParseAST.h"
18*67e74705SXin Li #include "clang/Sema/Sema.h"
19*67e74705SXin Li #include "llvm/ADT/Triple.h"
20*67e74705SXin Li #include "llvm/IR/LLVMContext.h"
21*67e74705SXin Li #include "llvm/Support/Host.h"
22*67e74705SXin Li #include "llvm/Support/MemoryBuffer.h"
23*67e74705SXin Li #include "gtest/gtest.h"
24*67e74705SXin Li
25*67e74705SXin Li using namespace llvm;
26*67e74705SXin Li using namespace clang;
27*67e74705SXin Li
28*67e74705SXin Li namespace {
29*67e74705SXin Li
30*67e74705SXin Li // Emitting constructors for global objects involves looking
31*67e74705SXin Li // at the source file name. This makes sure that we don't crash
32*67e74705SXin Li // if the source file is a memory buffer.
33*67e74705SXin Li const char TestProgram[] =
34*67e74705SXin Li "class EmitCXXGlobalInitFunc "
35*67e74705SXin Li "{ "
36*67e74705SXin Li "public: "
37*67e74705SXin Li " EmitCXXGlobalInitFunc() {} "
38*67e74705SXin Li "}; "
39*67e74705SXin Li "EmitCXXGlobalInitFunc test; ";
40*67e74705SXin Li
TEST(BufferSourceTest,EmitCXXGlobalInitFunc)41*67e74705SXin Li TEST(BufferSourceTest, EmitCXXGlobalInitFunc) {
42*67e74705SXin Li LLVMContext Context;
43*67e74705SXin Li CompilerInstance compiler;
44*67e74705SXin Li
45*67e74705SXin Li compiler.createDiagnostics();
46*67e74705SXin Li compiler.getLangOpts().CPlusPlus = 1;
47*67e74705SXin Li compiler.getLangOpts().CPlusPlus11 = 1;
48*67e74705SXin Li
49*67e74705SXin Li compiler.getTargetOpts().Triple = llvm::Triple::normalize(
50*67e74705SXin Li llvm::sys::getProcessTriple());
51*67e74705SXin Li compiler.setTarget(clang::TargetInfo::CreateTargetInfo(
52*67e74705SXin Li compiler.getDiagnostics(),
53*67e74705SXin Li std::make_shared<clang::TargetOptions>(
54*67e74705SXin Li compiler.getTargetOpts())));
55*67e74705SXin Li
56*67e74705SXin Li compiler.createFileManager();
57*67e74705SXin Li compiler.createSourceManager(compiler.getFileManager());
58*67e74705SXin Li compiler.createPreprocessor(clang::TU_Prefix);
59*67e74705SXin Li
60*67e74705SXin Li compiler.createASTContext();
61*67e74705SXin Li
62*67e74705SXin Li compiler.setASTConsumer(std::unique_ptr<ASTConsumer>(
63*67e74705SXin Li CreateLLVMCodeGen(
64*67e74705SXin Li compiler.getDiagnostics(),
65*67e74705SXin Li "EmitCXXGlobalInitFuncTest",
66*67e74705SXin Li compiler.getHeaderSearchOpts(),
67*67e74705SXin Li compiler.getPreprocessorOpts(),
68*67e74705SXin Li compiler.getCodeGenOpts(),
69*67e74705SXin Li Context)));
70*67e74705SXin Li
71*67e74705SXin Li compiler.createSema(clang::TU_Prefix, nullptr);
72*67e74705SXin Li
73*67e74705SXin Li clang::SourceManager &sm = compiler.getSourceManager();
74*67e74705SXin Li sm.setMainFileID(sm.createFileID(
75*67e74705SXin Li llvm::MemoryBuffer::getMemBuffer(TestProgram), clang::SrcMgr::C_User));
76*67e74705SXin Li
77*67e74705SXin Li clang::ParseAST(compiler.getSema(), false, false);
78*67e74705SXin Li }
79*67e74705SXin Li
80*67e74705SXin Li } // end anonymous namespace
81