-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Use the object crate for metadata reading #83640
Merged
Merged
Changes from all commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
267d55d
Use the object crate for metadata reading
bjorn3 f5d3883
Remove cg_llvm::metadata module
bjorn3 3ae15ca
Allow wasmparser dependency
bjorn3 802fe17
Disable wasm feature of object in cg_ssa
bjorn3 b65a92f
Remove wasmparser
bjorn3 487427f
Better error messages
bjorn3 537e814
Add link to historic note
bjorn3 6381aaf
Use DefaultMetadataLoader in the hotplug_codegen_backend test
bjorn3 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
//! Reading of the rustc metadata for rlibs and dylibs | ||
|
||
use std::fs::File; | ||
use std::path::Path; | ||
|
||
use rustc_data_structures::memmap::Mmap; | ||
use rustc_data_structures::owning_ref::OwningRef; | ||
use rustc_data_structures::rustc_erase_owner; | ||
use rustc_data_structures::sync::MetadataRef; | ||
use rustc_middle::middle::cstore::MetadataLoader; | ||
use rustc_target::spec::Target; | ||
|
||
use crate::METADATA_FILENAME; | ||
|
||
/// The default metadata loader. This is used by cg_llvm and cg_clif. | ||
/// | ||
/// # Metadata location | ||
/// | ||
/// <dl> | ||
/// <dt>rlib</dt> | ||
/// <dd>The metadata can be found in the `lib.rmeta` file inside of the ar archive.</dd> | ||
/// <dt>dylib</dt> | ||
/// <dd>The metadata can be found in the `.rustc` section of the shared library.</dd> | ||
/// </dl> | ||
pub struct DefaultMetadataLoader; | ||
|
||
fn load_metadata_with( | ||
path: &Path, | ||
f: impl for<'a> FnOnce(&'a [u8]) -> Result<&'a [u8], String>, | ||
) -> Result<MetadataRef, String> { | ||
let file = | ||
File::open(path).map_err(|e| format!("failed to open file '{}': {}", path.display(), e))?; | ||
let data = unsafe { Mmap::map(file) } | ||
.map_err(|e| format!("failed to mmap file '{}': {}", path.display(), e))?; | ||
let metadata = OwningRef::new(data).try_map(f)?; | ||
return Ok(rustc_erase_owner!(metadata.map_owner_box())); | ||
} | ||
|
||
impl MetadataLoader for DefaultMetadataLoader { | ||
fn get_rlib_metadata(&self, _target: &Target, path: &Path) -> Result<MetadataRef, String> { | ||
load_metadata_with(path, |data| { | ||
let archive = object::read::archive::ArchiveFile::parse(&*data) | ||
.map_err(|e| format!("failed to parse rlib '{}': {}", path.display(), e))?; | ||
|
||
for entry_result in archive.members() { | ||
let entry = entry_result | ||
.map_err(|e| format!("failed to parse rlib '{}': {}", path.display(), e))?; | ||
if entry.name() == METADATA_FILENAME.as_bytes() { | ||
return Ok(entry.data()); | ||
} | ||
} | ||
|
||
Err(format!("metadata not found in rlib '{}'", path.display())) | ||
}) | ||
} | ||
|
||
fn get_dylib_metadata(&self, _target: &Target, path: &Path) -> Result<MetadataRef, String> { | ||
use object::{Object, ObjectSection}; | ||
|
||
load_metadata_with(path, |data| { | ||
let file = object::File::parse(&data) | ||
.map_err(|e| format!("failed to parse dylib '{}': {}", path.display(), e))?; | ||
file.section_by_name(".rustc") | ||
.ok_or_else(|| format!("no .rustc section in '{}'", path.display()))? | ||
.data() | ||
.map_err(|e| { | ||
format!("failed to read .rustc section in '{}': {}", path.display(), e) | ||
}) | ||
}) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So, I think this (and use of mmap) may be one plausible reason for the slight performance regression. If my memory of the
ar
format serves me well, obtaining the list of members in anar
has to process the file effectively as if it was a ump list. I suspect that such a read pattern may be a pathological for mmap based I/O: kernel would try loading more data (page?) into memory only for us to inspect the file name and length before we jump to the next entry(-ies), discarding the rest of the data that kernel spent time loading in.Without digging into LLVM's ArchiveRO implementation I can imagine that more precise reads could be more effective here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ArchiveRO::open
also uses mmap for header reading I think:rust/compiler/rustc_llvm/llvm-wrapper/ArchiveWrapper.cpp
Line 66 in 6e17a5c
MemoryBufferRef
doesn't export any method allowingread
calls on the mapped file.