Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -56,18 +56,18 @@ dependencies = [

[[package]]
name = "gccjit"
version = "2.10.0"
version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60362e038e71e4bdc1a5b23fb45e1aba587b5947fe0db58f4871d95608f89eca"
checksum = "9a1d137657dee9b660e884dc11d41efbff8201aa49f9f75f7bc7d400ad1e9062"
dependencies = [
"gccjit_sys",
]

[[package]]
name = "gccjit_sys"
version = "0.9.0"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddd542c8414e122217551c6af6b7d33acf51a227aee85276f218c087525e01bb"
checksum = "dde7e9f1ec00279a8e901f30567f97ab7536b544b70cc1f79833f35caeed877a"
dependencies = [
"libc",
]
Expand Down
6 changes: 3 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ default = ["master"]
[dependencies]
object = { version = "0.37.0", default-features = false, features = ["std", "read"] }
tempfile = "3.20"
gccjit = "2.10"
#gccjit = { git = "https://github.com/rust-lang/gccjit.rs" }
gccjit = { version = "3.1", features = ["dlopen"] }
#gccjit = { git = "https://github.com/rust-lang/gccjit.rs", branch = "error-dlopen", features = ["dlopen"] }

# Local copy.
#gccjit = { path = "../gccjit.rs" }
#gccjit = { path = "../gccjit.rs", features = ["dlopen"] }

[dev-dependencies]
boml = "0.3.1"
Expand Down
2 changes: 1 addition & 1 deletion libgccjit.version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
28b84db392ac0a572f1a2a2a1317aa5f2bc742cb
0081ca6631abdfa02bf42bc85aaf507b8a0e6beb
45 changes: 37 additions & 8 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ mod type_;
mod type_of;

use std::any::Any;
use std::ffi::CString;
use std::fmt::Debug;
use std::ops::Deref;
use std::path::PathBuf;
Expand Down Expand Up @@ -142,7 +143,7 @@ impl TargetInfo {

#[derive(Clone)]
pub struct LockedTargetInfo {
info: Arc<Mutex<IntoDynSyncSend<TargetInfo>>>,
info: Arc<Mutex<IntoDynSyncSend<Option<TargetInfo>>>>,
}

impl Debug for LockedTargetInfo {
Expand All @@ -153,11 +154,21 @@ impl Debug for LockedTargetInfo {

impl LockedTargetInfo {
fn cpu_supports(&self, feature: &str) -> bool {
self.info.lock().expect("lock").cpu_supports(feature)
self.info
.lock()
.expect("lock")
.as_ref()
.expect("target info not initialized")
.cpu_supports(feature)
}

fn supports_target_dependent_type(&self, typ: CType) -> bool {
self.info.lock().expect("lock").supports_target_dependent_type(typ)
self.info
.lock()
.expect("lock")
.as_ref()
.expect("target info not initialized")
.supports_target_dependent_type(typ)
}
}

Expand All @@ -169,6 +180,19 @@ pub struct GccCodegenBackend {

static LTO_SUPPORTED: AtomicBool = AtomicBool::new(false);

fn load_libgccjit_if_needed() {
if gccjit::is_loaded() {
// Do not load a libgccjit second time.
return;
}

let string = CString::new("libgccjit.so").expect("string to libgccjit path");

if let Err(error) = gccjit::load(&string) {
panic!("Cannot load libgccjit.so: {}", error);
}
}

impl CodegenBackend for GccCodegenBackend {
fn locale_resource(&self) -> &'static str {
crate::DEFAULT_LOCALE_RESOURCE
Expand All @@ -179,6 +203,8 @@ impl CodegenBackend for GccCodegenBackend {
}

fn init(&self, _sess: &Session) {
load_libgccjit_if_needed();

#[cfg(feature = "master")]
{
let target_cpu = target_cpu(_sess);
Expand All @@ -189,7 +215,8 @@ impl CodegenBackend for GccCodegenBackend {
context.add_command_line_option(format!("-march={}", target_cpu));
}

**self.target_info.info.lock().expect("lock") = context.get_target_info();
*self.target_info.info.lock().expect("lock") =
IntoDynSyncSend(Some(context.get_target_info()));
}

#[cfg(feature = "master")]
Expand Down Expand Up @@ -217,6 +244,9 @@ impl CodegenBackend for GccCodegenBackend {
.info
.lock()
.expect("lock")
.0
.as_ref()
.expect("target info not initialized")
.supports_128bit_integers
.store(check_context.get_last_error() == Ok(None), Ordering::SeqCst);
}
Expand Down Expand Up @@ -438,13 +468,12 @@ pub fn __rustc_codegen_backend() -> Box<dyn CodegenBackend> {
let info = {
// Check whether the target supports 128-bit integers, and sized floating point types (like
// Float16).
let context = Context::default();
Arc::new(Mutex::new(IntoDynSyncSend(context.get_target_info())))
Arc::new(Mutex::new(IntoDynSyncSend(None)))
};
#[cfg(not(feature = "master"))]
let info = Arc::new(Mutex::new(IntoDynSyncSend(TargetInfo {
let info = Arc::new(Mutex::new(IntoDynSyncSend(Some(TargetInfo {
supports_128bit_integers: AtomicBool::new(false),
})));
}))));

Box::new(GccCodegenBackend {
lto_supported: Arc::new(AtomicBool::new(false)),
Expand Down