summary refs log tree commit diff
path: root/src/rustllvm/RustWrapper.cpp
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <respindola@mozilla.com>2011-04-15 17:35:46 -0400
committerRafael Ávila de Espíndola <respindola@mozilla.com>2011-04-15 17:41:14 -0400
commit2214b6835d8bf5b33a3fb8b6a897abaea55ef368 (patch)
treed6209d2e1dca535f4e0e5225108a6b8cb876c266 /src/rustllvm/RustWrapper.cpp
parent790084ced18ca391c30d8e1045c04cbf2111499e (diff)
downloadrust-2214b6835d8bf5b33a3fb8b6a897abaea55ef368.tar.gz
rust-2214b6835d8bf5b33a3fb8b6a897abaea55ef368.zip
Add a -S option for producing assembly. I will move more of it to
rust once the necessary APIs are available in C.
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
-rw-r--r--src/rustllvm/RustWrapper.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp
index ac9b48cda8f..81b8cbc9e0c 100644
--- a/src/rustllvm/RustWrapper.cpp
+++ b/src/rustllvm/RustWrapper.cpp
@@ -12,10 +12,18 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/PassManager.h"
+#include "llvm/ADT/Triple.h"
+#include "llvm/Support/FormattedStream.h"
+#include "llvm/Target/TargetMachine.h"
+#include "llvm/Target/TargetSelect.h"
+#include "llvm/Target/TargetRegistry.h"
 #include "llvm-c/Core.h"
 #include "llvm-c/Object.h"
 #include <cstdlib>
 
+using namespace llvm;
+
 static char *LLVMRustError;
 
 extern "C" LLVMMemoryBufferRef
@@ -33,3 +41,24 @@ extern "C" void LLVMAddBasicAliasAnalysisPass(LLVMPassManagerRef PM);
 
 void (*RustHackToFetchPassesO)(LLVMPassManagerRef PM) =
   LLVMAddBasicAliasAnalysisPass;
+
+extern "C" void LLVMRustWriteAssembly(LLVMPassManagerRef PMR, LLVMModuleRef M,
+                                      const char *triple, const char *path) {
+  InitializeAllTargets();
+  InitializeAllAsmPrinters();
+  std::string Err;
+  const Target *TheTarget = TargetRegistry::lookupTarget(triple, Err);
+  std::string FeaturesStr;
+  TargetMachine &Target = *TheTarget->createTargetMachine(triple, FeaturesStr);
+  bool NoVerify = false;
+  CodeGenOpt::Level OLvl = CodeGenOpt::Default;
+  TargetMachine::CodeGenFileType  FileType = TargetMachine::CGFT_AssemblyFile;
+  PassManager *PM = unwrap<PassManager>(PMR);
+  std::string ErrorInfo;
+  raw_fd_ostream OS(path, ErrorInfo,
+                    raw_fd_ostream::F_Binary);
+  formatted_raw_ostream FOS(OS);
+  bool foo = Target.addPassesToEmitFile(*PM, FOS, FileType, OLvl, NoVerify);
+  assert(!foo);
+  PM->run(*unwrap(M));
+}