Skip to content

Commit c7669df

Browse files
committed
rustc_codegen_llvm: use safe references for ArchiveChild.
1 parent e551ed9 commit c7669df

File tree

3 files changed

+56
-38
lines changed

3 files changed

+56
-38
lines changed

src/librustc_codegen_llvm/back/archive.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use std::ffi::{CString, CStr};
1414
use std::io;
1515
use std::mem;
1616
use std::path::{Path, PathBuf};
17-
use std::ptr::{self, NonNull};
17+
use std::ptr;
1818
use std::str;
1919

2020
use back::bytecode::RLIB_BYTECODE_EXTENSION;
@@ -246,7 +246,7 @@ impl<'a> ArchiveBuilder<'a> {
246246
let name = CString::new(child_name)?;
247247
members.push(llvm::LLVMRustArchiveMemberNew(ptr::null(),
248248
name.as_ptr(),
249-
NonNull::new(child.raw())));
249+
Some(child.raw)));
250250
strings.push(name);
251251
}
252252
}
@@ -284,7 +284,7 @@ impl<'a> ArchiveBuilder<'a> {
284284
let name = CString::new(child_name)?;
285285
let m = llvm::LLVMRustArchiveMemberNew(ptr::null(),
286286
name.as_ptr(),
287-
NonNull::new(child.raw()));
287+
Some(child.raw));
288288
members.push(m);
289289
strings.push(name);
290290
}

src/librustc_codegen_llvm/llvm/archive_ro.rs

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,22 @@
1111
//! A wrapper around LLVM's archive (.a) code
1212
1313
use std::ffi::CString;
14-
use std::marker;
1514
use std::path::Path;
1615
use std::slice;
1716
use std::str;
1817

1918
pub struct ArchiveRO {
20-
raw: &'static mut super::Archive,
19+
pub raw: &'static mut super::Archive,
2120
}
2221

2322
unsafe impl Send for ArchiveRO {}
2423

2524
pub struct Iter<'a> {
26-
ptr: &'a mut super::ArchiveIterator<'a>,
25+
raw: &'a mut super::ArchiveIterator<'a>,
2726
}
2827

2928
pub struct Child<'a> {
30-
ptr: super::ArchiveChildRef,
31-
_data: marker::PhantomData<&'a ArchiveRO>,
29+
pub raw: &'a mut super::ArchiveChild<'a>,
3230
}
3331

3432
impl ArchiveRO {
@@ -59,14 +57,10 @@ impl ArchiveRO {
5957
}
6058
}
6159

62-
pub fn raw(&self) -> &super::Archive {
63-
self.raw
64-
}
65-
6660
pub fn iter(&self) -> Iter {
6761
unsafe {
6862
Iter {
69-
ptr: super::LLVMRustArchiveIteratorNew(self.raw),
63+
raw: super::LLVMRustArchiveIteratorNew(self.raw),
7064
}
7165
}
7266
}
@@ -84,22 +78,19 @@ impl<'a> Iterator for Iter<'a> {
8478
type Item = Result<Child<'a>, String>;
8579

8680
fn next(&mut self) -> Option<Result<Child<'a>, String>> {
87-
let ptr = unsafe { super::LLVMRustArchiveIteratorNext(self.ptr) };
88-
if ptr.is_null() {
89-
super::last_error().map(Err)
90-
} else {
91-
Some(Ok(Child {
92-
ptr,
93-
_data: marker::PhantomData,
94-
}))
81+
unsafe {
82+
match super::LLVMRustArchiveIteratorNext(self.raw) {
83+
Some(raw) => Some(Ok(Child { raw })),
84+
None => super::last_error().map(Err),
85+
}
9586
}
9687
}
9788
}
9889

9990
impl<'a> Drop for Iter<'a> {
10091
fn drop(&mut self) {
10192
unsafe {
102-
super::LLVMRustArchiveIteratorFree(&mut *(self.ptr as *mut _));
93+
super::LLVMRustArchiveIteratorFree(&mut *(self.raw as *mut _));
10394
}
10495
}
10596
}
@@ -108,7 +99,7 @@ impl<'a> Child<'a> {
10899
pub fn name(&self) -> Option<&'a str> {
109100
unsafe {
110101
let mut name_len = 0;
111-
let name_ptr = super::LLVMRustArchiveChildName(self.ptr, &mut name_len);
102+
let name_ptr = super::LLVMRustArchiveChildName(self.raw, &mut name_len);
112103
if name_ptr.is_null() {
113104
None
114105
} else {
@@ -121,23 +112,19 @@ impl<'a> Child<'a> {
121112
pub fn data(&self) -> &'a [u8] {
122113
unsafe {
123114
let mut data_len = 0;
124-
let data_ptr = super::LLVMRustArchiveChildData(self.ptr, &mut data_len);
115+
let data_ptr = super::LLVMRustArchiveChildData(self.raw, &mut data_len);
125116
if data_ptr.is_null() {
126117
panic!("failed to read data from archive child");
127118
}
128119
slice::from_raw_parts(data_ptr as *const u8, data_len as usize)
129120
}
130121
}
131-
132-
pub fn raw(&self) -> super::ArchiveChildRef {
133-
self.ptr
134-
}
135122
}
136123

137124
impl<'a> Drop for Child<'a> {
138125
fn drop(&mut self) {
139126
unsafe {
140-
super::LLVMRustArchiveChildFree(self.ptr);
127+
super::LLVMRustArchiveChildFree(&mut *(self.raw as *mut _));
141128
}
142129
}
143130
}

src/librustc_codegen_llvm/llvm/ffi.rs

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ use libc::{c_uint, c_int, size_t, c_char};
2525
use libc::{c_ulonglong, c_void};
2626

2727
use std::marker::PhantomData;
28-
use std::ptr::NonNull;
2928

3029
use super::RustString;
3130

@@ -383,6 +382,7 @@ pub enum ThreadLocalMode {
383382
}
384383

385384
extern { type Opaque; }
385+
#[repr(C)]
386386
struct InvariantOpaque<'a> {
387387
_marker: PhantomData<&'a mut &'a ()>,
388388
_opaque: Opaque,
@@ -397,22 +397,27 @@ extern { pub type Metadata; }
397397
extern { pub type BasicBlock; }
398398
extern { pub type Builder; }
399399
extern { pub type MemoryBuffer; }
400+
#[repr(C)]
400401
pub struct PassManager<'a>(InvariantOpaque<'a>);
401402
extern { pub type PassManagerBuilder; }
402403
extern { pub type ObjectFile; }
404+
#[repr(C)]
403405
pub struct SectionIterator<'a>(InvariantOpaque<'a>);
404406
extern { pub type Pass; }
405407
extern { pub type TargetMachine; }
406408
extern { pub type Archive; }
409+
#[repr(C)]
407410
pub struct ArchiveIterator<'a>(InvariantOpaque<'a>);
408-
extern { pub type ArchiveChild; }
409-
pub type ArchiveChildRef = *mut ArchiveChild;
411+
#[repr(C)]
412+
pub struct ArchiveChild<'a>(InvariantOpaque<'a>);
410413
extern { pub type Twine; }
411414
extern { pub type DiagnosticInfo; }
412415
extern { pub type SMDiagnostic; }
413416
extern { pub type RustArchiveMember; }
414417
pub type RustArchiveMemberRef = *mut RustArchiveMember;
418+
#[repr(C)]
415419
pub struct OperandBundleDef<'a>(InvariantOpaque<'a>);
420+
#[repr(C)]
416421
pub struct Linker<'a>(InvariantOpaque<'a>);
417422

418423
pub type DiagnosticHandler = unsafe extern "C" fn(&DiagnosticInfo, *mut c_void);
@@ -474,7 +479,6 @@ pub mod debuginfo {
474479

475480
extern { pub type ModuleBuffer; }
476481

477-
#[allow(improper_ctypes)] // TODO remove this (use for NonNull)
478482
extern "C" {
479483
// Create and destroy contexts.
480484
pub fn LLVMRustContextCreate(shouldDiscardNames: bool) -> &'static mut Context;
@@ -1403,10 +1407,15 @@ extern "C" {
14031407
-> &'a Value;
14041408
pub fn LLVMRustDIBuilderCreateOpDeref() -> i64;
14051409
pub fn LLVMRustDIBuilderCreateOpPlusUconst() -> i64;
1410+
}
14061411

1412+
#[allow(improper_ctypes)] // FIXME(#52456) needed for RustString.
1413+
extern "C" {
14071414
pub fn LLVMRustWriteTypeToString(Type: &Type, s: &RustString);
14081415
pub fn LLVMRustWriteValueToString(value_ref: &Value, s: &RustString);
1416+
}
14091417

1418+
extern "C" {
14101419
pub fn LLVMIsAConstantInt(value_ref: &Value) -> Option<&Value>;
14111420
pub fn LLVMIsAConstantFP(value_ref: &Value) -> Option<&Value>;
14121421

@@ -1471,42 +1480,64 @@ extern "C" {
14711480

14721481
pub fn LLVMRustOpenArchive(path: *const c_char) -> Option<&'static mut Archive>;
14731482
pub fn LLVMRustArchiveIteratorNew(AR: &'a Archive) -> &'a mut ArchiveIterator<'a>;
1474-
pub fn LLVMRustArchiveIteratorNext(AIR: &ArchiveIterator) -> ArchiveChildRef;
1475-
pub fn LLVMRustArchiveChildName(ACR: ArchiveChildRef, size: &mut size_t) -> *const c_char;
1476-
pub fn LLVMRustArchiveChildData(ACR: ArchiveChildRef, size: &mut size_t) -> *const c_char;
1477-
pub fn LLVMRustArchiveChildFree(ACR: ArchiveChildRef);
1483+
pub fn LLVMRustArchiveIteratorNext(AIR: &ArchiveIterator<'a>) -> Option<&'a mut ArchiveChild<'a>>;
1484+
pub fn LLVMRustArchiveChildName(ACR: &ArchiveChild, size: &mut size_t) -> *const c_char;
1485+
pub fn LLVMRustArchiveChildData(ACR: &ArchiveChild, size: &mut size_t) -> *const c_char;
1486+
pub fn LLVMRustArchiveChildFree(ACR: &'a mut ArchiveChild<'a>);
14781487
pub fn LLVMRustArchiveIteratorFree(AIR: &'a mut ArchiveIterator<'a>);
14791488
pub fn LLVMRustDestroyArchive(AR: &'static mut Archive);
14801489

14811490
pub fn LLVMRustGetSectionName(SI: &SectionIterator, data: &mut *const c_char) -> size_t;
1491+
}
14821492

1493+
#[allow(improper_ctypes)] // FIXME(#52456) needed for RustString.
1494+
extern "C" {
14831495
pub fn LLVMRustWriteTwineToString(T: &Twine, s: &RustString);
1496+
}
14841497

1498+
extern "C" {
14851499
pub fn LLVMContextSetDiagnosticHandler(C: &Context,
14861500
Handler: DiagnosticHandler,
14871501
DiagnosticContext: *mut c_void);
1502+
}
14881503

1504+
#[allow(improper_ctypes)] // FIXME(#52456) needed for RustString.
1505+
extern "C" {
14891506
pub fn LLVMRustUnpackOptimizationDiagnostic(DI: &'a DiagnosticInfo,
14901507
pass_name_out: &RustString,
14911508
function_out: &mut Option<&'a Value>,
14921509
loc_line_out: &mut c_uint,
14931510
loc_column_out: &mut c_uint,
14941511
loc_filename_out: &RustString,
14951512
message_out: &RustString);
1513+
}
1514+
1515+
extern "C" {
14961516
pub fn LLVMRustUnpackInlineAsmDiagnostic(DI: &'a DiagnosticInfo,
14971517
cookie_out: &mut c_uint,
14981518
message_out: &mut Option<&'a Twine>,
14991519
instruction_out: &mut Option<&'a Value>);
1520+
}
15001521

1522+
#[allow(improper_ctypes)] // FIXME(#52456) needed for RustString.
1523+
extern "C" {
15011524
pub fn LLVMRustWriteDiagnosticInfoToString(DI: &DiagnosticInfo, s: &RustString);
1525+
}
1526+
1527+
extern "C" {
15021528
pub fn LLVMRustGetDiagInfoKind(DI: &DiagnosticInfo) -> DiagnosticKind;
15031529

15041530
pub fn LLVMRustSetInlineAsmDiagnosticHandler(C: &Context,
15051531
H: InlineAsmDiagHandler,
15061532
CX: *mut c_void);
1533+
}
15071534

1535+
#[allow(improper_ctypes)] // FIXME(#52456) needed for RustString.
1536+
extern "C" {
15081537
pub fn LLVMRustWriteSMDiagnosticToString(d: &SMDiagnostic, s: &RustString);
1538+
}
15091539

1540+
extern "C" {
15101541
pub fn LLVMRustWriteArchive(Dst: *const c_char,
15111542
NumMembers: size_t,
15121543
Members: *const RustArchiveMemberRef,
@@ -1515,7 +1546,7 @@ extern "C" {
15151546
-> LLVMRustResult;
15161547
pub fn LLVMRustArchiveMemberNew(Filename: *const c_char,
15171548
Name: *const c_char,
1518-
Child: Option<NonNull<ArchiveChild>>)
1549+
Child: Option<&ArchiveChild>)
15191550
-> RustArchiveMemberRef;
15201551
pub fn LLVMRustArchiveMemberFree(Member: RustArchiveMemberRef);
15211552

0 commit comments

Comments
 (0)