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) { 42176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CompilerInstance compiler; 43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.createDiagnostics(); 45176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.getLangOpts().CPlusPlus = 1; 46176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.getLangOpts().CPlusPlus11 = 1; 47176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 48176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.getTargetOpts().Triple = llvm::Triple::normalize( 49176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::sys::getProcessTriple()); 50176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.setTarget(clang::TargetInfo::CreateTargetInfo( 51176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.getDiagnostics(), 52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::make_shared<clang::TargetOptions>( 53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.getTargetOpts()))); 54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.createFileManager(); 56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.createSourceManager(compiler.getFileManager()); 57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.createPreprocessor(clang::TU_Prefix); 58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.createASTContext(); 60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.setASTConsumer(std::unique_ptr<ASTConsumer>( 62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CreateLLVMCodeGen( 63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.getDiagnostics(), 64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines "EmitCXXGlobalInitFuncTest", 65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.getCodeGenOpts(), 66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::getGlobalContext()))); 67176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines compiler.createSema(clang::TU_Prefix,NULL); 69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines clang::SourceManager &sm = compiler.getSourceManager(); 71176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines sm.setMainFileID(sm.createFileID( 72176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines llvm::MemoryBuffer::getMemBuffer(TestProgram), clang::SrcMgr::C_User)); 73176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 74176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines clang::ParseAST(compiler.getSema(), false, false); 75176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 76176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 77176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 78