diff options
| author | Keegan McAllister <kmcallister@mozilla.com> | 2014-09-12 08:17:58 -0700 |
|---|---|---|
| committer | Keegan McAllister <kmcallister@mozilla.com> | 2014-09-12 11:46:38 -0700 |
| commit | ad9a1daa819bbeb8e643a01167b3b69055b88d57 (patch) | |
| tree | 94cd15f43986278e477b85eb31ac3c60cebe8f3f /src/rustllvm | |
| parent | 225353d8bbad5730c941fc88e854627004e74f2c (diff) | |
| download | rust-ad9a1daa819bbeb8e643a01167b3b69055b88d57.tar.gz rust-ad9a1daa819bbeb8e643a01167b3b69055b88d57.zip | |
Add -C remark for LLVM optimization remarks
Fixes #17116.
Diffstat (limited to 'src/rustllvm')
| -rw-r--r-- | src/rustllvm/RustWrapper.cpp | 48 | ||||
| -rw-r--r-- | src/rustllvm/rustllvm.h | 2 |
2 files changed, 50 insertions, 0 deletions
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 5893b582cd8..7896ce2ba76 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -11,6 +11,8 @@ #include "rustllvm.h" #include "llvm/Object/Archive.h" #include "llvm/Object/ObjectFile.h" +#include "llvm/IR/DiagnosticInfo.h" +#include "llvm/IR/DiagnosticPrinter.h" #if LLVM_VERSION_MINOR >= 5 #include "llvm/IR/CallSite.h" @@ -823,3 +825,49 @@ extern "C" LLVMTypeRef LLVMRustArrayType(LLVMTypeRef ElementType, uint64_t ElementCount) { return wrap(ArrayType::get(unwrap(ElementType), ElementCount)); } + +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Twine, LLVMTwineRef) +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DebugLoc, LLVMDebugLocRef) + +extern "C" void +LLVMWriteTwineToString(LLVMTwineRef T, RustStringRef str) { + raw_rust_string_ostream os(str); + unwrap(T)->print(os); +} + +extern "C" void +LLVMUnpackOptimizationDiagnostic( + LLVMDiagnosticInfoRef di, + const char **pass_name_out, + LLVMValueRef *function_out, + LLVMDebugLocRef *debugloc_out, + LLVMTwineRef *message_out) +{ + // Undefined to call this not on an optimization diagnostic! + llvm::DiagnosticInfoOptimizationBase *opt + = static_cast<llvm::DiagnosticInfoOptimizationBase*>(unwrap(di)); + + *pass_name_out = opt->getPassName(); + *function_out = wrap(&opt->getFunction()); + *debugloc_out = wrap(&opt->getDebugLoc()); + *message_out = wrap(&opt->getMsg()); +} + +extern "C" void LLVMWriteDiagnosticInfoToString(LLVMDiagnosticInfoRef di, RustStringRef str) { + raw_rust_string_ostream os(str); + DiagnosticPrinterRawOStream dp(os); + unwrap(di)->print(dp); +} + +extern "C" int LLVMGetDiagInfoKind(LLVMDiagnosticInfoRef di) { + return unwrap(di)->getKind(); +} + +extern "C" void LLVMWriteDebugLocToString( + LLVMContextRef C, + LLVMDebugLocRef dl, + RustStringRef str) +{ + raw_rust_string_ostream os(str); + unwrap(dl)->print(*unwrap(C), os); +} diff --git a/src/rustllvm/rustllvm.h b/src/rustllvm/rustllvm.h index 92f94b0e8e5..54b0c2506c7 100644 --- a/src/rustllvm/rustllvm.h +++ b/src/rustllvm/rustllvm.h @@ -71,6 +71,8 @@ void LLVMRustSetLastError(const char*); typedef struct OpaqueRustString *RustStringRef; +typedef struct LLVMOpaqueTwine *LLVMTwineRef; +typedef struct LLVMOpaqueDebugLoc *LLVMDebugLocRef; extern "C" void rust_llvm_string_write_impl(RustStringRef str, const char *ptr, size_t size); |
