diff options
| author | bors <bors@rust-lang.org> | 2014-04-03 17:17:02 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-04-03 17:17:02 -0700 |
| commit | e7fe20722904cd2829a65f845ee7a1718cdf7292 (patch) | |
| tree | de906a26828f4a01fcdec0112047d16250d5c991 /src/rustllvm/RustWrapper.cpp | |
| parent | bb31cb8d2e4e415cbb71d368918d72902e655e01 (diff) | |
| parent | 487fa9568b69753fecb74a8460109239f4bf3631 (diff) | |
| download | rust-e7fe20722904cd2829a65f845ee7a1718cdf7292.tar.gz rust-e7fe20722904cd2829a65f845ee7a1718cdf7292.zip | |
auto merge of #13290 : alexcrichton/rust/rollup, r=alexcrichton
Closes #13285 (rustc: Stop using LLVMGetSectionName) Closes #13280 (std: override clone_from for Vec.) Closes #13277 (serialize: add a few missing pubs to base64) Closes #13275 (Add and remove some ignore-win32 flags) Closes #13273 (Removed managed boxes from libarena.) Closes #13270 (Minor copy-editing for the tutorial) Closes #13267 (fix Option<~ZeroSizeType>) Closes #13265 (Update emacs mode to support new `#![inner(attribute)]` syntax.) Closes #13263 (syntax: Remove AbiSet, use one Abi)
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
| -rw-r--r-- | src/rustllvm/RustWrapper.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 4755c7873fc..5a00a8034e6 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -10,6 +10,7 @@ #include "rustllvm.h" #include "llvm/Object/Archive.h" +#include "llvm/Object/ObjectFile.h" //===----------------------------------------------------------------------=== // @@ -679,3 +680,27 @@ extern "C" int LLVMVersionMinor() { return LLVM_VERSION_MINOR; } + +// Note that the two following functions look quite similar to the +// LLVMGetSectionName function. Sadly, it appears that this function only +// returns a char* pointer, which isn't guaranteed to be null-terminated. The +// function provided by LLVM doesn't return the length, so we've created our own +// function which returns the length as well as the data pointer. +// +// For an example of this not returning a null terminated string, see +// lib/Object/COFFObjectFile.cpp in the getSectionName function. One of the +// branches explicitly creates a StringRef without a null terminator, and then +// that's returned. + +inline section_iterator *unwrap(LLVMSectionIteratorRef SI) { + return reinterpret_cast<section_iterator*>(SI); +} + +extern "C" int +LLVMRustGetSectionName(LLVMSectionIteratorRef SI, const char **ptr) { + StringRef ret; + if (error_code ec = (*unwrap(SI))->getName(ret)) + report_fatal_error(ec.message()); + *ptr = ret.data(); + return ret.size(); +} |
