4#include <gtest/gtest.h>
20 TermPtr term = Parser::ParseString(
"func():Int32");
21 term->m_int_name =
"func::";
23 src = JIT::MakeFunctionPrototype(term,
"");
24 ASSERT_STREQ(
"newlang::ObjPtr _$$_func$$(newlang::Context *ctx, newlang::Obj &args)", src.c_str()) << src;
25 src = JIT::MakeFunctionPrototype(term,
"\\\\dir\\module");
26 ASSERT_STREQ(
"newlang::ObjPtr _$dir$module$_func$$(newlang::Context *ctx, newlang::Obj &args)", src.c_str()) << src;
28 term->push_back(Term::CreateName(
"arg"));
29 term->push_back(Term::CreateName(
"arg2"));
30 src = JIT::MakeFunctionPrototype(term,
"");
31 ASSERT_STREQ(
"newlang::ObjPtr _$$_func$$(newlang::Context *ctx, newlang::Obj &args)", src.c_str()) << src;
32 src = JIT::MakeFunctionPrototype(term,
"\\\\dir\\module2");
33 ASSERT_STREQ(
"newlang::ObjPtr _$dir$module2$_func$$(newlang::Context *ctx, newlang::Obj &args)", src.c_str()) << src;
41#include "clang/Driver/Driver.h"
42#include "clang/Driver/Compilation.h"
43#include "clang/Frontend/TextDiagnosticPrinter.h"
44#include "llvm/IR/Module.h"
45#include "llvm/Target/TargetOptions.h"
46#include "llvm/ADT/STLExtras.h"
47#include "llvm/Support/VirtualFileSystem.h"
48#include "llvm/Support/TargetSelect.h"
50#include "llvm-c/Core.h"
51#include "llvm-c/Target.h"
52#include "llvm-c/TargetMachine.h"
54#include "llvm/IR/LegacyPassManager.h"
55#include "llvm/MC/TargetRegistry.h"
56#include "llvm/Support/CodeGen.h"
58#include "llvm/Support/InitLLVM.h"
60#include "llvm/Target/TargetMachine.h"
62#include "clang/Frontend/CompilerInstance.h"
63#include "clang/CodeGen/CodeGenAction.h"
69using namespace llvm::sys;
71void writeModuleToFile(llvm::Module *module) {
72 auto TargetTriple = LLVMGetDefaultTargetTriple();
73 InitializeAllTargetInfos();
74 InitializeAllTargets();
75 InitializeAllTargetMCs();
76 InitializeAllAsmParsers();
77 InitializeAllAsmPrinters();
80 auto Target = TargetRegistry::lookupTarget(TargetTriple, Error);
85 auto RM = std::optional<Reloc::Model>();
86 auto TargetMachine = Target->createTargetMachine(TargetTriple, CPU, Features, opt, RM);
88 module->setDataLayout(TargetMachine->createDataLayout());
89 module->setTargetTriple(TargetTriple);
91 auto Filename =
"output.o";
93 raw_fd_ostream dest(Filename, EC, sys::fs::OF_None);
95 legacy::PassManager pass;
96 auto FileType = CodeGenFileType::ObjectFile;
98 if (TargetMachine->addPassesToEmitFile(pass, dest,
nullptr, FileType)) {
99 errs() <<
"TargetMachine can't emit a file of this type";
105 IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts =
new clang::DiagnosticOptions;
106 clang::TextDiagnosticPrinter *DiagClient =
new clang::TextDiagnosticPrinter(errs(), &*DiagOpts);
107 IntrusiveRefCntPtr<clang::DiagnosticIDs> DiagID(
new clang::DiagnosticIDs());
108 clang::DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagClient);
109 clang::driver::Driver TheDriver(
"/uslkjhklhjkr/bin/clang++-12ssss", TargetTriple, Diags);
111 auto args = ArrayRef<const char *>{
"-g",
"output.o",
"-o",
"xxxxxxxxxxxxxxxxxxxxx"};
113 std::unique_ptr<clang::driver::Compilation> C(TheDriver.BuildCompilation(args));
115 if (C && !C->containsError()) {
116 SmallVector<std::pair<int, const clang::driver::Command *>, 4> FailingCommands;
117 TheDriver.ExecuteCompilation(*C, FailingCommands);
123std::unique_ptr<llvm::Module> CompileCpp2(std::string source, std::vector<std::string> opts, std::string *asm_code =
nullptr) {
124 clang::CompilerInstance compilerInstance;
125 auto& compilerInvocation = compilerInstance.getInvocation();
129 clang::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts =
new clang::DiagnosticOptions;
130 clang::TextDiagnosticPrinter *textDiagPrinter =
131 new clang::TextDiagnosticPrinter(llvm::outs(), &*DiagOpts);
133 clang::IntrusiveRefCntPtr<clang::DiagnosticIDs> pDiagIDs;
135 clang::DiagnosticsEngine *pDiagnosticsEngine =
136 new clang::DiagnosticsEngine(pDiagIDs, &*DiagOpts, textDiagPrinter);
140 std::string triple = LLVMGetDefaultTargetTriple();
142 std::vector<std::string> itemstrs;
143 itemstrs.push_back(triple.insert(0,
"-triple="));
144 itemstrs.push_back(
"-xc++");
145 itemstrs.push_back(
"-std=c++23");
147 itemstrs.insert(itemstrs.end(), opts.begin(), opts.end());
152 std::vector<const char*> itemcstrs;
153 for (
unsigned idx = 0; idx < itemstrs.size(); idx++) {
156 itemcstrs.push_back(itemstrs[idx].c_str());
157 std::cout << itemcstrs.back() <<
"\n";
163 pipe2(codeInPipe, O_NONBLOCK);
164 write(codeInPipe[1], source.c_str(), source.size());
165 close(codeInPipe[1]);
166 dup2(codeInPipe[0], STDIN_FILENO);
168 itemcstrs.push_back(
"-");
170 clang::CompilerInvocation::CreateFromArgs(compilerInvocation,
171 llvm::ArrayRef<const char *>(itemcstrs.data(),
172 itemcstrs.size()), *pDiagnosticsEngine);
174 auto& languageOptions = compilerInvocation.getLangOpts();
175 auto& preprocessorOptions = compilerInvocation.getPreprocessorOpts();
176 auto& targetOptions = compilerInvocation.getTargetOpts();
178 auto& frontEndOptions = compilerInvocation.getFrontendOpts();
181 auto& headerSearchOptions = compilerInvocation.getHeaderSearchOpts();
184 auto& codeGenOptions = compilerInvocation.getCodeGenOpts();
187 targetOptions.Triple = LLVMGetDefaultTargetTriple();
188 compilerInstance.createDiagnostics(textDiagPrinter,
false);
190 std::cout <<
"Using target triple: " << triple;
192 LLVMContextRef ctx = LLVMContextCreate();
193 std::unique_ptr<clang::CodeGenAction> action = std::make_unique<clang::EmitLLVMOnlyAction>((llvm::LLVMContext *)ctx);
195 assert(compilerInstance.ExecuteAction(*action));
198 std::unique_ptr<llvm::Module> module = action->takeModule();
204 llvm::raw_string_ostream asm_stream(*asm_code);
205 module->print(asm_stream, 0, false);
278const char * source =
""
279 "#include <stdio.h>\n"
280 "#include \"sys/time.h\"\n"
283 "int main(int argc, char* argv[], char* envp[]) {\n"
285 " // disable unused warning\n"
286 " ((void)(argc)); ((void)(argv)); ((void)(envp));\n"
287 " printf(\"Hello, world!!!!!!!!!!!!!!!!!!\\n\");\n"
294 std::vector<std::string> argsX{
297 "-I",
"/usr/include/x86_64-linux-gnu/",
298 "-I",
"/usr/lib/gcc/x86_64-linux-gnu/11/include",
299 "-I",
"/usr/include",
300 "-I",
"/usr/include/linux",
301 "-I",
"/usr/local/include",
302 "-o",
"hello_embeddddddddddddddddddddd",
306 auto module = CompileCpp2(source,argsX);
308 writeModuleToFile(module.get());
std::shared_ptr< Term > TermPtr