From 2214b6835d8bf5b33a3fb8b6a897abaea55ef368 Mon Sep 17 00:00:00 2001 From: Rafael Ávila de Espíndola Date: Fri, 15 Apr 2011 17:35:46 -0400 Subject: Add a -S option for producing assembly. I will move more of it to rust once the necessary APIs are available in C. --- src/rustllvm/RustWrapper.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src/rustllvm/RustWrapper.cpp') 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 +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(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)); +} -- cgit 1.4.1-3-g733a5