aboutsummaryrefslogtreecommitdiff
path: root/src/rustllvm
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <[email protected]>2011-04-15 17:35:46 -0400
committerRafael Ávila de Espíndola <[email protected]>2011-04-15 17:41:14 -0400
commit2214b6835d8bf5b33a3fb8b6a897abaea55ef368 (patch)
treed6209d2e1dca535f4e0e5225108a6b8cb876c266 /src/rustllvm
parentrustc: Make fold_ty no longer use an object; introduce walk_ty (diff)
downloadrust-2214b6835d8bf5b33a3fb8b6a897abaea55ef368.tar.xz
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')
-rw-r--r--src/rustllvm/RustWrapper.cpp29
-rw-r--r--src/rustllvm/rustllvm.def.in1
2 files changed, 30 insertions, 0 deletions
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp
index ac9b48cd..81b8cbc9 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));
+}
diff --git a/src/rustllvm/rustllvm.def.in b/src/rustllvm/rustllvm.def.in
index 58f395c0..f95bb90b 100644
--- a/src/rustllvm/rustllvm.def.in
+++ b/src/rustllvm/rustllvm.def.in
@@ -1,4 +1,5 @@
LLVMRustCreateMemoryBufferWithContentsOfFile
+LLVMRustWriteAssembly
LLVMRustGetLastError
LLVMCreateObjectFile
LLVMDisposeObjectFile