Skip to content

Commit 19c3e8f

Browse files
committed
[perf]
1 parent 3b91b1a commit 19c3e8f

File tree

5 files changed

+74
-7
lines changed

5 files changed

+74
-7
lines changed

compiler/rustc_codegen_llvm/src/back/archive.rs

+26-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ use rustc_session::Session;
2828
pub struct LlvmArchiveBuilder<'a> {
2929
sess: &'a Session,
3030
additions: Vec<Addition>,
31+
32+
buffers: Vec<(String, Vec<u8>)>,
3133
}
3234

3335
enum Addition {
@@ -139,6 +141,10 @@ impl<'a> ArchiveBuilder<'a> for LlvmArchiveBuilder<'a> {
139141
Ok(())
140142
}
141143

144+
fn add_buffer(&mut self, buffer: Vec<u8>, name: &str) {
145+
self.buffers.push((name.to_string(), buffer))
146+
}
147+
142148
/// Adds an arbitrary file to this archive
143149
fn add_file(&mut self, file: &Path) {
144150
let name = file.file_name().unwrap().to_str().unwrap();
@@ -160,7 +166,7 @@ pub struct LlvmArchiveBuilderBuilder;
160166

161167
impl ArchiveBuilderBuilder for LlvmArchiveBuilderBuilder {
162168
fn new_archive_builder<'a>(&self, sess: &'a Session) -> Box<dyn ArchiveBuilder<'a> + 'a> {
163-
Box::new(LlvmArchiveBuilder { sess, additions: Vec::new() })
169+
Box::new(LlvmArchiveBuilder { sess, additions: Vec::new(), buffers: Vec::new() })
164170
}
165171

166172
fn create_dll_import_lib(
@@ -320,6 +326,10 @@ impl<'a> LlvmArchiveBuilder<'a> {
320326
let mut additions = mem::take(&mut self.additions);
321327
let mut strings = Vec::new();
322328
let mut members = Vec::new();
329+
let addition_buffers = mem::take(&mut self.buffers);
330+
let mut member_buffers = Vec::new();
331+
let mut string_buffers = Vec::new();
332+
let mut buffer_buffers = Vec::new();
323333

324334
let dst = CString::new(output.to_str().unwrap())?;
325335

@@ -329,7 +339,7 @@ impl<'a> LlvmArchiveBuilder<'a> {
329339
Addition::File { path, name_in_archive } => {
330340
let path = CString::new(path.to_str().unwrap())?;
331341
let name = CString::new(name_in_archive.clone())?;
332-
members.push(llvm::LLVMRustArchiveMemberNew(
342+
members.push(llvm::LLVMRustArchiveMemberNewFile(
333343
path.as_ptr(),
334344
name.as_ptr(),
335345
None,
@@ -357,7 +367,7 @@ impl<'a> LlvmArchiveBuilder<'a> {
357367
let child_name =
358368
Path::new(child_name).file_name().unwrap().to_str().unwrap();
359369
let name = CString::new(child_name)?;
360-
let m = llvm::LLVMRustArchiveMemberNew(
370+
let m = llvm::LLVMRustArchiveMemberNewFile(
361371
ptr::null(),
362372
name.as_ptr(),
363373
Some(child.raw),
@@ -368,11 +378,24 @@ impl<'a> LlvmArchiveBuilder<'a> {
368378
}
369379
}
370380
}
381+
for addition in addition_buffers {
382+
let name = CString::new(addition.0)?;
383+
let buffer = addition.1;
384+
member_buffers.push(llvm::LLVMRustArchiveMemberNewBuffer(
385+
name.as_ptr(),
386+
buffer.as_ptr() as *const i8,
387+
buffer.len(),
388+
));
389+
string_buffers.push(name);
390+
buffer_buffers.push(buffer);
391+
}
371392

372393
let r = llvm::LLVMRustWriteArchive(
373394
dst.as_ptr(),
374395
members.len() as libc::size_t,
375396
members.as_ptr() as *const &_,
397+
member_buffers.len() as libc::size_t,
398+
member_buffers.as_ptr() as *const &_,
376399
true,
377400
kind,
378401
);

compiler/rustc_codegen_llvm/src/llvm/ffi.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,8 @@ extern "C" {
664664
#[repr(C)]
665665
pub struct RustArchiveMember<'a>(InvariantOpaque<'a>);
666666
#[repr(C)]
667+
pub struct RustArchiveMemberBuffer<'a>(InvariantOpaque<'a>);
668+
#[repr(C)]
667669
pub struct OperandBundleDef<'a>(InvariantOpaque<'a>);
668670
#[repr(C)]
669671
pub struct Linker<'a>(InvariantOpaque<'a>);
@@ -2360,15 +2362,23 @@ extern "C" {
23602362
Dst: *const c_char,
23612363
NumMembers: size_t,
23622364
Members: *const &RustArchiveMember<'_>,
2365+
NumMemberBuffers: size_t,
2366+
Members: *const &RustArchiveMemberBuffer<'_>,
23632367
WriteSymbtab: bool,
23642368
Kind: ArchiveKind,
23652369
) -> LLVMRustResult;
2366-
pub fn LLVMRustArchiveMemberNew<'a>(
2370+
pub fn LLVMRustArchiveMemberNewFile<'a>(
23672371
Filename: *const c_char,
23682372
Name: *const c_char,
23692373
Child: Option<&ArchiveChild<'a>>,
23702374
) -> &'a mut RustArchiveMember<'a>;
2375+
pub fn LLVMRustArchiveMemberNewBuffer<'a>(
2376+
Name: *const c_char,
2377+
BufferStart: *const c_char,
2378+
BufferSize: size_t,
2379+
) -> &'a mut RustArchiveMember<'a>;
23712380
pub fn LLVMRustArchiveMemberFree<'a>(Member: &'a mut RustArchiveMember<'a>);
2381+
pub fn LLVMRustArchiveMemberBufferFree<'a>(Member: &'a mut RustArchiveMemberBuffer<'a>);
23722382

23732383
pub fn LLVMRustWriteImportLibrary(
23742384
ImportName: *const c_char,

compiler/rustc_codegen_ssa/src/back/archive.rs

+4
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ pub trait ArchiveBuilderBuilder {
7272
pub trait ArchiveBuilder<'a> {
7373
fn add_file(&mut self, path: &Path);
7474

75+
fn add_buffer(&mut self, _buffer: Vec<u8>, _name: &str) {
76+
unimplemented!();
77+
}
78+
7579
fn add_archive(
7680
&mut self,
7781
archive: &Path,

compiler/rustc_codegen_ssa/src/back/link.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,8 @@ fn link_rlib<'a>(
301301
// normal linkers for the platform. Sometimes this is not possible however.
302302
// If it is possible however, placing the metadata object first improves
303303
// performance of getting metadata from rlibs.
304-
ab.add_file(&metadata);
304+
ab.add_buffer(metadata, METADATA_FILENAME);
305+
// ab.add_file(&metadata);
305306
None
306307
}
307308
MetadataPosition::Last => Some(metadata),
@@ -438,7 +439,8 @@ fn link_rlib<'a>(
438439
//
439440
// Basically, all this means is that this code should not move above the
440441
// code above.
441-
ab.add_file(&trailing_metadata);
442+
ab.add_buffer(trailing_metadata, METADATA_FILENAME);
443+
// ab.add_file(&trailing_metadata);
442444
}
443445

444446
// Add all bundled static native library dependencies.

compiler/rustc_llvm/llvm-wrapper/ArchiveWrapper.cpp

+29-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ struct RustArchiveMember {
2020
~RustArchiveMember() {}
2121
};
2222

23+
struct RustArchiveMemberBuffer {
24+
MemoryBufferRef Buffer;
25+
26+
RustArchiveMemberBuffer() {}
27+
~RustArchiveMemberBuffer() {}
28+
};
29+
2330
struct RustArchiveIterator {
2431
bool First;
2532
Archive::child_iterator Cur;
@@ -58,6 +65,7 @@ static Archive::Kind fromRust(LLVMRustArchiveKind Kind) {
5865

5966
typedef OwningBinary<Archive> *LLVMRustArchiveRef;
6067
typedef RustArchiveMember *LLVMRustArchiveMemberRef;
68+
typedef RustArchiveMemberBuffer *LLVMRustArchiveMemberBufferRef;
6169
typedef Archive::Child *LLVMRustArchiveChildRef;
6270
typedef Archive::Child const *LLVMRustArchiveChildConstRef;
6371
typedef RustArchiveIterator *LLVMRustArchiveIteratorRef;
@@ -155,7 +163,7 @@ LLVMRustArchiveChildName(LLVMRustArchiveChildConstRef Child, size_t *Size) {
155163
}
156164

157165
extern "C" LLVMRustArchiveMemberRef
158-
LLVMRustArchiveMemberNew(char *Filename, char *Name,
166+
LLVMRustArchiveMemberNewFile(char *Filename, char *Name,
159167
LLVMRustArchiveChildRef Child) {
160168
RustArchiveMember *Member = new RustArchiveMember;
161169
Member->Filename = Filename;
@@ -165,13 +173,26 @@ LLVMRustArchiveMemberNew(char *Filename, char *Name,
165173
return Member;
166174
}
167175

176+
extern "C" LLVMRustArchiveMemberBufferRef
177+
LLVMRustArchiveMemberNewBuffer(const char* Name, const char* BufferStart, size_t BufferSize) {
178+
RustArchiveMemberBuffer *Member = new RustArchiveMemberBuffer;
179+
Member->Buffer = MemoryBufferRef(StringRef(BufferStart, BufferSize), StringRef(Name));
180+
return Member;
181+
}
182+
168183
extern "C" void LLVMRustArchiveMemberFree(LLVMRustArchiveMemberRef Member) {
169184
delete Member;
170185
}
171186

187+
extern "C" void LLVMRustArchiveMemberBufferFree(LLVMRustArchiveMemberBufferRef Member) {
188+
delete Member;
189+
}
190+
172191
extern "C" LLVMRustResult
173192
LLVMRustWriteArchive(char *Dst, size_t NumMembers,
174193
const LLVMRustArchiveMemberRef *NewMembers,
194+
size_t NumMemberBuffers,
195+
const LLVMRustArchiveMemberBufferRef *NewMemberBuffers,
175196
bool WriteSymbtab, LLVMRustArchiveKind RustKind) {
176197

177198
std::vector<NewArchiveMember> Members;
@@ -181,6 +202,7 @@ LLVMRustWriteArchive(char *Dst, size_t NumMembers,
181202
auto Member = NewMembers[I];
182203
assert(Member->Name);
183204
if (Member->Filename) {
205+
// file
184206
Expected<NewArchiveMember> MOrErr =
185207
NewArchiveMember::getFile(Member->Filename, true);
186208
if (!MOrErr) {
@@ -190,6 +212,7 @@ LLVMRustWriteArchive(char *Dst, size_t NumMembers,
190212
MOrErr->MemberName = sys::path::filename(MOrErr->MemberName);
191213
Members.push_back(std::move(*MOrErr));
192214
} else {
215+
// archive
193216
Expected<NewArchiveMember> MOrErr =
194217
NewArchiveMember::getOldMember(Member->Child, true);
195218
if (!MOrErr) {
@@ -199,6 +222,11 @@ LLVMRustWriteArchive(char *Dst, size_t NumMembers,
199222
Members.push_back(std::move(*MOrErr));
200223
}
201224
}
225+
for (size_t I = 0; I < NumMemberBuffers; I++) {
226+
auto Member = NewMemberBuffers[I];
227+
auto M = NewArchiveMember(Member->Buffer);
228+
Members.push_back(std::move(M));
229+
}
202230

203231
auto Result = writeArchive(Dst, Members, WriteSymbtab, Kind, true, false);
204232
if (!Result)

0 commit comments

Comments
 (0)