summaryrefslogtreecommitdiff
path: root/tiger-compiler/tcsh/src/tiger_llvmtranslate.i
diff options
context:
space:
mode:
Diffstat (limited to 'tiger-compiler/tcsh/src/tiger_llvmtranslate.i')
-rw-r--r--tiger-compiler/tcsh/src/tiger_llvmtranslate.i39
1 files changed, 39 insertions, 0 deletions
diff --git a/tiger-compiler/tcsh/src/tiger_llvmtranslate.i b/tiger-compiler/tcsh/src/tiger_llvmtranslate.i
new file mode 100644
index 0000000..70fade9
--- /dev/null
+++ b/tiger-compiler/tcsh/src/tiger_llvmtranslate.i
@@ -0,0 +1,39 @@
+// -*- C++ -*-
+
+%module tiger_llvmtranslate
+
+%include "std_string.i"
+
+%{
+ #include <llvmtranslate/libllvmtranslate.hh>
+ #include <llvmtranslate/tasks.hh>
+ #include <llvm/IR/IRPrintingPasses.h>
+ #include <llvm/Linker/Linker.h>
+ #include <llvm/IR/Module.h>
+%}
+
+%inline
+{
+ std::string translate(const ast::Ast& tree)
+ {
+ auto module = llvmtranslate::translate(tree);
+ auto runtime = llvmtranslate::runtime_get(*module.first);
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR <= 7
+ auto link = llvm::Linker::LinkModules(module.second.get(), runtime.get());
+#else
+ auto link = llvm::Linker::linkModules(*module.second, std::move(runtime));
+#endif
+ postcondition(!link); // Returns true on error
+
+ std::string str;
+ llvm::raw_string_ostream out(str);
+ llvm::PrintModulePass printer{out};
+#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR <= 8
+ printer.run(*module.second);
+#else
+ llvm::ModuleAnalysisManager dummy_mam;
+ printer.run(*module.second, dummy_mam);
+#endif
+ return out.str();
+ }
+}