diff options
| author | bors <bors@rust-lang.org> | 2020-05-30 21:23:19 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-05-30 21:23:19 +0000 |
| commit | 8c5402efdda733d163895d1edb9bcf7f401dd33b (patch) | |
| tree | 1abfcbf012a45c7595c129995fcede2b092c408c /src/rustllvm/RustWrapper.cpp | |
| parent | 74e80468347471779be6060d8d7d6d04e98e467f (diff) | |
| parent | 581eafcdf767ebc064f1711b7225388cfbc46b98 (diff) | |
| download | rust-8c5402efdda733d163895d1edb9bcf7f401dd33b.tar.gz rust-8c5402efdda733d163895d1edb9bcf7f401dd33b.zip | |
Auto merge of #72794 - RalfJung:rollup-gzs4nl4, r=RalfJung
Rollup of 13 pull requests Successful merges: - #72543 (Account for missing lifetime in opaque and trait object return types) - #72625 (Improve inline asm error diagnostics) - #72637 (expand `env!` with def-site context) - #72650 (Sort sidebar elements) - #72657 (Allow types (with lifetimes/generics) in impl_lint_pass) - #72666 (Add -Z profile-emit=<path> for Gcov gcda output.) - #72668 (Fix missing parentheses Fn notation error) - #72669 (rustc_session: Cleanup session creation) - #72728 (Make bootstrap aware of relative libdir in stage0 compiler) - #72757 (rustc_lexer: Optimize shebang detection slightly) - #72772 (miri validation: clarify valid values of 'char') - #72773 (Fix is_char_boundary documentation) - #72777 (rustdoc: remove calls to `local_def_id_from_node_id`) Failed merges: r? @ghost
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
| -rw-r--r-- | src/rustllvm/RustWrapper.cpp | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 24f35627d10..6fac2662506 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -1216,10 +1216,33 @@ extern "C" void LLVMRustSetInlineAsmDiagnosticHandler( unwrap(C)->setInlineAsmDiagnosticHandler(H, CX); } -extern "C" void LLVMRustWriteSMDiagnosticToString(LLVMSMDiagnosticRef D, - RustStringRef Str) { - RawRustStringOstream OS(Str); - unwrap(D)->print("", OS); +extern "C" bool LLVMRustUnpackSMDiagnostic(LLVMSMDiagnosticRef DRef, + RustStringRef MessageOut, + RustStringRef BufferOut, + unsigned* LocOut, + unsigned* RangesOut, + size_t* NumRanges) { + SMDiagnostic& D = *unwrap(DRef); + RawRustStringOstream MessageOS(MessageOut); + MessageOS << D.getMessage(); + + if (D.getLoc() == SMLoc()) + return false; + + const SourceMgr &LSM = *D.getSourceMgr(); + const MemoryBuffer *LBuf = LSM.getMemoryBuffer(LSM.FindBufferContainingLoc(D.getLoc())); + LLVMRustStringWriteImpl(BufferOut, LBuf->getBufferStart(), LBuf->getBufferSize()); + + *LocOut = D.getLoc().getPointer() - LBuf->getBufferStart(); + + *NumRanges = std::min(*NumRanges, D.getRanges().size()); + size_t LineStart = *LocOut - (size_t)D.getColumnNo(); + for (size_t i = 0; i < *NumRanges; i++) { + RangesOut[i * 2] = LineStart + D.getRanges()[i].first; + RangesOut[i * 2 + 1] = LineStart + D.getRanges()[i].second; + } + + return true; } extern "C" LLVMValueRef LLVMRustBuildCleanupPad(LLVMBuilderRef B, |
