xref: /aosp_15_r20/external/clang/unittests/CodeGen/BufferSourceTest.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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