1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//===- unittests/CodeGen/BufferSourceTest.cpp - MemoryBuffer source tests -===//
2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//
3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//                     The LLVM Compiler Infrastructure
4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//
5176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// This file is distributed under the University of Illinois Open Source
6176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// License. See LICENSE.TXT for details.
7176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//
8176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines//===----------------------------------------------------------------------===//
9176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/AST/ASTConsumer.h"
11176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/AST/ASTContext.h"
12176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/AST/RecursiveASTVisitor.h"
130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include "clang/Basic/TargetInfo.h"
140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include "clang/CodeGen/ModuleBuilder.h"
15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/Frontend/CompilerInstance.h"
16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/Lex/Preprocessor.h"
17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/Parse/ParseAST.h"
180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include "clang/Sema/Sema.h"
19176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "llvm/ADT/Triple.h"
200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include "llvm/IR/LLVMContext.h"
21176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "llvm/Support/Host.h"
22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "llvm/Support/MemoryBuffer.h"
23176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "gtest/gtest.h"
24176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
25176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesusing namespace llvm;
26176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesusing namespace clang;
27176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
28176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace {
29176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
30176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Emitting constructors for global objects involves looking
31176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// at the source file name. This makes sure that we don't crash
32176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// if the source file is a memory buffer.
33176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst char TestProgram[] =
34176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    "class EmitCXXGlobalInitFunc    "
35176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    "{                              "
36176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    "public:                        "
37176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    "   EmitCXXGlobalInitFunc() {}  "
38176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    "};                             "
39176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    "EmitCXXGlobalInitFunc test;    ";
40176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
41176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST(BufferSourceTest, EmitCXXGlobalInitFunc) {
424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    LLVMContext Context;
43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    CompilerInstance compiler;
44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
45176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    compiler.createDiagnostics();
46176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    compiler.getLangOpts().CPlusPlus = 1;
47176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    compiler.getLangOpts().CPlusPlus11 = 1;
48176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
49176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    compiler.getTargetOpts().Triple = llvm::Triple::normalize(
50176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        llvm::sys::getProcessTriple());
51176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    compiler.setTarget(clang::TargetInfo::CreateTargetInfo(
52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      compiler.getDiagnostics(),
53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      std::make_shared<clang::TargetOptions>(
54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        compiler.getTargetOpts())));
55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    compiler.createFileManager();
57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    compiler.createSourceManager(compiler.getFileManager());
58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    compiler.createPreprocessor(clang::TU_Prefix);
59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    compiler.createASTContext();
61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    compiler.setASTConsumer(std::unique_ptr<ASTConsumer>(
63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        CreateLLVMCodeGen(
64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            compiler.getDiagnostics(),
65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            "EmitCXXGlobalInitFuncTest",
6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            compiler.getHeaderSearchOpts(),
6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            compiler.getPreprocessorOpts(),
68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            compiler.getCodeGenOpts(),
694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            Context)));
70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    compiler.createSema(clang::TU_Prefix, nullptr);
72176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
73176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    clang::SourceManager &sm = compiler.getSourceManager();
74176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    sm.setMainFileID(sm.createFileID(
75176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        llvm::MemoryBuffer::getMemBuffer(TestProgram), clang::SrcMgr::C_User));
76176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
77176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    clang::ParseAST(compiler.getSema(), false, false);
78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} // end anonymous namespace
81