diff options
| author | bors <bors@rust-lang.org> | 2014-09-15 16:56:03 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-09-15 16:56:03 +0000 |
| commit | a8d478db512803d25785a11c5b21634f8703b17f (patch) | |
| tree | 3b26870796579c4563a938cadf93b98569b6d7f7 /src/rustllvm/RustWrapper.cpp | |
| parent | 8e2860407b6b9e618e9f466610ae66e51f0d16da (diff) | |
| parent | ad9a1daa819bbeb8e643a01167b3b69055b88d57 (diff) | |
| download | rust-a8d478db512803d25785a11c5b21634f8703b17f.tar.gz rust-a8d478db512803d25785a11c5b21634f8703b17f.zip | |
auto merge of #17208 : kmcallister/rust/llvm-diagnostics, r=thestinger
I would like to map this information back to AST nodes, so that we can print remarks with spans, and so that remarks can be enabled on a per-function basis. Unfortunately, doing this would require a lot more code restructuring — for example, we currently throw away the AST map and lots of other information before LLVM optimizations run. So for the time being, we print the remarks with debug location strings from LLVM. There's a warning if you use `-C remark` without `--debuginfo`. Fixes #17116.
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
| -rw-r--r-- | src/rustllvm/RustWrapper.cpp | 60 |
1 files changed, 52 insertions, 8 deletions
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index cdd36d7f458..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" @@ -645,22 +647,18 @@ extern "C" void LLVMDICompositeTypeSetTypeArray( #endif } -extern "C" char *LLVMTypeToString(LLVMTypeRef Type) { - std::string s; - llvm::raw_string_ostream os(s); +extern "C" void LLVMWriteTypeToString(LLVMTypeRef Type, RustStringRef str) { + raw_rust_string_ostream os(str); unwrap<llvm::Type>(Type)->print(os); - return strdup(os.str().data()); } -extern "C" char *LLVMValueToString(LLVMValueRef Value) { - std::string s; - llvm::raw_string_ostream os(s); +extern "C" void LLVMWriteValueToString(LLVMValueRef Value, RustStringRef str) { + raw_rust_string_ostream os(str); os << "("; unwrap<llvm::Value>(Value)->getType()->print(os); os << ":"; unwrap<llvm::Value>(Value)->print(os); os << ")"; - return strdup(os.str().data()); } #if LLVM_VERSION_MINOR >= 5 @@ -827,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); +} |
