Author: Vassil Vassilev Date: 2020-11-14T21:32:23Z New Revision: 23cc838099e10b13a32e54105f4db0f1b7e3a842
URL: https://github.com/llvm/llvm-project/commit/23cc838099e10b13a32e54105f4db0f1b7e3a842 DIFF: https://github.com/llvm/llvm-project/commit/23cc838099e10b13a32e54105f4db0f1b7e3a842.diff LOG: Add forgotten in 888d06d file. Added: clang/unittests/CodeGen/TestCompiler.h Modified: Removed: ################################################################################ diff --git a/clang/unittests/CodeGen/TestCompiler.h b/clang/unittests/CodeGen/TestCompiler.h new file mode 100644 index 000000000000..61ca9a3e06fb --- /dev/null +++ b/clang/unittests/CodeGen/TestCompiler.h @@ -0,0 +1,112 @@ +//=== unittests/CodeGen/TestCompiler.h - Match on the LLVM IR ---*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef CLANG_UNITTESTS_CODEGEN_TESTCOMPILER_H +#define CLANG_UNITTESTS_CODEGEN_TESTCOMPILER_H + + +#include "clang/AST/ASTConsumer.h" +#include "clang/Basic/TargetInfo.h" +#include "clang/Basic/TargetOptions.h" +#include "clang/CodeGen/ModuleBuilder.h" +#include "clang/Frontend/CompilerInstance.h" +#include "clang/Parse/ParseAST.h" + +#include "llvm/IR/Constants.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" +#include "llvm/Support/Host.h" + +namespace llvm { + +struct TestCompiler { + LLVMContext Context; + clang::CompilerInstance compiler; + clang::CodeGenerator* CG; + llvm::Module *M = nullptr; + unsigned PtrSize = 0; + + TestCompiler(clang::LangOptions LO, + clang::CodeGenOptions CGO = clang::CodeGenOptions()) { + compiler.getLangOpts() = LO; + compiler.getCodeGenOpts() = CGO; + compiler.createDiagnostics(); + + std::string TrStr = llvm::Triple::normalize(llvm::sys::getProcessTriple()); + llvm::Triple Tr(TrStr); + Tr.setOS(Triple::Linux); + Tr.setVendor(Triple::VendorType::UnknownVendor); + Tr.setEnvironment(Triple::EnvironmentType::UnknownEnvironment); + compiler.getTargetOpts().Triple = Tr.getTriple(); + compiler.setTarget(clang::TargetInfo::CreateTargetInfo( + compiler.getDiagnostics(), + std::make_shared<clang::TargetOptions>(compiler.getTargetOpts()))); + + const clang::TargetInfo &TInfo = compiler.getTarget(); + PtrSize = TInfo.getPointerWidth(0) / 8; + + compiler.createFileManager(); + compiler.createSourceManager(compiler.getFileManager()); + compiler.createPreprocessor(clang::TU_Prefix); + + compiler.createASTContext(); + + CG = CreateLLVMCodeGen(compiler.getDiagnostics(), + "main-module", + compiler.getHeaderSearchOpts(), + compiler.getPreprocessorOpts(), + compiler.getCodeGenOpts(), + Context); + } + + void init(const char *TestProgram, + std::unique_ptr<clang::ASTConsumer> Consumer = nullptr) { + assert(CG); + + if (!Consumer) + Consumer = std::unique_ptr<clang::ASTConsumer>(CG); + + compiler.setASTConsumer(std::move(Consumer)); + + compiler.createSema(clang::TU_Prefix, nullptr); + + clang::SourceManager &sm = compiler.getSourceManager(); + sm.setMainFileID(sm.createFileID( + llvm::MemoryBuffer::getMemBuffer(TestProgram), clang::SrcMgr::C_User)); + } + + const BasicBlock *compile() { + clang::ParseAST(compiler.getSema(), false, false); + M = CG->GetModule(); + + // Do not expect more than one function definition. + auto FuncPtr = M->begin(); + for (; FuncPtr != M->end(); ++FuncPtr) + if (!FuncPtr->isDeclaration()) + break; + assert(FuncPtr != M->end()); + const llvm::Function &Func = *FuncPtr; + ++FuncPtr; + for (; FuncPtr != M->end(); ++FuncPtr) + if (!FuncPtr->isDeclaration()) + break; + assert(FuncPtr == M->end()); + + // The function must consist of single basic block. + auto BBPtr = Func.begin(); + assert(Func.begin() != Func.end()); + const BasicBlock &BB = *BBPtr; + ++BBPtr; + assert(BBPtr == Func.end()); + + return &BB; + } +}; + +} // namespace llvm +#endif // CLANG_UNITTESTS_CODEGEN_TESTCOMPILER_H _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits