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